From 7f8a8485b5b2d24f20355cbc17d6d57e7cc62a29 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Wed, 30 Mar 2022 19:10:55 +0300 Subject: [PATCH 01/67] Circleci project setup (#1) * Added .circleci/config.yml --- .circleci/config.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..153b55131 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,29 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/2.0/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/2.0/configuration-reference/#jobs +jobs: + cargo-test: + # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor + docker: + - image: cimg/rust:1.59.0 + # Add steps to the job + # See: https://circleci.com/docs/2.0/configuration-reference/#steps + steps: + - checkout + - run: + name: "cargo test" + command: | + cargo version; + cargo test; + + +# Invoke jobs via workflows +# See: https://circleci.com/docs/2.0/configuration-reference/#workflows +workflows: + build-and-test: + jobs: + - cargo-test From 1328c622abe164adb12f93d528576e0c6504f78a Mon Sep 17 00:00:00 2001 From: Daniel Benarroch Date: Tue, 14 Jun 2022 17:33:34 +0200 Subject: [PATCH 02/67] issuer keys implementation (#5) Implements the issuer keys as IssuerAuthorizingKey -> isk IssuerVerifyingKey -> ik Test vectors generated with zcash_test_vectors repo --- src/keys.rs | 113 ++++++++++++++++++++++++++++++++++----- src/spec/prf_expand.rs | 2 + src/test_vectors/keys.rs | 102 +++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 12 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index a7856f915..16c63b42e 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -18,7 +18,7 @@ use zcash_note_encryption::EphemeralKeyBytes; use crate::{ address::Address, - primitives::redpallas::{self, SpendAuth}, + primitives::redpallas::{self, SpendAuth, VerificationKey}, spec::{ commit_ivk, diversify_hash, extract_p, ka_orchard, ka_orchard_prepared, prf_nf, to_base, to_scalar, NonIdentityPallasPoint, NonZeroPallasBase, NonZeroPallasScalar, @@ -189,21 +189,104 @@ impl SpendValidatingKey { pub(crate) fn from_bytes(bytes: &[u8]) -> Option { <[u8; 32]>::try_from(bytes) .ok() - .and_then(|b| { - // Structural validity checks for ak_P: - // - The point must not be the identity - // (which for Pallas is canonically encoded as all-zeroes). - // - The sign of the y-coordinate must be positive. - if b != [0; 32] && b[31] & 0x80 == 0 { - >::try_from(b).ok() - } else { - None - } - }) + .and_then(check_structural_validity) .map(SpendValidatingKey) } } +/// An issuer authorizing key, used to create issuer authorization signatures. +/// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. +/// +/// $\mathsf{isk}$ as defined in +/// [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// +/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +#[derive(Clone, Debug)] +pub struct IssuerAuthorizingKey(redpallas::SigningKey); + +impl IssuerAuthorizingKey { + /// Derives isk from sk. Internal use only, does not enforce all constraints. + fn derive_inner(sk: &SpendingKey) -> pallas::Scalar { + to_scalar(PrfExpand::ZsaIsk.expand(&sk.0)) + } +} + +impl From<&SpendingKey> for IssuerAuthorizingKey { + fn from(sk: &SpendingKey) -> Self { + let isk = Self::derive_inner(sk); + // IssuerSigningKey cannot be constructed such that this assertion would fail. + assert!(!bool::from(isk.is_zero())); + let ret = IssuerAuthorizingKey(isk.to_repr().try_into().unwrap()); + // If the last bit of repr_P(ik) is 1, negate isk. + if (<[u8; 32]>::from(IssuerValidatingKey::from(&ret).0)[31] >> 7) == 1 { + IssuerAuthorizingKey((-isk).to_repr().try_into().unwrap()) + } else { + ret + } + } +} + +/// A key used to validate issuer authorization signatures. +/// +/// Defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// Note that this is $\mathsf{ik}^\mathbb{P}$, which by construction is equivalent to +/// $\mathsf{ik}$ but stored here as a RedPallas verification key. +/// +/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +#[derive(Debug, Clone, PartialOrd, Ord)] +pub struct IssuerValidatingKey(redpallas::VerificationKey); +impl From<&IssuerAuthorizingKey> for IssuerValidatingKey { + fn from(isk: &IssuerAuthorizingKey) -> Self { + IssuerValidatingKey((&isk.0).into()) + } +} + +impl From<&IssuerValidatingKey> for pallas::Point { + fn from(issuer_validating_key: &IssuerValidatingKey) -> pallas::Point { + pallas::Point::from_bytes(&(&issuer_validating_key.0).into()).unwrap() + } +} + +impl PartialEq for IssuerValidatingKey { + fn eq(&self, other: &Self) -> bool { + <[u8; 32]>::from(&self.0).eq(&<[u8; 32]>::from(&other.0)) + } +} + +impl Eq for IssuerValidatingKey {} + +impl IssuerValidatingKey { + /// Converts this spend validating key to its serialized form, + /// I2LEOSP_256(ik). + pub(crate) fn to_bytes(&self) -> [u8; 32] { + // This is correct because the wrapped point must have ỹ = 0, and + // so the point repr is the same as I2LEOSP of its x-coordinate. + <[u8; 32]>::from(&self.0) + } + + pub(crate) fn from_bytes(bytes: &[u8]) -> Option { + <[u8; 32]>::try_from(bytes) + .ok() + .and_then(check_structural_validity) + .map(IssuerValidatingKey) + } +} + +/// A function to check structural validity of the validating keys for authorizing transfers and +/// issuing assets +/// Structural validity checks for ik_P: +/// - The point must not be the identity (which for Pallas is canonically encoded as all-zeroes). +/// - The sign of the y-coordinate must be positive. +fn check_structural_validity( + verification_key_bytes: [u8; 32], +) -> Option> { + if verification_key_bytes != [0; 32] && verification_key_bytes[31] & 0x80 == 0 { + >::try_from(verification_key_bytes).ok() + } else { + None + } +} + /// A key used to derive [`Nullifier`]s from [`Note`]s. /// /// $\mathsf{nk}$ as defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. @@ -1060,9 +1143,15 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); + let isk: IssuerAuthorizingKey = (&sk).into(); + assert_eq!(<[u8; 32]>::from(&isk.0), tv.isk); + let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); + let ik: IssuerValidatingKey = (&isk).into(); + assert_eq!(<[u8; 32]>::from(ik.0), tv.ik); + let nk: NullifierDerivingKey = (&sk).into(); assert_eq!(nk.0.to_repr(), tv.nk); diff --git a/src/spec/prf_expand.rs b/src/spec/prf_expand.rs index e2f95e7ff..fa7881889 100644 --- a/src/spec/prf_expand.rs +++ b/src/spec/prf_expand.rs @@ -10,6 +10,7 @@ pub(crate) enum PrfExpand { OrchardNk, OrchardRivk, Psi, + ZsaIsk, OrchardZip32Child, OrchardDkOvk, OrchardRivkInternal, @@ -24,6 +25,7 @@ impl PrfExpand { Self::OrchardNk => 0x07, Self::OrchardRivk => 0x08, Self::Psi => 0x09, + Self::ZsaIsk => 0x0a, Self::OrchardZip32Child => 0x81, Self::OrchardDkOvk => 0x82, Self::OrchardRivkInternal => 0x83, diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 39d7dc00d..35cc1acbf 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -4,6 +4,8 @@ pub(crate) struct TestVector { pub(crate) sk: [u8; 32], pub(crate) ask: [u8; 32], pub(crate) ak: [u8; 32], + pub(crate) isk: [u8; 32], + pub(crate) ik: [u8; 32], pub(crate) nk: [u8; 32], pub(crate) rivk: [u8; 32], pub(crate) ivk: [u8; 32], @@ -41,6 +43,16 @@ pub(crate) fn test_vectors() -> Vec { 0x12, 0x8b, 0x9a, 0x14, 0x0d, 0x5e, 0x07, 0xc1, 0x51, 0x72, 0x1d, 0xc1, 0x6d, 0x25, 0xd4, 0xe2, 0x0f, 0x15, ], + isk: [ + 0x95, 0x4a, 0x86, 0xc7, 0xa7, 0x15, 0x53, 0xfa, 0x6c, 0x8b, 0x67, 0x58, 0x54, 0x26, + 0x8e, 0xa5, 0x4c, 0x51, 0xfb, 0x17, 0xd8, 0x3d, 0x80, 0xee, 0x71, 0xd4, 0xae, 0x42, + 0xa1, 0xf8, 0xc8, 0x16, + ], + ik: [ + 0x2e, 0x4f, 0xd4, 0xa6, 0xec, 0x39, 0x94, 0x87, 0xd3, 0x78, 0xb4, 0xc7, 0x25, 0xfb, + 0x9b, 0xaf, 0xbc, 0x01, 0xa5, 0xe2, 0xb7, 0xf3, 0x68, 0x2e, 0xf4, 0x53, 0x95, 0x91, + 0xbc, 0xf0, 0x59, 0x02, + ], nk: [ 0x9f, 0x2f, 0x82, 0x67, 0x38, 0x94, 0x5a, 0xd0, 0x1f, 0x47, 0xf7, 0x0d, 0xb0, 0xc3, 0x67, 0xc2, 0x46, 0xc2, 0x0c, 0x61, 0xff, 0x55, 0x83, 0x94, 0x8c, 0x39, 0xde, 0xa9, @@ -132,6 +144,16 @@ pub(crate) fn test_vectors() -> Vec { 0x2a, 0xd6, 0x43, 0x23, 0x62, 0x9c, 0xfe, 0xd1, 0xe3, 0xaa, 0x24, 0xef, 0x05, 0x2f, 0x56, 0xe4, 0x00, 0x2a, ], + isk: [ + 0xee, 0xf5, 0xe9, 0x1b, 0x36, 0xb8, 0x06, 0x86, 0x72, 0x3d, 0x14, 0xdc, 0xc7, 0x04, + 0xad, 0x59, 0x67, 0x08, 0x0b, 0x7d, 0x6e, 0x49, 0xaf, 0x97, 0x03, 0x0e, 0x4f, 0xa0, + 0xbf, 0x5a, 0xd9, 0x0b, + ], + ik: [ + 0x2e, 0xde, 0xfb, 0x15, 0x8e, 0xa4, 0x48, 0x82, 0x57, 0x2b, 0xcd, 0xb2, 0x35, 0xca, + 0x36, 0xab, 0x39, 0xc7, 0x47, 0xbb, 0x71, 0xfe, 0x0f, 0x10, 0xfa, 0xa3, 0x9b, 0xfd, + 0x62, 0x0a, 0xcc, 0x04, + ], nk: [ 0xa8, 0xb7, 0x3d, 0x97, 0x9b, 0x6e, 0xaa, 0xda, 0x89, 0x24, 0xbc, 0xbd, 0xc6, 0x3a, 0x9e, 0xf4, 0xe8, 0x73, 0x46, 0xf2, 0x30, 0xab, 0xa6, 0xbb, 0xe1, 0xe2, 0xb4, 0x3c, @@ -223,6 +245,16 @@ pub(crate) fn test_vectors() -> Vec { 0xed, 0xb4, 0x26, 0x65, 0x7b, 0x2d, 0x07, 0x40, 0x66, 0x64, 0xd8, 0x95, 0x31, 0x2e, 0xa1, 0xc3, 0xb3, 0x34, ], + isk: [ + 0x5b, 0x1f, 0xc4, 0x57, 0xae, 0x71, 0x38, 0x3c, 0x53, 0xf4, 0x69, 0x41, 0xb7, 0xcb, + 0x4c, 0xec, 0x3d, 0xea, 0xc0, 0xc6, 0x03, 0xe2, 0xcd, 0xd0, 0xd1, 0x8d, 0x94, 0x01, + 0x9e, 0x43, 0xe2, 0x07, + ], + ik: [ + 0x4f, 0x43, 0xeb, 0x7d, 0x9e, 0x03, 0x6f, 0xa6, 0x15, 0xfd, 0x04, 0xa5, 0xef, 0x6a, + 0xeb, 0x21, 0x6e, 0x06, 0x9b, 0xe9, 0x2d, 0x30, 0xe8, 0xf7, 0x16, 0x3e, 0xe3, 0x15, + 0x11, 0x6f, 0x18, 0x32, + ], nk: [ 0x04, 0x51, 0x4e, 0xa0, 0x48, 0xb9, 0x43, 0x63, 0xde, 0xa7, 0xcb, 0x3b, 0xe8, 0xd6, 0x25, 0x82, 0xac, 0x52, 0x92, 0x2e, 0x08, 0x65, 0xf6, 0x62, 0x74, 0x3b, 0x05, 0xea, @@ -314,6 +346,16 @@ pub(crate) fn test_vectors() -> Vec { 0xe7, 0x2c, 0x3b, 0x64, 0x00, 0x06, 0xff, 0x08, 0x50, 0x52, 0x80, 0xe4, 0xf0, 0x0f, 0xad, 0xf7, 0x63, 0x28, ], + isk: [ + 0x71, 0xd0, 0x64, 0xaa, 0xa0, 0x82, 0x63, 0xb8, 0xe4, 0xc3, 0xed, 0x70, 0x3c, 0x6f, + 0x54, 0x25, 0x4a, 0x88, 0x8c, 0x36, 0xec, 0x69, 0x86, 0x62, 0xf7, 0x1f, 0xbb, 0xf4, + 0x26, 0xd9, 0x09, 0x28, + ], + ik: [ + 0x12, 0xb3, 0xab, 0xff, 0x96, 0x75, 0x20, 0x9e, 0x94, 0x54, 0x07, 0x0c, 0x14, 0xac, + 0x15, 0x54, 0x65, 0xae, 0x83, 0xbe, 0x2c, 0x39, 0x46, 0x63, 0x5e, 0x38, 0x77, 0xba, + 0x67, 0xdf, 0x49, 0x12, + ], nk: [ 0xcf, 0x36, 0xad, 0x6a, 0x06, 0x6c, 0xd2, 0x13, 0xe1, 0xd7, 0x67, 0xab, 0x07, 0x1d, 0xc1, 0x16, 0x78, 0x85, 0xc4, 0x16, 0x8b, 0xc2, 0xe2, 0x17, 0x54, 0x48, 0x56, 0x3a, @@ -405,6 +447,16 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0x6d, 0x83, 0x20, 0x09, 0xf7, 0x24, 0x2e, 0x1f, 0x7c, 0x77, 0x0a, 0x12, 0x24, 0x1d, 0xfa, 0x28, 0x07, ], + isk: [ + 0x44, 0x36, 0x1a, 0x7b, 0xa6, 0xa1, 0xaa, 0x17, 0x8e, 0x72, 0xaf, 0x47, 0xbd, 0xc1, + 0x60, 0x40, 0xce, 0x1c, 0x54, 0xdd, 0x4b, 0x56, 0x33, 0x21, 0x55, 0xba, 0x9d, 0x04, + 0x09, 0x71, 0xd0, 0x07, + ], + ik: [ + 0x1f, 0x17, 0x2d, 0x79, 0xae, 0xdc, 0xc2, 0x06, 0x8c, 0x3a, 0x09, 0x08, 0x93, 0xe1, + 0xa1, 0x75, 0xd9, 0xb5, 0x78, 0xf8, 0x91, 0xaf, 0x9a, 0xb6, 0x8d, 0x4f, 0xe1, 0xe9, + 0x05, 0xa3, 0xb2, 0x11, + ], nk: [ 0x51, 0xba, 0xf3, 0x33, 0xcf, 0xf1, 0xf2, 0xd0, 0xc7, 0xe3, 0xcf, 0xf4, 0xd3, 0x01, 0x29, 0x9d, 0xc1, 0xef, 0xe9, 0x83, 0x00, 0x31, 0x4a, 0x54, 0x19, 0x38, 0x02, 0x9b, @@ -496,6 +548,16 @@ pub(crate) fn test_vectors() -> Vec { 0xdf, 0x28, 0xbb, 0x0f, 0x10, 0x21, 0xea, 0x84, 0x3f, 0x86, 0x7f, 0x8a, 0x17, 0x0f, 0x5c, 0x33, 0x90, 0x1f, ], + isk: [ + 0xdc, 0x93, 0x72, 0x9f, 0x3f, 0x28, 0x30, 0xed, 0x79, 0x1c, 0x21, 0xbe, 0xbe, 0x45, + 0x0f, 0xcf, 0x1f, 0x8f, 0xef, 0x49, 0x81, 0x39, 0xc7, 0x99, 0xd1, 0x63, 0x66, 0x5a, + 0x8c, 0x51, 0xe5, 0x2d, + ], + ik: [ + 0x1d, 0xb6, 0x1c, 0x29, 0x3e, 0x3a, 0x93, 0x34, 0x5d, 0x06, 0xb9, 0x0b, 0xd7, 0x1f, + 0xd3, 0x21, 0x5c, 0x2c, 0x1c, 0x29, 0x53, 0x5a, 0x10, 0xde, 0x9d, 0x31, 0x40, 0xb7, + 0x4d, 0xb6, 0x1d, 0x07, + ], nk: [ 0x9e, 0x99, 0x7d, 0x9d, 0x26, 0x97, 0x87, 0x26, 0x8e, 0x09, 0x2a, 0x7c, 0x85, 0x41, 0x7d, 0xa5, 0x30, 0xea, 0x42, 0xfa, 0xc6, 0x68, 0xa7, 0x49, 0xaf, 0x55, 0xdf, 0xb7, @@ -587,6 +649,16 @@ pub(crate) fn test_vectors() -> Vec { 0x65, 0x43, 0x46, 0x2a, 0x13, 0x7f, 0xfe, 0xa3, 0x7b, 0xaf, 0x41, 0xef, 0x28, 0x6b, 0xb7, 0x32, 0xbe, 0x2c, ], + isk: [ + 0xf2, 0x34, 0x52, 0x32, 0xc9, 0x19, 0xc1, 0x29, 0xe0, 0x4b, 0x0c, 0x46, 0xac, 0x2c, + 0xa8, 0x50, 0x65, 0xd9, 0x54, 0x85, 0xb9, 0x02, 0xab, 0x0f, 0x98, 0xf9, 0x3a, 0xee, + 0x59, 0x4b, 0x5f, 0x02, + ], + ik: [ + 0x2c, 0x83, 0xd9, 0x20, 0xe9, 0xf6, 0x6d, 0xa5, 0x04, 0x86, 0x37, 0xad, 0x9a, 0xa2, + 0xcc, 0xe6, 0xe1, 0x6e, 0xf4, 0x8f, 0x86, 0x50, 0xea, 0x00, 0xd8, 0xc2, 0xd7, 0x68, + 0x61, 0x8a, 0xe3, 0x36, + ], nk: [ 0xfd, 0x31, 0x64, 0xc6, 0x32, 0xbe, 0xc9, 0x4c, 0xe9, 0xfb, 0x2f, 0x30, 0x22, 0x63, 0xb8, 0x84, 0xab, 0xb9, 0xc1, 0x0e, 0x55, 0xe4, 0x48, 0x64, 0x7f, 0x67, 0x98, 0x49, @@ -678,6 +750,16 @@ pub(crate) fn test_vectors() -> Vec { 0xb3, 0x65, 0x1f, 0xfa, 0x1c, 0x69, 0x69, 0x15, 0xac, 0x00, 0xa2, 0x5e, 0xa3, 0xac, 0x7d, 0xff, 0x99, 0x01, ], + isk: [ + 0x3d, 0xa9, 0x08, 0x88, 0xba, 0x18, 0x24, 0xc8, 0x16, 0x29, 0x2d, 0x7f, 0x17, 0x33, + 0xac, 0x4c, 0xbe, 0x72, 0x2c, 0x6a, 0x12, 0x1c, 0xc7, 0x80, 0x17, 0x06, 0x26, 0xb7, + 0x0a, 0x26, 0x95, 0x28, + ], + ik: [ + 0x16, 0xa8, 0xff, 0x29, 0xb5, 0x17, 0xb5, 0xa8, 0xf7, 0xd0, 0x9b, 0x4e, 0x5e, 0x71, + 0x3a, 0x9a, 0x78, 0x4c, 0x74, 0x04, 0xd6, 0x1e, 0x3a, 0xf5, 0x30, 0x19, 0xc3, 0x47, + 0x0e, 0x90, 0x95, 0x22, + ], nk: [ 0x02, 0xab, 0x99, 0x5c, 0xe9, 0x8f, 0x63, 0x02, 0x5f, 0xb6, 0x24, 0x28, 0xa0, 0xfb, 0xf5, 0x2f, 0x25, 0x22, 0xe6, 0xa2, 0x72, 0x61, 0x07, 0x8a, 0x9f, 0x4d, 0x6a, 0x36, @@ -769,6 +851,16 @@ pub(crate) fn test_vectors() -> Vec { 0x3b, 0x02, 0xd2, 0x5c, 0xc1, 0x0c, 0x90, 0x71, 0xfc, 0x02, 0x19, 0xe9, 0x7f, 0x93, 0x92, 0xd0, 0x67, 0x0c, ], + isk: [ + 0x01, 0x65, 0x33, 0x68, 0x4f, 0xb9, 0x81, 0x15, 0xa4, 0x05, 0xc9, 0xc7, 0xad, 0x47, + 0x72, 0x76, 0xab, 0x7c, 0x72, 0xfd, 0x67, 0x1a, 0x27, 0xe3, 0x6c, 0x0a, 0x7a, 0xbe, + 0x0a, 0x76, 0x90, 0x09, + ], + ik: [ + 0xff, 0xd7, 0x5f, 0x6f, 0x9e, 0xf4, 0x27, 0xf3, 0x26, 0xcd, 0xbf, 0x3a, 0x98, 0xbc, + 0xb5, 0x93, 0x63, 0x5a, 0x2c, 0x1a, 0xd7, 0x2b, 0x39, 0x99, 0x12, 0x61, 0xe2, 0x75, + 0xa9, 0xec, 0x6f, 0x10, + ], nk: [ 0x25, 0x91, 0xed, 0xf7, 0xef, 0x4c, 0xf2, 0x18, 0x4c, 0x34, 0xbe, 0x93, 0xfc, 0xf6, 0x12, 0x91, 0x50, 0x42, 0xf1, 0x5a, 0xb5, 0x08, 0x4b, 0x14, 0xe1, 0x66, 0x79, 0x5b, @@ -860,6 +952,16 @@ pub(crate) fn test_vectors() -> Vec { 0x8d, 0x4b, 0x02, 0x5f, 0x8c, 0xc1, 0x60, 0xe1, 0xf4, 0xe9, 0x5f, 0x0a, 0x85, 0x3e, 0xbc, 0x41, 0x6a, 0x2b, ], + isk: [ + 0x76, 0x08, 0x32, 0x9d, 0xfa, 0x77, 0xc4, 0x2c, 0x4f, 0xc7, 0x6a, 0xc2, 0x95, 0x94, + 0xa2, 0x72, 0x83, 0x93, 0x4f, 0x5a, 0x93, 0x40, 0x71, 0xb9, 0xf8, 0xcd, 0x34, 0x4e, + 0x1f, 0x98, 0x45, 0x0e, + ], + ik: [ + 0x72, 0xa0, 0xac, 0x97, 0x8a, 0x2d, 0xa1, 0x61, 0xf4, 0x1f, 0x5b, 0x7a, 0x40, 0xbd, + 0x83, 0xc0, 0x58, 0x41, 0xf8, 0x1b, 0xc5, 0x11, 0x40, 0x67, 0xb8, 0x85, 0x98, 0x7f, + 0x48, 0xca, 0x52, 0x2d, + ], nk: [ 0x3e, 0x88, 0xf2, 0x07, 0x1f, 0xd9, 0xa2, 0xbb, 0x26, 0xcd, 0xa2, 0xea, 0x85, 0x6a, 0xa0, 0xfb, 0x3a, 0x80, 0xa8, 0x7d, 0x2f, 0xb6, 0x13, 0x6f, 0xab, 0x85, 0xe3, 0x6c, From e6b776295a0dc4505ac27981cc3cacc416186917 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Tue, 14 Jun 2022 21:23:03 +0300 Subject: [PATCH 03/67] Added NoteType to Notes (#2) * Added NoteType to Notes * Added NoteType to value commitment derivation --- .circleci/config.yml | 15 ++++++- src/action.rs | 7 +++- src/builder.rs | 18 +++++++-- src/bundle.rs | 2 + src/circuit.rs | 3 +- src/constants/fixed_bases.rs | 4 ++ src/keys.rs | 2 + src/note.rs | 19 ++++++++- src/note/note_type.rs | 77 ++++++++++++++++++++++++++++++++++++ src/note_encryption.rs | 8 +++- src/value.rs | 66 ++++++++++++++++++------------- 11 files changed, 182 insertions(+), 39 deletions(-) create mode 100644 src/note/note_type.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 153b55131..ba37a7890 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,9 @@ # See: https://circleci.com/docs/2.0/configuration-reference version: 2.1 +orbs: + slack: circleci/slack@4.1 + # Define a job to be invoked later in a workflow. # See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: @@ -17,8 +20,15 @@ jobs: - run: name: "cargo test" command: | + sudo apt update && sudo apt-get install libfontconfig libfontconfig1-dev libfreetype6-dev; cargo version; - cargo test; + cargo test --all --all-features; + - slack/notify: + event: fail + template: basic_fail_1 + - slack/notify: + event: pass + template: basic_success_1 # Invoke jobs via workflows @@ -26,4 +36,5 @@ jobs: workflows: build-and-test: jobs: - - cargo-test + - cargo-test: + context: CI-Orchard-slack diff --git a/src/action.rs b/src/action.rs index d0b73f23e..b6396ed91 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,6 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; + use crate::note::NoteType; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -150,7 +151,8 @@ pub(crate) mod testing { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + NoteType::native() ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { @@ -181,7 +183,8 @@ pub(crate) mod testing { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + NoteType::native() ); // FIXME: make a real one from the note. diff --git a/src/builder.rs b/src/builder.rs index 9cbc2a5fb..1a7ccbec1 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -8,6 +8,7 @@ use nonempty::NonEmpty; use pasta_curves::pallas; use rand::{prelude::SliceRandom, CryptoRng, RngCore}; +use crate::note::NoteType; use crate::{ action::Action, address::Address, @@ -160,14 +161,21 @@ impl ActionInfo { /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { let v_net = self.value_sum(); - let cv_net = ValueCommitment::derive(v_net, self.rcv.clone()); + let cv_net = ValueCommitment::derive(v_net, self.rcv, NoteType::native()); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let ak: SpendValidatingKey = self.spend.fvk.clone().into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); + let note_type = self.spend.note.note_type(); - let note = Note::new(self.output.recipient, self.output.value, nf_old, &mut rng); + let note = Note::new( + self.output.recipient, + self.output.value, + note_type, + nf_old, + &mut rng, + ); let cm_new = note.commitment(); let cmx = cm_new.into(); @@ -387,7 +395,11 @@ impl Builder { // Verify that bsk and bvk are consistent. let bvk = (actions.iter().map(|a| a.cv_net()).sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) + - ValueCommitment::derive( + value_balance, + ValueCommitTrapdoor::zero(), + NoteType::native(), + )) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); diff --git a/src/bundle.rs b/src/bundle.rs index 239cce7c2..4f4e1cb3f 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -12,6 +12,7 @@ use memuse::DynamicUsage; use nonempty::NonEmpty; use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; +use crate::note::NoteType; use crate::{ action::Action, address::Address, @@ -384,6 +385,7 @@ impl> Bundle { - ValueCommitment::derive( ValueSum::from_raw(self.value_balance.into()), ValueCommitTrapdoor::zero(), + NoteType::native(), )) .into_bvk() } diff --git a/src/circuit.rs b/src/circuit.rs index d349180ed..0b271d750 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -968,6 +968,7 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; + use crate::note::NoteType; use crate::{ keys::SpendValidatingKey, note::Note, @@ -991,7 +992,7 @@ mod tests { let value = spent_note.value() - output_note.value(); let rcv = ValueCommitTrapdoor::random(&mut rng); - let cv_net = ValueCommitment::derive(value, rcv.clone()); + let cv_net = ValueCommitment::derive(value, rcv, NoteType::native()); let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index af11e335f..7a86487d3 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -19,8 +19,12 @@ pub mod value_commit_v; pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; /// SWU hash-to-curve personalization for the value commitment generator +/// TODO: should we change to "NOTE_TYPE_PERSONALIZATION"? pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; +/// SWU hash-to-curve personalization for the note type generator +// pub const NOTE_TYPE_PERSONALIZATION: &str = "z.cash:Orchard-NoteType"; + /// SWU hash-to-curve value for the value commitment generator pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v"; diff --git a/src/keys.rs b/src/keys.rs index 16c63b42e..8b76c8517 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1084,6 +1084,7 @@ mod tests { testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key}, *, }; + use crate::note::NoteType; use crate::{ note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, value::NoteValue, @@ -1175,6 +1176,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), + NoteType::native(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ) diff --git a/src/note.rs b/src/note.rs index 522b137f3..31063864c 100644 --- a/src/note.rs +++ b/src/note.rs @@ -19,6 +19,9 @@ pub use self::commitment::{ExtractedNoteCommitment, NoteCommitment}; pub(crate) mod nullifier; pub use self::nullifier::Nullifier; +pub(crate) mod note_type; +pub use self::note_type::NoteType; + /// The ZIP 212 seed randomness for a note. #[derive(Copy, Clone, Debug)] pub struct RandomSeed([u8; 32]); @@ -90,6 +93,8 @@ pub struct Note { recipient: Address, /// The value of this note. value: NoteValue, + /// The type of this note. + note_type: NoteType, /// A unique creation ID for this note. /// /// This is set to the nullifier of the note that was spent in the [`Action`] that @@ -129,12 +134,14 @@ impl Note { pub fn from_parts( recipient: Address, value: NoteValue, + note_type: NoteType, rho: Nullifier, rseed: RandomSeed, ) -> CtOption { let note = Note { recipient, value, + note_type, rho, rseed, }; @@ -149,11 +156,12 @@ impl Note { pub(crate) fn new( recipient: Address, value: NoteValue, + note_type: NoteType, rho: Nullifier, mut rng: impl RngCore, ) -> Self { loop { - let note = Note::from_parts(recipient, value, rho, RandomSeed::random(&mut rng, &rho)); + let note = Note::from_parts(recipient, value, note_type, rho, RandomSeed::random(&mut rng, &rho)); if note.is_some().into() { break note.unwrap(); } @@ -176,6 +184,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), + NoteType::native(), rho.unwrap_or_else(|| Nullifier::dummy(rng)), rng, ); @@ -193,6 +202,11 @@ impl Note { self.value } + /// Returns the note type + pub fn note_type(&self) -> NoteType { + self.note_type + } + /// Returns the rseed value of this note. pub fn rseed(&self) -> &RandomSeed { &self.rseed @@ -279,6 +293,7 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; + use crate::note::note_type::testing::arb_note_type; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, }; @@ -298,10 +313,12 @@ pub mod testing { recipient in arb_address(), rho in arb_nullifier(), rseed in arb_rseed(), + note_type in arb_note_type(), ) -> Note { Note { recipient, value, + note_type, rho, rseed, } diff --git a/src/note/note_type.rs b/src/note/note_type.rs new file mode 100644 index 000000000..d0857d61a --- /dev/null +++ b/src/note/note_type.rs @@ -0,0 +1,77 @@ +use group::GroupEncoding; +use halo2_proofs::arithmetic::CurveExt; +use pasta_curves::pallas; +use subtle::CtOption; + +use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; +use crate::keys::IssuerValidatingKey; + +/// Note type identifier. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct NoteType(pub(crate) pallas::Point); + +const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; + +// the hasher used to derive the assetID +#[allow(non_snake_case)] +fn assetID_hasher(msg: Vec) -> pallas::Point { + // TODO(zsa) replace personalization, will require circuit change? + pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) +} + +impl NoteType { + /// Deserialize the note_type from a byte array. + pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { + pallas::Point::from_bytes(bytes).map(NoteType) + } + + /// Serialize the note_type to its canonical byte representation. + pub fn to_bytes(self) -> [u8; 32] { + self.0.to_bytes() + } + + /// $DeriveNoteType$. + /// + /// Defined in [Zcash Protocol Spec § TBD: Note Types][notetypes]. + /// + /// [notetypes]: https://zips.z.cash/protocol/nu5.pdf#notetypes + #[allow(non_snake_case)] + pub fn derive(ik: &IssuerValidatingKey, assetDesc: Vec) -> Self { + assert!(assetDesc.len() < MAX_ASSET_DESCRIPTION_SIZE); + + let mut s = vec![]; + s.extend(ik.to_bytes()); + s.extend(assetDesc); + + NoteType(assetID_hasher(s)) + } + + /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. + pub fn native() -> Self { + NoteType(assetID_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) + } +} + +/// Generators for property testing. +#[cfg(any(test, feature = "test-dependencies"))] +#[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] +pub mod testing { + use proptest::prelude::*; + + use super::NoteType; + + use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; + + prop_compose! { + /// Generate a uniformly distributed note type + pub fn arb_note_type()( + sk in arb_spending_key(), + bytes32a in prop::array::uniform32(prop::num::u8::ANY), + bytes32b in prop::array::uniform32(prop::num::u8::ANY), + ) -> NoteType { + let bytes64 = [bytes32a, bytes32b].concat(); + let isk = IssuerAuthorizingKey::from(&sk); + NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + } + } +} diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 8ad06c8a9..39cd318e1 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -10,6 +10,7 @@ use zcash_note_encryption::{ OUT_PLAINTEXT_SIZE, }; +use crate::note::NoteType; use crate::{ action::Action, keys::{ @@ -75,7 +76,8 @@ where let pk_d = get_validated_pk_d(&diversifier)?; let recipient = Address::from_parts(diversifier, pk_d); - let note = Option::from(Note::from_parts(recipient, value, domain.rho, rseed))?; + // TODO: add note_type + let note = Option::from(Note::from_parts(recipient, value, NoteType::native(), domain.rho, rseed))?; Some((note, recipient)) } @@ -171,6 +173,7 @@ impl Domain for OrchardDomain { np[0] = 0x02; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); + // todo: add note_type np[20..52].copy_from_slice(note.rseed().as_bytes()); np[52..].copy_from_slice(memo); NotePlaintextBytes(np) @@ -358,6 +361,7 @@ mod tests { }; use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use crate::note::NoteType; use crate::{ action::Action, keys::{ @@ -413,7 +417,7 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); - let note = Note::from_parts(recipient, value, rho, rseed).unwrap(); + let note = Note::from_parts(recipient, value, NoteType::native(), rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( diff --git a/src/value.rs b/src/value.rs index 1cef61c87..5ece74af2 100644 --- a/src/value.rs +++ b/src/value.rs @@ -52,10 +52,9 @@ use pasta_curves::{ use rand::RngCore; use subtle::CtOption; +use crate::note::NoteType; use crate::{ - constants::fixed_bases::{ - VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES, VALUE_COMMITMENT_V_BYTES, - }, + constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES}, primitives::redpallas::{self, Binding}, }; @@ -211,7 +210,7 @@ impl TryFrom for i64 { } /// The blinding factor for a [`ValueCommitment`]. -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug)] pub struct ValueCommitTrapdoor(pallas::Scalar); impl ValueCommitTrapdoor { @@ -308,9 +307,8 @@ impl ValueCommitment { /// /// [concretehomomorphiccommit]: https://zips.z.cash/protocol/nu5.pdf#concretehomomorphiccommit #[allow(non_snake_case)] - pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor) -> Self { + pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, note_type: NoteType) -> Self { let hasher = pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION); - let V = hasher(&VALUE_COMMITMENT_V_BYTES); let R = hasher(&VALUE_COMMITMENT_R_BYTES); let abs_value = u64::try_from(value.0.abs()).expect("value must be in valid range"); @@ -320,7 +318,9 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - ValueCommitment(V * value + R * rcv.0) + let V_zsa = note_type.0; + + ValueCommitment(V_zsa * value + R * rcv.0) } pub(crate) fn into_bvk(self) -> redpallas::VerificationKey { @@ -423,6 +423,8 @@ pub mod testing { #[cfg(test)] mod tests { + use crate::note::note_type::testing::arb_note_type; + use crate::note::NoteType; use proptest::prelude::*; use super::{ @@ -431,6 +433,29 @@ mod tests { }; use crate::primitives::redpallas; + fn _bsk_consistent_with_bvk(values: &[(ValueSum, ValueCommitTrapdoor)], note_type: NoteType) { + let value_balance = values + .iter() + .map(|(value, _)| value) + .sum::>() + .expect("we generate values that won't overflow"); + + let bsk = values + .iter() + .map(|(_, rcv)| rcv) + .sum::() + .into_bsk(); + + let bvk = (values + .iter() + .map(|(value, rcv)| ValueCommitment::derive(*value, *rcv, note_type)) + .sum::() + - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero(), note_type)) + .into_bvk(); + + assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + } + proptest! { #[test] fn bsk_consistent_with_bvk( @@ -438,28 +463,13 @@ mod tests { arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor()), n_values) ) - ) + ), + arb_note_type in arb_note_type(), ) { - let value_balance = values - .iter() - .map(|(value, _)| value) - .sum::>() - .expect("we generate values that won't overflow"); - - let bsk = values - .iter() - .map(|(_, rcv)| rcv) - .sum::() - .into_bsk(); - - let bvk = (values - .into_iter() - .map(|(value, rcv)| ValueCommitment::derive(value, rcv)) - .sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) - .into_bvk(); - - assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + // Test with native note type (zec) + _bsk_consistent_with_bvk(&values, NoteType::native()); + // Test with arbitrary note type + _bsk_consistent_with_bvk(&values, arb_note_type); } } } From 088abc6de6266bfafe1cd29c7a474936c20842f4 Mon Sep 17 00:00:00 2001 From: naure Date: Wed, 20 Jul 2022 13:08:58 +0200 Subject: [PATCH 04/67] ZSA note encryption in Orchard crate (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Circleci project setup (#1) * Added .circleci/config.yml * Added NoteType to Notes * reformated file * updated `derive` for NoteType * added note_type to value commit derivation * rustfmt * updated ci config * updated ci config * updated ci config * updated derive for note_type * added test for arb note_type * added test for `native` note type * zsa-note-encryption: introduce AssetType and encode and decode it in note plaintexts * zsa-note-encryption: extend the size of compact notes to include asset_type * fixed clippy warrnings * rustfmt * zsa-note-encryption: document parsing requirement * zsa-note-encryption: revert support of ZSA compact action * zsa_value: add NoteType method is_native * zsa-note-encryption: remove dependency on changes in the other crate * zsa-note-encryption: extract memo of ZSA notes * zsa-note-encryption: tests (zcash_test_vectors 77c73492) * zsa-note-encryption: simplify roundtrip test * zsa-note-encryption: more test vectors (zcash_test_vectors c10da464) * Circleci project setup (#1) * Added .circleci/config.yml * issuer keys implementation (#5) Implements the issuer keys as IssuerAuthorizingKey -> isk IssuerVerifyingKey -> ik Test vectors generated with zcash_test_vectors repo * Added NoteType to Notes (#2) * Added NoteType to Notes * Added NoteType to value commitment derivation * zsa-note-encryption: use both native and ZSA in proptests * zsa-note-encryption: test vector commit 51398c93 * zsa-note-encryption: fix after merge Co-authored-by: Paul <3682187+PaulLaux@users.noreply.github.com> Co-authored-by: Paul Co-authored-by: Aurélien Nicolas Co-authored-by: Daniel Benarroch --- .gitignore | 1 + src/constants/fixed_bases.rs | 3 + src/note.rs | 1 + src/note/commitment.rs | 54 +- src/note/note_type.rs | 29 +- src/note_encryption.rs | 140 +- src/test_vectors/note_encryption.rs | 3612 +++++++++++++++++++++------ src/value.rs | 2 +- 8 files changed, 3071 insertions(+), 771 deletions(-) diff --git a/.gitignore b/.gitignore index 173b95142..57ee1a9ad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/*.rs.bk Cargo.lock .vscode +.idea diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index 7a86487d3..bd58a90c2 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -34,6 +34,9 @@ pub const VALUE_COMMITMENT_R_BYTES: [u8; 1] = *b"r"; /// SWU hash-to-curve personalization for the note commitment generator pub const NOTE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-NoteCommit"; +/// SWU hash-to-curve personalization for the ZSA note commitment generator +pub const NOTE_ZSA_COMMITMENT_PERSONALIZATION: &str = "z.cash:ZSA-NoteCommit"; + /// SWU hash-to-curve personalization for the IVK commitment generator pub const COMMIT_IVK_PERSONALIZATION: &str = "z.cash:Orchard-CommitIvk"; diff --git a/src/note.rs b/src/note.rs index 31063864c..c2edf4988 100644 --- a/src/note.rs +++ b/src/note.rs @@ -248,6 +248,7 @@ impl Note { g_d.to_bytes(), self.recipient.pk_d().to_bytes(), self.value, + self.note_type, self.rho.0, self.rseed.psi(&self.rho), self.rseed.rcm(&self.rho), diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 9de51d28e..95dc92a2c 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -7,7 +7,11 @@ use pasta_curves::pallas; use subtle::{ConstantTimeEq, CtOption}; use crate::{ - constants::{fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, L_ORCHARD_BASE}, + constants::{ + fixed_bases::{NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION}, + L_ORCHARD_BASE, + }, + note::note_type::NoteType, spec::extract_p, value::NoteValue, }; @@ -41,22 +45,46 @@ impl NoteCommitment { g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, + note_type: NoteType, rho: pallas::Base, psi: pallas::Base, rcm: NoteCommitTrapdoor, ) -> CtOption { - let domain = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); - domain - .commit( - iter::empty() - .chain(BitArray::<_, Lsb0>::new(g_d).iter().by_vals()) - .chain(BitArray::<_, Lsb0>::new(pk_d).iter().by_vals()) - .chain(v.to_le_bits().iter().by_vals()) - .chain(rho.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE)) - .chain(psi.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE)), - &rcm.0, - ) - .map(NoteCommitment) + let g_d_bits = BitArray::<_, Lsb0>::new(g_d); + let pk_d_bits = BitArray::<_, Lsb0>::new(pk_d); + let v_bits = v.to_le_bits(); + let rho_bits = rho.to_le_bits(); + let psi_bits = psi.to_le_bits(); + + let zec_note_bits = iter::empty() + .chain(g_d_bits.iter().by_vals()) + .chain(pk_d_bits.iter().by_vals()) + .chain(v_bits.iter().by_vals()) + .chain(rho_bits.iter().by_vals().take(L_ORCHARD_BASE)) + .chain(psi_bits.iter().by_vals().take(L_ORCHARD_BASE)); + + // TODO: make this constant-time. + if note_type.is_native().into() { + // Commit to ZEC notes as per the Orchard protocol. + Self::commit(NOTE_COMMITMENT_PERSONALIZATION, zec_note_bits, rcm) + } else { + // Commit to non-ZEC notes as per the ZSA protocol. + // Append the note type to the Orchard note encoding. + let type_bits = BitArray::<_, Lsb0>::new(note_type.to_bytes()); + let zsa_note_bits = zec_note_bits.chain(type_bits.iter().by_vals()); + + // Commit in a different domain than Orchard notes. + Self::commit(NOTE_ZSA_COMMITMENT_PERSONALIZATION, zsa_note_bits, rcm) + } + } + + fn commit( + personalization: &str, + bits: impl Iterator, + rcm: NoteCommitTrapdoor, + ) -> CtOption { + let domain = sinsemilla::CommitDomain::new(personalization); + domain.commit(bits, &rcm.0).map(NoteCommitment) } } diff --git a/src/note/note_type.rs b/src/note/note_type.rs index d0857d61a..6075259e3 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -1,7 +1,7 @@ use group::GroupEncoding; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; -use subtle::CtOption; +use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; use crate::keys::IssuerValidatingKey; @@ -15,7 +15,7 @@ const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; // the hasher used to derive the assetID #[allow(non_snake_case)] fn assetID_hasher(msg: Vec) -> pallas::Point { - // TODO(zsa) replace personalization, will require circuit change? + // TODO(zsa) replace personalization pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) } @@ -50,6 +50,16 @@ impl NoteType { pub fn native() -> Self { NoteType(assetID_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) } + + /// The base point used in value commitments. + pub fn cv_base(&self) -> pallas::Point { + self.0 + } + + /// Whether this note represents a native or ZSA asset. + pub fn is_native(&self) -> Choice { + self.0.ct_eq(&Self::native().0) + } } /// Generators for property testing. @@ -58,20 +68,25 @@ impl NoteType { pub mod testing { use proptest::prelude::*; - use super::NoteType; - use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; + use super::NoteType; + prop_compose! { /// Generate a uniformly distributed note type pub fn arb_note_type()( + is_native in prop::bool::ANY, sk in arb_spending_key(), bytes32a in prop::array::uniform32(prop::num::u8::ANY), bytes32b in prop::array::uniform32(prop::num::u8::ANY), ) -> NoteType { - let bytes64 = [bytes32a, bytes32b].concat(); - let isk = IssuerAuthorizingKey::from(&sk); - NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + if is_native { + NoteType::native() + } else { + let bytes64 = [bytes32a, bytes32b].concat(); + let isk = IssuerAuthorizingKey::from(&sk); + NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + } } } } diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 39cd318e1..5d955e2cb 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -1,8 +1,7 @@ //! In-band secret distribution for Orchard bundles. -use core::fmt; - use blake2b_simd::{Hash, Params}; +use core::fmt; use group::ff::PrimeField; use zcash_note_encryption::{ BatchDomain, Domain, EphemeralKeyBytes, NotePlaintextBytes, OutPlaintextBytes, @@ -25,6 +24,15 @@ use crate::{ const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; +/// The size of the encoding of a ZSA asset type. +const ZSA_TYPE_SIZE: usize = 32; +/// The size of the ZSA variant of COMPACT_NOTE_SIZE. +const COMPACT_ZSA_NOTE_SIZE: usize = COMPACT_NOTE_SIZE + ZSA_TYPE_SIZE; +/// The size of the memo. +const MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_NOTE_SIZE; +/// The size of the ZSA variant of the memo. +const ZSA_MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_ZSA_NOTE_SIZE; + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. /// /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs @@ -50,6 +58,8 @@ pub(crate) fn prf_ock_orchard( ) } +/// Domain-specific requirements: +/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. fn orchard_parse_note_plaintext_without_memo( domain: &OrchardDomain, plaintext: &[u8], @@ -61,9 +71,8 @@ where assert!(plaintext.len() >= COMPACT_NOTE_SIZE); // Check note plaintext version - if plaintext[0] != 0x02 { - return None; - } + // and parse the asset type accordingly. + let note_type = parse_version_and_asset_type(plaintext)?; // The unwraps below are guaranteed to succeed by the assertion above let diversifier = Diversifier::from_bytes(plaintext[1..12].try_into().unwrap()); @@ -76,11 +85,25 @@ where let pk_d = get_validated_pk_d(&diversifier)?; let recipient = Address::from_parts(diversifier, pk_d); - // TODO: add note_type - let note = Option::from(Note::from_parts(recipient, value, NoteType::native(), domain.rho, rseed))?; + + let note = Option::from(Note::from_parts(recipient, value, note_type, domain.rho, rseed))?; Some((note, recipient)) } +fn parse_version_and_asset_type(plaintext: &[u8]) -> Option { + // TODO: make this constant-time? + match plaintext[0] { + 0x02 => Some(NoteType::native()), + 0x03 if plaintext.len() >= COMPACT_ZSA_NOTE_SIZE => { + let bytes = &plaintext[COMPACT_NOTE_SIZE..COMPACT_ZSA_NOTE_SIZE] + .try_into() + .unwrap(); + NoteType::from_bytes(bytes).into() + } + _ => None, + } +} + /// Orchard-specific note encryption logic. #[derive(Debug)] pub struct OrchardDomain { @@ -125,7 +148,7 @@ impl Domain for OrchardDomain { type ValueCommitment = ValueCommitment; type ExtractedCommitment = ExtractedNoteCommitment; type ExtractedCommitmentBytes = [u8; 32]; - type Memo = [u8; 512]; // TODO use a more interesting type + type Memo = [u8; MEMO_SIZE]; // TODO use a more interesting type fn derive_esk(note: &Self::Note) -> Option { Some(note.esk()) @@ -169,13 +192,23 @@ impl Domain for OrchardDomain { _: &Self::Recipient, memo: &Self::Memo, ) -> NotePlaintextBytes { + let is_native: bool = note.note_type().is_native().into(); + let mut np = [0; NOTE_PLAINTEXT_SIZE]; - np[0] = 0x02; + np[0] = if is_native { 0x02 } else { 0x03 }; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); // todo: add note_type np[20..52].copy_from_slice(note.rseed().as_bytes()); - np[52..].copy_from_slice(memo); + if is_native { + np[52..].copy_from_slice(memo); + } else { + let zsa_type = note.note_type().to_bytes(); + np[52..84].copy_from_slice(&zsa_type); + let short_memo = &memo[0..memo.len() - ZSA_TYPE_SIZE]; + np[84..].copy_from_slice(short_memo); + // TODO: handle full-size memo or make short_memo explicit. + }; NotePlaintextBytes(np) } @@ -242,9 +275,20 @@ impl Domain for OrchardDomain { } fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { - plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE] - .try_into() - .unwrap() + let mut memo = [0; MEMO_SIZE]; + match get_note_version(plaintext) { + 0x02 => { + let full_memo = &plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; + memo.copy_from_slice(full_memo); + } + 0x03 => { + // ZSA note plaintext have a shorter memo. + let short_memo = &plaintext.0[COMPACT_ZSA_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; + memo[..ZSA_MEMO_SIZE].copy_from_slice(short_memo); + } + _ => {} + }; + memo } fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { @@ -272,6 +316,10 @@ impl BatchDomain for OrchardDomain { } } +fn get_note_version(plaintext: &NotePlaintextBytes) -> u8 { + plaintext.0[0] +} + /// Implementation of in-band secret distribution for Orchard bundles. pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; @@ -294,7 +342,7 @@ pub struct CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; 52], + enc_ciphertext: [u8; COMPACT_NOTE_SIZE], } impl fmt::Debug for CompactAction { @@ -309,7 +357,7 @@ impl From<&Action> for CompactAction { nullifier: *action.nullifier(), cmx: *action.cmx(), ephemeral_key: action.ephemeral_key(), - enc_ciphertext: action.encrypted_note().enc_ciphertext[..52] + enc_ciphertext: action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE] .try_into() .unwrap(), } @@ -354,13 +402,13 @@ impl CompactAction { #[cfg(test)] mod tests { + use proptest::prelude::*; use rand::rngs::OsRng; use zcash_note_encryption::{ - try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; - use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; use crate::note::NoteType; use crate::{ action::Action, @@ -368,12 +416,55 @@ mod tests { DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, OutgoingViewingKey, PreparedIncomingViewingKey, }, - note::{ExtractedNoteCommitment, Nullifier, RandomSeed, TransmittedNoteCiphertext}, + note::{ + testing::arb_note, ExtractedNoteCommitment, Nullifier, RandomSeed, + TransmittedNoteCiphertext, + }, primitives::redpallas, value::{NoteValue, ValueCommitment}, Address, Note, }; + use super::{get_note_version, orchard_parse_note_plaintext_without_memo}; + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(10)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let plaintext = OrchardDomain::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomain { rho: note.rho() }; + let parsed_version = get_note_version(&plaintext); + let parsed_memo = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &plaintext.0, + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + if parsed_note.note_type().is_native().into() { + assert_eq!(parsed_version, 0x02); + assert_eq!(&parsed_memo, memo); + } else { + assert_eq!(parsed_version, 0x03); + let mut short_memo = *memo; + short_memo[512 - 32..].copy_from_slice(&[0; 32]); + assert_eq!(parsed_memo, short_memo); + } + } + } + #[test] fn test_vectors() { let test_vectors = crate::test_vectors::note_encryption::test_vectors(); @@ -417,7 +508,17 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); +<<<<<<< HEAD let note = Note::from_parts(recipient, value, NoteType::native(), rho, rseed).unwrap(); +======= + + let note_type = match tv.note_type { + None => NoteType::native(), + Some(type_bytes) => NoteType::from_bytes(&type_bytes).unwrap(), + }; + + let note = Note::from_parts(recipient, value, note_type, rho, rseed); +>>>>>>> ZSA note encryption in Orchard crate (#3) assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( @@ -456,7 +557,8 @@ mod tests { assert_eq!(decrypted_note, note); assert_eq!(decrypted_to, recipient); } - None => panic!("Compact note decryption failed"), + None => assert!(tv.note_type.is_some(), "Compact note decryption failed"), + // Ignore that ZSA notes are not detected in compact decryption. } match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index 10ac4f5e0..7d2b7c960 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -1,4 +1,4 @@ -//! Test vectors for Orchard key components. +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_note_encryption) pub(crate) struct TestVector { pub(crate) incoming_viewing_key: [u8; 64], @@ -20,10 +20,10 @@ pub(crate) struct TestVector { pub(crate) ock: [u8; 32], pub(crate) op: [u8; 64], pub(crate) c_out: [u8; 80], + pub(crate) note_type: Option<[u8; 32]>, } pub(crate) fn test_vectors() -> Vec { - // From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_note_encryption.py vec![ TestVector { incoming_viewing_key: [ @@ -97,34 +97,34 @@ pub(crate) fn test_vectors() -> Vec { 0xc1, 0x3e, 0x71, 0x01, ], rho: [ - 0xc5, 0x96, 0xfb, 0xd3, 0x2e, 0xbb, 0xcb, 0xad, 0xae, 0x60, 0xd2, 0x85, 0xc7, 0xd7, - 0x5f, 0xa8, 0x36, 0xf9, 0xd2, 0xfa, 0x86, 0x10, 0x0a, 0xb8, 0x58, 0xea, 0x2d, 0xe1, - 0xf1, 0x1c, 0x83, 0x06, + 0xca, 0x1f, 0xeb, 0x30, 0xca, 0x11, 0x17, 0x76, 0xc0, 0x41, 0x74, 0x66, 0xbd, 0x69, + 0xb3, 0xd2, 0x13, 0x88, 0x2e, 0xef, 0x55, 0xe6, 0x0b, 0x6d, 0x9e, 0x2a, 0x98, 0xe7, + 0x05, 0xee, 0xf3, 0x27, ], cmx: [ - 0xa5, 0x70, 0x6f, 0x3d, 0x1b, 0x68, 0x8e, 0x9d, 0xc6, 0x34, 0xee, 0xe4, 0xe6, 0x5b, - 0x02, 0x8a, 0x43, 0xee, 0xae, 0xd2, 0x43, 0x5b, 0xea, 0x2a, 0xe3, 0xd5, 0x16, 0x05, - 0x75, 0xc1, 0x1a, 0x3b, + 0x23, 0x75, 0x7c, 0x51, 0x58, 0x21, 0xcb, 0xc1, 0x84, 0x3c, 0x9a, 0x45, 0x7b, 0x7e, + 0x6a, 0xe6, 0x01, 0xad, 0xd2, 0xea, 0x10, 0xb9, 0xc8, 0x6d, 0x6b, 0x31, 0x7c, 0xe2, + 0xf1, 0x7b, 0xd9, 0x21, ], esk: [ - 0x56, 0x66, 0x9d, 0x64, 0x3f, 0x78, 0x0b, 0x6a, 0xd8, 0xb3, 0xd3, 0x5a, 0xd7, 0x46, - 0x8a, 0xaa, 0x73, 0x27, 0x66, 0x57, 0x5f, 0x84, 0xa9, 0x5d, 0x20, 0xa6, 0x25, 0xff, - 0x38, 0x77, 0xea, 0x3f, + 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, 0x8b, 0xfe, 0x9b, 0x38, + 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, 0x8e, 0x33, 0x35, 0x4f, + 0xff, 0xf1, 0xbd, 0x1a, ], ephemeral_key: [ - 0xad, 0xdb, 0x47, 0xb6, 0xac, 0x5d, 0xfc, 0x16, 0x55, 0x89, 0x23, 0xd3, 0xa8, 0xf3, - 0x76, 0x09, 0x5c, 0x69, 0x5c, 0x04, 0x7c, 0x4e, 0x32, 0x66, 0xae, 0x67, 0x69, 0x87, - 0xf7, 0xe3, 0x13, 0x81, + 0x8a, 0x5e, 0x13, 0x2c, 0x3a, 0x07, 0x04, 0xf2, 0x45, 0x6f, 0xbd, 0x77, 0x7a, 0x13, + 0xd6, 0xec, 0x57, 0x65, 0x56, 0x71, 0xdb, 0x07, 0x2a, 0x7d, 0x27, 0x6a, 0xd9, 0x69, + 0xf5, 0xec, 0x45, 0x17, ], shared_secret: [ - 0x30, 0x3c, 0x1c, 0x3f, 0x2b, 0xcb, 0xb9, 0xd8, 0x49, 0x70, 0x15, 0xa6, 0xdf, 0xca, - 0x95, 0x4e, 0xce, 0x0d, 0x3b, 0x6c, 0xf1, 0x0a, 0xb9, 0xf7, 0x19, 0xeb, 0x89, 0x19, - 0x9e, 0xdf, 0xe9, 0x89, + 0x36, 0xd5, 0x4c, 0xab, 0xc6, 0x7f, 0x6c, 0xc7, 0x26, 0xa7, 0x30, 0xf3, 0xa0, 0xce, + 0xed, 0x58, 0x53, 0xf0, 0x8c, 0xd3, 0x81, 0x46, 0xc8, 0x34, 0x25, 0x98, 0x98, 0x7c, + 0x21, 0x50, 0x48, 0xa5, ], k_enc: [ - 0xef, 0x9d, 0x62, 0x25, 0x68, 0x7c, 0x2c, 0x91, 0x7b, 0x5c, 0xad, 0xa1, 0x75, 0x23, - 0xe8, 0xfb, 0xdb, 0x08, 0x82, 0x25, 0xaf, 0x2d, 0xb5, 0x72, 0xbb, 0x40, 0x0e, 0x44, - 0x8b, 0x5e, 0xa8, 0x71, + 0x82, 0xc4, 0x32, 0x65, 0x33, 0x7f, 0x1a, 0xb3, 0x7b, 0x18, 0xdf, 0x27, 0x75, 0x48, + 0x61, 0x82, 0x63, 0xb8, 0x02, 0x4d, 0x9b, 0x14, 0x5a, 0x05, 0xad, 0xe2, 0xeb, 0x54, + 0x79, 0x18, 0x03, 0x20, ], p_enc: [ 0x02, 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, 0x8d, 0x5f, @@ -170,69 +170,70 @@ pub(crate) fn test_vectors() -> Vec { 0xee, 0xcc, 0x40, 0xa9, ], c_enc: [ - 0x1a, 0x9a, 0xdb, 0x14, 0x24, 0x98, 0xe3, 0xdc, 0xc7, 0x6f, 0xed, 0x77, 0x86, 0x14, - 0xdd, 0x31, 0x6c, 0x02, 0xfb, 0xb8, 0xba, 0x92, 0x44, 0xae, 0x4c, 0x2e, 0x32, 0xa0, - 0x7d, 0xae, 0xec, 0xa4, 0x12, 0x26, 0xb9, 0x8b, 0xfe, 0x74, 0xf9, 0xfc, 0xb2, 0x28, - 0xcf, 0xc1, 0x00, 0xf3, 0x18, 0x0f, 0x57, 0x75, 0xec, 0xe3, 0x8b, 0xe7, 0xed, 0x45, - 0xd9, 0x40, 0x21, 0xf4, 0x40, 0x1b, 0x2a, 0x4d, 0x75, 0x82, 0xb4, 0x28, 0xd4, 0x9e, - 0xc7, 0xf5, 0xb5, 0xa4, 0x98, 0x97, 0x3e, 0x60, 0xe3, 0x8e, 0x74, 0xf5, 0xc3, 0xe5, - 0x77, 0x82, 0x7c, 0x38, 0x28, 0x57, 0xd8, 0x16, 0x6b, 0x54, 0xe6, 0x4f, 0x66, 0xef, - 0x5c, 0x7e, 0x8c, 0x9b, 0xaa, 0x2a, 0x3f, 0xa9, 0xe3, 0x7d, 0x08, 0x77, 0x17, 0xd5, - 0xe9, 0x6b, 0xc2, 0xf7, 0x3d, 0x03, 0x14, 0x50, 0xdc, 0x24, 0x32, 0xba, 0x49, 0xd8, - 0xb7, 0x4d, 0xb2, 0x13, 0x09, 0x9e, 0xa9, 0xba, 0x04, 0xeb, 0x63, 0xb6, 0x57, 0x4d, - 0x46, 0xc0, 0x3c, 0xe7, 0x90, 0x0d, 0x4a, 0xc4, 0xbb, 0x18, 0x8e, 0xe9, 0x03, 0x0d, - 0x7f, 0x69, 0xc8, 0x95, 0xa9, 0x4f, 0xc1, 0x82, 0xf2, 0x25, 0xa9, 0x4f, 0x0c, 0xde, - 0x1b, 0x49, 0x88, 0x68, 0x71, 0xa3, 0x76, 0x34, 0x1e, 0xa9, 0x41, 0x71, 0xbe, 0xfd, - 0x95, 0xa8, 0x30, 0xfa, 0x18, 0x40, 0x70, 0x97, 0xdc, 0xa5, 0x11, 0x02, 0x54, 0x63, - 0xd4, 0x37, 0xe9, 0x69, 0x5c, 0xaa, 0x07, 0x9a, 0x2f, 0x68, 0xcd, 0xc7, 0xf2, 0xc1, - 0x32, 0x67, 0xbf, 0xf4, 0x19, 0x51, 0x37, 0xfa, 0x89, 0x53, 0x25, 0x2a, 0x81, 0xb2, - 0xaf, 0xa1, 0x58, 0x2b, 0x9b, 0xfb, 0x4a, 0xc9, 0x60, 0x37, 0xed, 0x29, 0x91, 0xd3, - 0xcb, 0xc7, 0xd5, 0x4a, 0xff, 0x6e, 0x62, 0x1b, 0x06, 0xa7, 0xb2, 0xb9, 0xca, 0xf2, - 0x95, 0x5e, 0xfa, 0xf4, 0xea, 0x8e, 0xfc, 0xfd, 0x02, 0x3a, 0x3c, 0x17, 0x48, 0xdf, - 0x3c, 0xbd, 0x43, 0xe0, 0xb9, 0xa8, 0xb0, 0x94, 0x56, 0x88, 0xd5, 0x20, 0x56, 0xc1, - 0xd1, 0x6e, 0xea, 0x37, 0xe7, 0x98, 0xba, 0x31, 0xdc, 0x3e, 0x5d, 0x49, 0x52, 0xbd, - 0x51, 0xec, 0x76, 0x9d, 0x57, 0x88, 0xb6, 0xe3, 0x5f, 0xe9, 0x04, 0x2b, 0x95, 0xd4, - 0xd2, 0x17, 0x81, 0x40, 0x0e, 0xaf, 0xf5, 0x86, 0x16, 0xad, 0x56, 0x27, 0x96, 0x63, - 0x6a, 0x50, 0xb8, 0xed, 0x6c, 0x7f, 0x98, 0x1d, 0xc7, 0xba, 0x81, 0x4e, 0xff, 0x15, - 0x2c, 0xb2, 0x28, 0xa2, 0xea, 0xd2, 0xf8, 0x32, 0x66, 0x2f, 0xa4, 0xa4, 0xa5, 0x07, - 0x97, 0xb0, 0xf8, 0x5b, 0x62, 0xd0, 0x8b, 0x1d, 0xd2, 0xd8, 0xe4, 0x3b, 0x4a, 0x5b, - 0xfb, 0xb1, 0x59, 0xed, 0x57, 0x8e, 0xf7, 0x47, 0x5d, 0xe0, 0xad, 0xa1, 0x3e, 0x17, - 0xad, 0x87, 0xcc, 0x23, 0x05, 0x67, 0x2b, 0xcc, 0x55, 0xa8, 0x88, 0x13, 0x17, 0xfd, - 0xc1, 0xbf, 0xc4, 0x59, 0xb6, 0x8b, 0x2d, 0xf7, 0x0c, 0xad, 0x37, 0x70, 0xed, 0x0f, - 0xd0, 0x2d, 0x64, 0xb9, 0x6f, 0x2b, 0xbf, 0x6f, 0x8f, 0x63, 0x2e, 0x86, 0x6c, 0xa5, - 0xd1, 0x96, 0xd2, 0x48, 0xad, 0x05, 0xc3, 0xde, 0x64, 0x41, 0x48, 0xa8, 0x0b, 0x51, - 0xad, 0xa9, 0x5b, 0xd0, 0x8d, 0x73, 0xcd, 0xbb, 0x45, 0x26, 0x4f, 0x3b, 0xd1, 0x13, - 0x83, 0x5b, 0x46, 0xf9, 0xbe, 0x7b, 0x6d, 0x23, 0xa4, 0x3b, 0xdd, 0xfe, 0x1e, 0x74, - 0x08, 0xc9, 0x70, 0x31, 0xe1, 0xa8, 0x21, 0x4b, 0xab, 0x46, 0x39, 0x10, 0x44, 0xb7, - 0x00, 0xd3, 0x8f, 0x51, 0x92, 0xc5, 0x7f, 0xe6, 0xf8, 0x71, 0x59, 0xb5, 0x55, 0x12, - 0x09, 0x4e, 0x29, 0xd2, 0xce, 0xba, 0xb8, 0x68, 0xc8, 0xf1, 0xad, 0xba, 0xd5, 0x70, - 0x77, 0xcb, 0xeb, 0x5e, 0x69, 0x65, 0x85, 0x82, 0xbf, 0x98, 0xd1, 0x9d, 0x64, 0xf4, - 0x4b, 0x0d, 0x50, 0xc7, 0xe2, 0x20, 0x9a, 0xb3, 0xfc, 0x56, 0xb4, 0xf4, 0x09, 0x12, - 0x3a, 0xae, 0xb0, 0x26, 0x3a, 0x22, 0x45, 0x1b, 0xc1, 0x4e, 0xd7, 0x56, 0xd0, 0x48, - 0x38, 0x5a, 0xed, 0xbb, 0x86, 0xa8, 0x46, 0x77, 0xbb, 0x2d, 0x21, 0xc5, 0x2c, 0xc9, - 0x49, 0x41, 0x47, 0xbf, 0x0f, 0xb1, 0x02, 0x74, 0x52, 0x82, 0x99, 0x09, 0x09, 0x72, - 0x62, 0x28, 0x18, 0x6e, 0x02, 0xc8, + 0x93, 0xe0, 0x48, 0x74, 0xb5, 0x83, 0x7c, 0x26, 0x1d, 0xaf, 0x1a, 0x27, 0xb7, 0x83, + 0xec, 0x48, 0x65, 0xd3, 0xbb, 0x72, 0x8e, 0xb1, 0x61, 0xda, 0xed, 0xb8, 0x44, 0x6a, + 0xb3, 0x8f, 0x07, 0x8e, 0xa8, 0x66, 0x2e, 0x4d, 0x2e, 0x9d, 0x00, 0xa3, 0x95, 0x27, + 0xdc, 0xde, 0x51, 0x7a, 0xc3, 0xdb, 0xf9, 0xd2, 0x7e, 0x3c, 0x79, 0xfa, 0x88, 0x1a, + 0xbb, 0x48, 0xb7, 0x0d, 0xbc, 0x28, 0xdd, 0xf4, 0xaf, 0x81, 0xae, 0xed, 0x2a, 0x29, + 0x86, 0x00, 0x51, 0x08, 0x48, 0xed, 0xbd, 0xc4, 0x2e, 0x88, 0x95, 0x48, 0x70, 0xd5, + 0xd6, 0x01, 0xcd, 0xf2, 0x90, 0x18, 0x1b, 0x53, 0x91, 0x05, 0xb9, 0xf6, 0x13, 0x86, + 0xcb, 0x07, 0x84, 0x6b, 0xc8, 0xe3, 0x19, 0xdf, 0xab, 0x8e, 0x10, 0x97, 0x66, 0xa2, + 0x8c, 0x1e, 0x0b, 0xbf, 0x91, 0x32, 0x02, 0xce, 0xcd, 0x1b, 0x48, 0x17, 0xa2, 0x28, + 0x2f, 0xc2, 0x9e, 0xd4, 0x4d, 0x9b, 0x04, 0x04, 0x9d, 0xe5, 0x5a, 0xcf, 0x54, 0x99, + 0xe5, 0xf5, 0x65, 0xd4, 0x8b, 0x8f, 0x19, 0x72, 0xc0, 0x43, 0x84, 0x77, 0x96, 0x23, + 0x0d, 0xc6, 0x8f, 0x32, 0x57, 0xc0, 0x85, 0x29, 0x14, 0x8c, 0x8e, 0x0c, 0x32, 0x7b, + 0x25, 0xb4, 0x59, 0x87, 0x7c, 0xde, 0xd9, 0x8f, 0xf7, 0x8e, 0x81, 0xfa, 0x69, 0x2e, + 0x14, 0xf8, 0xfd, 0xa1, 0xfe, 0x52, 0x4f, 0xf1, 0x50, 0x18, 0x1f, 0x73, 0x6e, 0xd3, + 0xa8, 0x8e, 0xc7, 0x89, 0xdc, 0x15, 0x95, 0x4a, 0x02, 0x63, 0x9a, 0x8a, 0x20, 0xca, + 0x38, 0xd8, 0x99, 0xbf, 0xd1, 0xc5, 0x73, 0xb0, 0x41, 0xee, 0x7b, 0xf2, 0x2b, 0x96, + 0x75, 0xbd, 0xa8, 0xc4, 0xb0, 0x58, 0xa0, 0x5a, 0x49, 0x33, 0x03, 0xb1, 0x1f, 0x35, + 0x81, 0xc1, 0x9d, 0x2d, 0xa9, 0x96, 0x6a, 0x71, 0x06, 0x6e, 0xc1, 0x7d, 0xcc, 0xd3, + 0x48, 0x20, 0x7e, 0xb3, 0x14, 0xf6, 0xcf, 0xc9, 0xd0, 0x6a, 0x62, 0x14, 0xc6, 0x72, + 0x10, 0x97, 0xa5, 0x2e, 0x27, 0x76, 0x66, 0x7c, 0x6b, 0xe9, 0xc8, 0x86, 0x2b, 0x17, + 0x3d, 0xb0, 0xe8, 0x04, 0xb1, 0x2c, 0xaa, 0xe9, 0xd9, 0xfa, 0x09, 0xf3, 0xf4, 0x8c, + 0xaf, 0x4b, 0xf7, 0x56, 0xa2, 0x78, 0x95, 0x0a, 0x25, 0x4e, 0xc4, 0x14, 0x76, 0x77, + 0xaa, 0xca, 0x21, 0x42, 0x96, 0x08, 0x1a, 0x2f, 0x62, 0x4a, 0x92, 0x78, 0x94, 0x6e, + 0x68, 0x9d, 0xd9, 0x14, 0x02, 0x90, 0x92, 0xe7, 0xfa, 0x8f, 0xbc, 0x8a, 0x04, 0x46, + 0x7d, 0x60, 0xed, 0xff, 0x5d, 0x97, 0xcb, 0x65, 0x09, 0xa0, 0xc7, 0x2c, 0xed, 0x77, + 0xac, 0xa8, 0x71, 0x30, 0x8e, 0x7d, 0xe2, 0xbe, 0xb1, 0x52, 0x0a, 0x34, 0x17, 0xd7, + 0x21, 0x3a, 0x9a, 0xbd, 0x47, 0x35, 0x8c, 0x4f, 0x32, 0x9f, 0x0f, 0x64, 0x41, 0x92, + 0x10, 0xa9, 0x9d, 0xb2, 0xde, 0x6e, 0x6d, 0x89, 0x21, 0xb0, 0xf4, 0xf9, 0x9f, 0xd6, + 0x45, 0xfa, 0xe0, 0xd6, 0x29, 0xce, 0x22, 0x11, 0x90, 0x5f, 0x25, 0xf4, 0x0d, 0x12, + 0x0b, 0x63, 0x27, 0x93, 0x75, 0xb5, 0x43, 0xc3, 0x1e, 0x3b, 0x55, 0x7e, 0x57, 0xa7, + 0xa8, 0x7c, 0x61, 0x79, 0xeb, 0xd3, 0x4f, 0x6d, 0xbb, 0x92, 0x0e, 0xc5, 0xe0, 0x5d, + 0x6a, 0x77, 0xec, 0xdf, 0x36, 0xb4, 0x57, 0xba, 0xb4, 0x56, 0x6c, 0x40, 0x8f, 0xb5, + 0x7d, 0xfc, 0xdd, 0xda, 0xa4, 0x2c, 0x51, 0x34, 0xaf, 0x3e, 0x97, 0x8d, 0xbf, 0xd0, + 0xdf, 0xb0, 0xca, 0x4f, 0xfa, 0xf1, 0x65, 0x0a, 0xbe, 0xe1, 0x62, 0x5f, 0x7f, 0x4b, + 0xf8, 0x25, 0x06, 0x01, 0x00, 0x64, 0x5b, 0x54, 0xc0, 0x04, 0x1f, 0xbf, 0xbd, 0xef, + 0xf7, 0xb9, 0x38, 0x04, 0xe9, 0xcc, 0x0c, 0xcd, 0x6f, 0x27, 0xbe, 0x40, 0x01, 0x6c, + 0x32, 0xd4, 0x2f, 0xe3, 0x66, 0xfa, 0xaa, 0x86, 0x87, 0xc2, 0xd1, 0x92, 0x61, 0x9f, + 0x56, 0x5b, 0x0c, 0x70, 0xea, 0x6a, 0x3f, 0x79, 0xd5, 0x3a, 0x52, 0x41, 0xe6, 0x9c, + 0x3c, 0xa6, 0x87, 0xa1, 0x12, 0xfb, 0x16, 0xc2, 0x5c, 0xc0, 0x83, 0x17, 0xdb, 0xa4, + 0x23, 0x97, 0x0c, 0x32, 0xdf, 0xb4, 0xbd, 0x69, 0x22, 0xe3, 0x36, 0xab, 0xf2, 0xfd, + 0xe2, 0xc3, 0xaa, 0x5d, 0xb2, 0x93, 0xef, 0x27, 0x47, 0x87, 0x6c, 0x8b, 0xd8, 0x6e, + 0xa1, 0x87, 0xcb, 0x60, 0x1a, 0xf7, ], ock: [ - 0x4e, 0x9d, 0x45, 0x94, 0x6b, 0x3e, 0xea, 0xe7, 0xfe, 0x30, 0x5d, 0x5b, 0x90, 0x50, - 0x36, 0x14, 0x1f, 0x9f, 0x40, 0x09, 0xa6, 0x29, 0x4b, 0x96, 0xc7, 0x22, 0xa4, 0xa0, - 0xbe, 0x68, 0x5d, 0xff, + 0xb3, 0x25, 0xeb, 0xe5, 0x7a, 0x2c, 0x40, 0xa8, 0xb2, 0x11, 0xcf, 0xdf, 0x72, 0xa1, + 0xa2, 0x44, 0xf1, 0x53, 0x42, 0x85, 0x98, 0x88, 0xa3, 0x64, 0x52, 0x3e, 0xfd, 0x2a, + 0xc6, 0x6a, 0x1a, 0xd6, ], op: [ 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, - 0x49, 0x50, 0x69, 0x2c, 0x56, 0x66, 0x9d, 0x64, 0x3f, 0x78, 0x0b, 0x6a, 0xd8, 0xb3, - 0xd3, 0x5a, 0xd7, 0x46, 0x8a, 0xaa, 0x73, 0x27, 0x66, 0x57, 0x5f, 0x84, 0xa9, 0x5d, - 0x20, 0xa6, 0x25, 0xff, 0x38, 0x77, 0xea, 0x3f, + 0x49, 0x50, 0x69, 0x2c, 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, + 0x8b, 0xfe, 0x9b, 0x38, 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, + 0x8e, 0x33, 0x35, 0x4f, 0xff, 0xf1, 0xbd, 0x1a, ], c_out: [ - 0xcb, 0xdf, 0x68, 0xa5, 0x7f, 0xb4, 0xa4, 0x6f, 0x34, 0x60, 0xff, 0x22, 0x7b, 0xc6, - 0x18, 0xda, 0xe1, 0x12, 0x29, 0x45, 0xb3, 0x80, 0xc7, 0xe5, 0x49, 0xcf, 0x4a, 0x6e, - 0x8b, 0xf3, 0x75, 0x49, 0xba, 0xe1, 0x89, 0x1f, 0xd8, 0xd1, 0xa4, 0x94, 0x4f, 0xdf, - 0x41, 0x0f, 0x07, 0x02, 0xed, 0xa5, 0x44, 0x2f, 0x0e, 0xa0, 0x1a, 0x5d, 0xf0, 0x12, - 0xa0, 0xae, 0x4d, 0x84, 0xed, 0x79, 0x80, 0x33, 0x28, 0xbd, 0x1f, 0xd5, 0xfa, 0xc7, - 0x19, 0x21, 0x6a, 0x77, 0x6d, 0xe6, 0x4f, 0xd1, 0x67, 0xdb, - ], + 0x55, 0xb8, 0x90, 0x7c, 0x6d, 0x45, 0x4b, 0x83, 0x63, 0x4f, 0x1b, 0x9a, 0x1a, 0xa3, + 0xc3, 0xc9, 0x8a, 0xdc, 0x77, 0xd9, 0x6c, 0x2f, 0x62, 0x49, 0xec, 0x66, 0xdb, 0xae, + 0x4d, 0x0c, 0xc9, 0x40, 0xd7, 0x26, 0xbc, 0xd1, 0xec, 0x91, 0x18, 0x9f, 0xd3, 0x04, + 0x9a, 0x33, 0xf2, 0xea, 0x7d, 0x8b, 0x74, 0xaa, 0xc1, 0x7c, 0xda, 0x38, 0x83, 0x80, + 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, + 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -306,34 +307,34 @@ pub(crate) fn test_vectors() -> Vec { 0x25, 0x7a, 0xd8, 0xb3, ], rho: [ - 0x33, 0x88, 0xda, 0x05, 0x06, 0xda, 0x9e, 0xa2, 0xd5, 0x16, 0x73, 0x9b, 0x95, 0x1c, - 0x7c, 0xc0, 0x58, 0x53, 0x36, 0xb4, 0x4d, 0xf9, 0xb3, 0xb5, 0x0e, 0x48, 0x93, 0xe4, - 0xb1, 0x84, 0x92, 0x11, + 0xc1, 0xe1, 0x59, 0x5b, 0x8d, 0xe7, 0x55, 0x97, 0x66, 0xe5, 0xa6, 0x72, 0x5f, 0x5b, + 0xe5, 0x74, 0x2f, 0x43, 0xbf, 0x40, 0x62, 0x3b, 0x71, 0x49, 0xca, 0xe2, 0x67, 0x5c, + 0x4d, 0xb2, 0xc7, 0x31, ], cmx: [ - 0x9e, 0x04, 0x32, 0xb2, 0xb3, 0x33, 0xcd, 0xe8, 0xce, 0x92, 0x1b, 0x77, 0xca, 0x7e, - 0x9e, 0x41, 0x51, 0xe3, 0x74, 0xd5, 0x16, 0xcd, 0xa1, 0x17, 0x63, 0x83, 0x6a, 0xf3, - 0xb6, 0x6f, 0x5b, 0x15, + 0x59, 0xb6, 0xf3, 0xd4, 0x03, 0x22, 0x3d, 0x6c, 0xe4, 0x3d, 0xed, 0xae, 0xe2, 0x35, + 0xfc, 0xa9, 0x5c, 0xc8, 0xb2, 0x49, 0x94, 0x1c, 0xcd, 0xb6, 0x6f, 0x3f, 0x61, 0x1c, + 0xc5, 0xe9, 0xf9, 0x0f, ], esk: [ - 0x68, 0x65, 0x87, 0xce, 0x53, 0xc3, 0x39, 0xf9, 0xce, 0xcf, 0x4d, 0x80, 0x4a, 0x17, - 0x09, 0x39, 0x2b, 0x6a, 0xb1, 0x08, 0xea, 0x2c, 0x57, 0x79, 0x92, 0x1c, 0xd5, 0xda, - 0x8a, 0x6e, 0x1a, 0x08, + 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, 0xdd, 0x73, 0x4d, 0x0e, + 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, 0x22, 0xc0, 0x61, 0xe0, + 0xbd, 0xc9, 0xce, 0x14, ], ephemeral_key: [ - 0x91, 0x92, 0x3e, 0xd8, 0x2b, 0x76, 0xd7, 0x97, 0x30, 0x7c, 0xaa, 0x23, 0x02, 0xc0, - 0xcf, 0x75, 0x56, 0x12, 0x17, 0x24, 0x98, 0x67, 0x53, 0x2a, 0xe5, 0x1c, 0x2e, 0xa0, - 0x05, 0xed, 0xad, 0xb6, + 0xd2, 0x9e, 0x0d, 0x00, 0x1e, 0xe7, 0x1e, 0x05, 0x99, 0x08, 0x65, 0x04, 0xd8, 0x62, + 0xc7, 0xf5, 0x2b, 0x08, 0x60, 0x77, 0x0d, 0x8a, 0x4b, 0x42, 0xa8, 0x68, 0x11, 0xac, + 0x31, 0x69, 0x85, 0x8c, ], shared_secret: [ - 0x53, 0xd7, 0xe4, 0x84, 0x3a, 0x36, 0xd5, 0x79, 0xb5, 0xa7, 0xc1, 0x04, 0x11, 0x96, - 0xbd, 0x4c, 0x85, 0x80, 0x5c, 0xcd, 0x0a, 0x3f, 0x95, 0xbc, 0x9e, 0x71, 0x06, 0x90, - 0xd1, 0x1b, 0x7a, 0xaa, + 0x11, 0xa0, 0xac, 0x79, 0x9a, 0x29, 0xb0, 0xed, 0x19, 0x5e, 0xd8, 0x7b, 0x13, 0x83, + 0x22, 0x26, 0x3b, 0xbb, 0x9c, 0x31, 0x00, 0x8c, 0x29, 0x59, 0xaf, 0x2f, 0xc6, 0x36, + 0x68, 0x7e, 0xd9, 0xb0, ], k_enc: [ - 0xc2, 0xe3, 0x38, 0x9d, 0x6f, 0xc3, 0xcd, 0x06, 0x7f, 0x59, 0x0a, 0x93, 0x73, 0x05, - 0x04, 0xad, 0x9b, 0x63, 0xc4, 0x55, 0x45, 0x69, 0xb9, 0x62, 0x0f, 0x3e, 0xf0, 0xb0, - 0x65, 0x94, 0xde, 0xd6, + 0x4b, 0xbf, 0x80, 0xe7, 0xa1, 0x70, 0x3a, 0xc1, 0x4a, 0xd7, 0xb5, 0x44, 0x8a, 0x2e, + 0x8e, 0x79, 0x49, 0x30, 0x49, 0xd1, 0x9a, 0x6a, 0x51, 0x31, 0x67, 0xd5, 0x5b, 0xdd, + 0x58, 0x6a, 0xc0, 0xd9, ], p_enc: [ 0x02, 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, 0x40, 0x50, @@ -379,69 +380,70 @@ pub(crate) fn test_vectors() -> Vec { 0x8b, 0x1e, 0x88, 0x6f, ], c_enc: [ - 0x6d, 0x21, 0x18, 0x0a, 0xc4, 0x74, 0x94, 0x57, 0x8a, 0x90, 0x06, 0xaf, 0x5b, 0xeb, - 0x4e, 0x34, 0x55, 0x59, 0xab, 0xdb, 0x0e, 0x23, 0xed, 0x52, 0x65, 0xaf, 0x79, 0xce, - 0x0c, 0xc5, 0x96, 0x71, 0xea, 0x31, 0x7b, 0x3e, 0xb1, 0x52, 0x93, 0xd1, 0xe0, 0x4a, - 0x9a, 0xd8, 0x39, 0x69, 0xab, 0x9e, 0x17, 0x08, 0xf2, 0x28, 0x85, 0x3a, 0x28, 0x1f, - 0xcf, 0x6c, 0x97, 0x60, 0xae, 0x71, 0x96, 0x5b, 0xb1, 0xd4, 0x45, 0x2e, 0x5e, 0xd0, - 0x06, 0x00, 0xab, 0x58, 0x94, 0x27, 0x75, 0xb7, 0x4e, 0x12, 0x62, 0xb4, 0x22, 0x5d, - 0x3b, 0x61, 0x9c, 0x31, 0x65, 0x96, 0xd7, 0xcf, 0x9c, 0x93, 0xbd, 0xb5, 0x2a, 0xfa, - 0x77, 0x8a, 0xa1, 0x20, 0x8d, 0x56, 0xd0, 0x69, 0xe5, 0x6e, 0x27, 0x79, 0x61, 0x4d, - 0x56, 0xf4, 0x36, 0x10, 0x72, 0xbc, 0x15, 0x16, 0xa9, 0xb4, 0x56, 0x2a, 0x4f, 0x54, - 0x63, 0xa5, 0x13, 0xc4, 0x59, 0x42, 0x15, 0x70, 0xf3, 0x34, 0xef, 0xb6, 0xbc, 0xd2, - 0x08, 0xf8, 0xf8, 0x05, 0x0e, 0x15, 0x3d, 0x4e, 0x61, 0xf3, 0x1e, 0xdd, 0xbb, 0x5a, - 0x98, 0xf1, 0x70, 0xd3, 0xd0, 0x80, 0xe8, 0xec, 0x3f, 0x65, 0x20, 0xb6, 0xa2, 0xd6, - 0x08, 0x83, 0xa5, 0x87, 0xff, 0x0e, 0x98, 0x21, 0x1c, 0x73, 0x45, 0x16, 0xb5, 0xdc, - 0xc7, 0x5e, 0xf2, 0x3c, 0xfb, 0x9f, 0x55, 0xf1, 0xde, 0xed, 0xf1, 0x26, 0xc2, 0xce, - 0x17, 0x27, 0x3f, 0x41, 0xdb, 0xbb, 0xbd, 0x2f, 0x49, 0xe3, 0x55, 0x77, 0x6e, 0xc0, - 0x46, 0x98, 0x35, 0xf7, 0x9d, 0x94, 0x80, 0x42, 0xf8, 0x42, 0x0f, 0x11, 0xe1, 0xab, - 0xd7, 0x45, 0x06, 0xb7, 0x8b, 0x5e, 0x41, 0xcb, 0xe0, 0xc7, 0x07, 0x17, 0xf4, 0x6e, - 0x7e, 0xb9, 0xac, 0xdc, 0x35, 0x1c, 0x94, 0x98, 0x83, 0x3a, 0xfd, 0xed, 0x93, 0x06, - 0xa0, 0x43, 0x5b, 0x10, 0xb8, 0x3a, 0xe3, 0x95, 0xd5, 0x7f, 0x5b, 0x0a, 0x5d, 0x41, - 0xa9, 0x34, 0x2d, 0x02, 0xec, 0x58, 0xb6, 0xee, 0x16, 0x87, 0x77, 0x50, 0x16, 0xb8, - 0x74, 0x9b, 0x28, 0x7a, 0xbd, 0xd3, 0xed, 0x1a, 0x83, 0x5e, 0xa8, 0xf3, 0xb1, 0x4d, - 0x08, 0x18, 0xfe, 0x0d, 0x5d, 0x9a, 0x48, 0xeb, 0x02, 0x13, 0x64, 0x0e, 0xec, 0xc1, - 0x9a, 0x5d, 0x16, 0x61, 0xdb, 0x82, 0x2b, 0x77, 0x9b, 0x08, 0x0c, 0xd8, 0xba, 0x7f, - 0x3a, 0x27, 0x23, 0x21, 0xee, 0x5d, 0xa2, 0x27, 0x8c, 0x53, 0x85, 0x67, 0xd0, 0xd9, - 0xbb, 0x28, 0xce, 0x64, 0x21, 0x31, 0x15, 0x03, 0xa4, 0xa0, 0x17, 0x14, 0xcf, 0x91, - 0x01, 0x55, 0x2b, 0xa5, 0xef, 0xc8, 0x5c, 0x94, 0xd5, 0xe5, 0x09, 0x72, 0x7e, 0x5e, - 0x01, 0x1c, 0x15, 0xb1, 0xb2, 0xec, 0xdf, 0xf3, 0x99, 0xc0, 0xbe, 0x33, 0x42, 0xab, - 0x6e, 0xdd, 0xa8, 0xe3, 0xed, 0x81, 0x1a, 0x7d, 0x9c, 0x9c, 0xa4, 0xbb, 0x71, 0xa5, - 0x63, 0xe1, 0x59, 0x78, 0xbf, 0x8e, 0x64, 0x04, 0xac, 0x79, 0x6e, 0xb7, 0x81, 0xfd, - 0x2c, 0xf2, 0x19, 0x1b, 0x2f, 0x4d, 0x40, 0x76, 0xd9, 0x3c, 0xcc, 0x80, 0xf7, 0xe5, - 0x92, 0xfa, 0x66, 0x9b, 0x72, 0x26, 0x57, 0x82, 0xee, 0x8f, 0x5c, 0xe3, 0x03, 0x12, - 0xd3, 0x51, 0x2b, 0x35, 0x49, 0x0a, 0xfe, 0x00, 0x6b, 0xad, 0xb1, 0x62, 0x0d, 0x1b, - 0x0c, 0x79, 0xfb, 0xc4, 0xbe, 0xc5, 0x65, 0xd7, 0x46, 0x1d, 0x68, 0xef, 0x72, 0x27, - 0x79, 0x11, 0x77, 0x6c, 0xd5, 0xa7, 0xb5, 0xfc, 0x6f, 0xa8, 0xb3, 0xee, 0xfd, 0x7a, - 0x39, 0xe8, 0xe5, 0xb4, 0xf6, 0xa5, 0x0c, 0x7d, 0x58, 0xd9, 0xeb, 0x08, 0x38, 0x0d, - 0x32, 0x0b, 0x36, 0xea, 0x04, 0x37, 0x00, 0xac, 0xa7, 0x64, 0xb4, 0x8c, 0x3d, 0xa4, - 0x93, 0x67, 0xfa, 0x93, 0x35, 0x6a, 0xaa, 0x4f, 0x87, 0x08, 0xea, 0x6e, 0x34, 0x59, - 0x81, 0x84, 0x5b, 0xe7, 0x37, 0x6d, 0xa7, 0x98, 0x40, 0x53, 0xef, 0x7d, 0xd4, 0xb6, - 0xa7, 0x27, 0x92, 0x35, 0x6a, 0x6c, 0x34, 0x62, 0x68, 0x88, 0xcc, 0x70, 0xde, 0x49, - 0x9e, 0xf9, 0x10, 0x26, 0x95, 0xd9, 0xdb, 0x12, 0xaf, 0x29, 0x62, 0xfc, 0x75, 0xd4, - 0x36, 0x56, 0x19, 0xdb, 0x0e, 0x87, 0x6c, 0xdb, 0x82, 0x02, 0xe8, 0x16, 0xfd, 0xc2, - 0xcd, 0xf3, 0x7a, 0xd3, 0xbe, 0x3b, + 0x1b, 0x42, 0x34, 0x80, 0xbf, 0x37, 0x67, 0xf5, 0xeb, 0xfc, 0x40, 0xb8, 0xc8, 0x9c, + 0xc5, 0x34, 0xf1, 0x65, 0xc3, 0x5d, 0x19, 0xc8, 0xda, 0x6c, 0x32, 0x10, 0xe9, 0x52, + 0xca, 0xd8, 0x23, 0xa7, 0x84, 0x60, 0x21, 0xc3, 0xde, 0x4a, 0x86, 0x93, 0xb7, 0x1e, + 0x28, 0x7f, 0x46, 0x86, 0xac, 0x0a, 0xdd, 0xce, 0xd9, 0x4e, 0xba, 0x81, 0x0a, 0x99, + 0x8b, 0x82, 0x3a, 0x4a, 0xd2, 0x41, 0xaa, 0x9f, 0x4a, 0x3a, 0xe4, 0x82, 0x5d, 0xe9, + 0x95, 0xdd, 0x58, 0x73, 0x56, 0x62, 0x44, 0xbb, 0xd8, 0x75, 0xd0, 0x1b, 0xf3, 0x28, + 0xe8, 0x22, 0xca, 0xfd, 0xb8, 0x3e, 0xd7, 0x75, 0x3a, 0x88, 0x85, 0xd7, 0xae, 0xf2, + 0x45, 0x5a, 0x15, 0x2e, 0x23, 0xdf, 0xa2, 0xd6, 0x99, 0xb3, 0x5c, 0x33, 0xd3, 0x61, + 0x07, 0x2a, 0xe5, 0xc5, 0x12, 0x43, 0x4d, 0x34, 0x6f, 0x6c, 0x56, 0xfb, 0x5f, 0x11, + 0xb0, 0xb6, 0x47, 0xcb, 0xca, 0xfe, 0x02, 0xd8, 0x84, 0x55, 0xa6, 0x30, 0xa3, 0x50, + 0x86, 0x2b, 0x3c, 0xd1, 0x51, 0x3b, 0x6d, 0x6e, 0x41, 0x17, 0xc7, 0x5e, 0xc4, 0xb1, + 0x2f, 0xd7, 0x5a, 0x90, 0xf8, 0x2d, 0xce, 0xa1, 0xc7, 0x71, 0xfd, 0xda, 0x24, 0xec, + 0xf0, 0xa3, 0xe5, 0xb2, 0xe8, 0xa2, 0x24, 0x23, 0x6e, 0xf0, 0x9a, 0x93, 0xab, 0x59, + 0xe5, 0x9b, 0xdf, 0xb8, 0x72, 0x86, 0x0c, 0xc2, 0xd9, 0x11, 0x34, 0xca, 0xf2, 0x13, + 0x98, 0x48, 0xe3, 0x9a, 0xa6, 0x4b, 0xa2, 0xe6, 0xd7, 0x25, 0x20, 0x54, 0xf3, 0x7a, + 0xd5, 0x5c, 0x2c, 0xe5, 0xf8, 0x1b, 0x33, 0xcc, 0xb6, 0x8a, 0x94, 0x73, 0x71, 0x24, + 0x3a, 0x77, 0xe8, 0x43, 0x67, 0xd9, 0xd3, 0x5b, 0x11, 0x68, 0x14, 0x10, 0xea, 0x79, + 0x8b, 0x03, 0x87, 0xb8, 0xf1, 0x0b, 0x1f, 0x89, 0xc6, 0x8a, 0xd1, 0xcc, 0xa9, 0xa3, + 0xe0, 0x32, 0xf3, 0x49, 0x98, 0x79, 0xc8, 0x9a, 0xe6, 0x38, 0x2f, 0x38, 0x97, 0x22, + 0x01, 0x1f, 0x49, 0x25, 0x14, 0x3e, 0xa8, 0x50, 0x73, 0xe4, 0xff, 0x0c, 0xcf, 0x6d, + 0x77, 0x9b, 0xc3, 0xbf, 0x4c, 0x1b, 0x95, 0xfc, 0x7c, 0xf7, 0xf9, 0x91, 0xa2, 0x16, + 0x2a, 0xb9, 0x45, 0x41, 0xf3, 0x99, 0x8e, 0xf6, 0xbc, 0x3f, 0xe8, 0x02, 0x54, 0xab, + 0xa4, 0x1f, 0x15, 0x23, 0x15, 0x03, 0x45, 0x1b, 0x15, 0xe1, 0x08, 0x52, 0xf8, 0x5b, + 0xd2, 0xd1, 0x15, 0x93, 0x53, 0x14, 0xcd, 0x80, 0xc1, 0x23, 0xbe, 0x0b, 0x53, 0x0f, + 0xaa, 0xd6, 0xb5, 0x07, 0x49, 0x68, 0x22, 0x1d, 0xa0, 0x4b, 0x54, 0x6d, 0x96, 0x21, + 0x63, 0x29, 0x9d, 0x52, 0xce, 0xf4, 0x1e, 0x29, 0x6d, 0xa5, 0x9c, 0xb0, 0x76, 0xdb, + 0xe8, 0x99, 0x70, 0x4b, 0x61, 0x73, 0x0c, 0x19, 0xbd, 0x22, 0x1a, 0xd2, 0xbd, 0x29, + 0x81, 0xea, 0x95, 0x1b, 0xe0, 0x2c, 0x9f, 0x5b, 0xdf, 0x92, 0xd9, 0x87, 0x07, 0x46, + 0xb2, 0xa5, 0x8c, 0x3d, 0x18, 0xa7, 0xd3, 0xe5, 0xe2, 0xc6, 0x3a, 0xc2, 0x61, 0x58, + 0x37, 0xbe, 0x1c, 0x6f, 0xe0, 0x03, 0x65, 0x6c, 0x1b, 0x3d, 0x71, 0x50, 0x5f, 0x5e, + 0x21, 0x88, 0x10, 0x4e, 0x98, 0x91, 0x1b, 0x6a, 0x5e, 0x3f, 0x52, 0x82, 0xfa, 0xc0, + 0xc8, 0xfa, 0x1b, 0xa3, 0x6f, 0xfc, 0x07, 0xdc, 0x7a, 0x40, 0x9d, 0xf2, 0xeb, 0xa8, + 0xc7, 0x5f, 0x70, 0xbd, 0x59, 0xa6, 0xf0, 0x65, 0x1d, 0xc1, 0xb1, 0xb5, 0x96, 0xde, + 0x6a, 0xce, 0xc7, 0x78, 0xe2, 0xe3, 0x2f, 0x1e, 0xd4, 0x6d, 0xf7, 0xa9, 0xae, 0xf5, + 0x1d, 0xfe, 0x5a, 0xa5, 0x24, 0x36, 0xea, 0x07, 0xf5, 0x05, 0xd3, 0x39, 0xf2, 0x03, + 0x45, 0x86, 0x61, 0xc8, 0x3a, 0x9a, 0x5a, 0x27, 0xaa, 0x48, 0xb5, 0xec, 0x47, 0xf8, + 0xd6, 0x0d, 0x2a, 0x41, 0x00, 0x1f, 0xce, 0x30, 0xff, 0x75, 0x3a, 0x8a, 0x8c, 0xe4, + 0x92, 0xef, 0xcd, 0x1f, 0x75, 0x3b, 0x7f, 0x4a, 0xd7, 0x36, 0x62, 0x64, 0x47, 0xd1, + 0xb6, 0xf0, 0x7a, 0x61, 0x7d, 0x4b, 0xfc, 0xdb, 0x48, 0xaf, 0xef, 0x08, 0x2d, 0xae, + 0x1d, 0x76, 0x54, 0x4e, 0x8b, 0x63, 0xad, 0xcb, 0xb6, 0x0e, 0x14, 0x96, 0x69, 0x32, + 0x60, 0xc7, 0x20, 0xe6, 0x72, 0x1e, 0x00, 0x20, 0xef, 0xa3, 0xf8, 0xd8, 0x8d, 0x15, + 0xb5, 0xaa, 0x48, 0xa1, 0xb2, 0x2c, ], ock: [ - 0x91, 0x36, 0x59, 0x30, 0x9e, 0xcf, 0xcd, 0xfd, 0x7e, 0x0c, 0xef, 0x23, 0xf8, 0x80, - 0xae, 0x4c, 0xf4, 0xd8, 0xcf, 0x67, 0x78, 0xb9, 0xc4, 0xe6, 0xf4, 0xc7, 0x71, 0x7b, - 0xf5, 0xca, 0xf0, 0x9e, + 0xab, 0xd0, 0xc2, 0x46, 0x97, 0xe4, 0x5b, 0x8b, 0xc4, 0x83, 0x0f, 0xb1, 0x46, 0x53, + 0x2e, 0xa0, 0xac, 0x84, 0x55, 0x81, 0xca, 0x35, 0x39, 0xd3, 0x41, 0x24, 0x73, 0x54, + 0x09, 0xd0, 0x15, 0xac, ], op: [ 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, - 0x4a, 0xd7, 0xc7, 0x84, 0x68, 0x65, 0x87, 0xce, 0x53, 0xc3, 0x39, 0xf9, 0xce, 0xcf, - 0x4d, 0x80, 0x4a, 0x17, 0x09, 0x39, 0x2b, 0x6a, 0xb1, 0x08, 0xea, 0x2c, 0x57, 0x79, - 0x92, 0x1c, 0xd5, 0xda, 0x8a, 0x6e, 0x1a, 0x08, + 0x4a, 0xd7, 0xc7, 0x84, 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, + 0xdd, 0x73, 0x4d, 0x0e, 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, + 0x22, 0xc0, 0x61, 0xe0, 0xbd, 0xc9, 0xce, 0x14, ], c_out: [ - 0x4d, 0xf8, 0xda, 0x22, 0xec, 0x17, 0xf4, 0x16, 0xe0, 0x59, 0x1a, 0xac, 0xc1, 0x6b, - 0x6d, 0xd2, 0xbb, 0xbf, 0x47, 0xbe, 0x04, 0x30, 0x3d, 0xc8, 0x85, 0xd3, 0x5a, 0xc3, - 0xf9, 0x92, 0x3e, 0xea, 0x41, 0xf3, 0x6b, 0x3a, 0x4a, 0x5c, 0x5e, 0x73, 0x3e, 0x32, - 0x6e, 0x96, 0xdb, 0xe5, 0x5e, 0xf9, 0xe7, 0xe8, 0x42, 0x27, 0x0c, 0xbf, 0x46, 0x7c, - 0xdc, 0x16, 0x0e, 0xbf, 0x4f, 0x10, 0x9a, 0xd6, 0x92, 0x0a, 0x6a, 0xed, 0x4a, 0x01, - 0x71, 0xd9, 0x06, 0xe3, 0xe8, 0x13, 0x32, 0xe6, 0xc5, 0x61, - ], + 0xea, 0xdf, 0x7e, 0xeb, 0x10, 0x2d, 0xb1, 0x88, 0x58, 0x54, 0xc2, 0x9e, 0xb7, 0xb0, + 0x5c, 0x7c, 0x96, 0xbb, 0xb8, 0x90, 0x00, 0x2c, 0x4e, 0xd1, 0x14, 0xed, 0x62, 0xf5, + 0xf9, 0xcc, 0xb4, 0x41, 0x6b, 0x5e, 0xdd, 0xd9, 0xad, 0xb5, 0x5c, 0xe9, 0xc7, 0xa0, + 0xd8, 0x44, 0x2b, 0xbc, 0x8a, 0xfa, 0x5c, 0x77, 0xb9, 0x90, 0xad, 0x6d, 0x46, 0x12, + 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, + 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -515,34 +517,34 @@ pub(crate) fn test_vectors() -> Vec { 0xc5, 0xb3, 0x73, 0x3e, ], rho: [ - 0xbe, 0xf8, 0xcf, 0x16, 0x98, 0xe4, 0x78, 0x47, 0xd3, 0x8e, 0x1a, 0xaa, 0x88, 0x86, - 0x10, 0x77, 0xcd, 0xb5, 0xad, 0x4c, 0xf6, 0x6f, 0xe4, 0x2f, 0xd6, 0x52, 0x57, 0x81, - 0xb6, 0xd3, 0x4f, 0x1e, + 0xc8, 0x8d, 0x00, 0x84, 0x84, 0xc5, 0xd7, 0x98, 0x20, 0xab, 0x68, 0xc6, 0x7d, 0x08, + 0x36, 0x72, 0xb0, 0x7f, 0x72, 0x7d, 0x44, 0xd0, 0xcd, 0x14, 0x73, 0x88, 0x00, 0xf8, + 0x25, 0xb9, 0xff, 0x16, ], cmx: [ - 0xd8, 0x19, 0xa6, 0x37, 0x7a, 0xce, 0x33, 0xf9, 0x21, 0xf2, 0x29, 0xf9, 0x32, 0x86, - 0x6d, 0x9f, 0xcd, 0xb9, 0xd0, 0x42, 0x6a, 0xfa, 0xca, 0x9e, 0x60, 0x50, 0xb4, 0x7a, - 0x83, 0x19, 0xd6, 0x0d, + 0x0b, 0x74, 0x59, 0x61, 0x6f, 0xc6, 0x93, 0x95, 0xe6, 0x44, 0x36, 0xcf, 0x4a, 0xe9, + 0x44, 0x1d, 0x37, 0x4b, 0x29, 0x04, 0x9e, 0x4c, 0x86, 0x22, 0x3a, 0x03, 0x83, 0xf4, + 0xe0, 0x24, 0x69, 0x05, ], esk: [ - 0x59, 0xd1, 0x0a, 0x5b, 0x94, 0x15, 0x8a, 0x3f, 0x3a, 0x78, 0xb3, 0x5d, 0xa9, 0xc6, - 0x27, 0xbe, 0xdf, 0x7c, 0xfb, 0x84, 0x7e, 0x3e, 0x59, 0x86, 0xec, 0x8a, 0xd7, 0xf7, - 0x4c, 0xd9, 0xb2, 0x1b, + 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, 0xa1, 0xc4, 0x12, 0xbc, + 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, 0x95, 0x72, 0x92, 0x93, + 0x59, 0xe0, 0x4c, 0x3a, ], ephemeral_key: [ - 0x5b, 0xcb, 0xf9, 0xf1, 0xd7, 0xdd, 0x68, 0xe7, 0xcc, 0x6d, 0x6c, 0x78, 0x49, 0x50, - 0xd1, 0xc2, 0xe0, 0xbe, 0x6a, 0x84, 0xa7, 0xa8, 0x8d, 0x6f, 0x7a, 0x20, 0x98, 0xc3, - 0xdc, 0xae, 0x3f, 0x2f, + 0x0e, 0x04, 0xd8, 0x52, 0x5d, 0xd6, 0x8f, 0x7a, 0xe8, 0x68, 0xca, 0x81, 0x1e, 0x88, + 0x33, 0xa7, 0xf4, 0x7d, 0x7a, 0xad, 0xd3, 0x76, 0x03, 0xac, 0xe6, 0x07, 0xee, 0x6c, + 0x86, 0x6b, 0xce, 0x23, ], shared_secret: [ - 0x37, 0x35, 0x1c, 0xe2, 0x57, 0xb2, 0x79, 0x4d, 0x86, 0xa5, 0x3d, 0x26, 0x8d, 0xc9, - 0x00, 0x06, 0x40, 0xc2, 0x76, 0xf3, 0xf4, 0x65, 0xe1, 0xaa, 0x70, 0xbf, 0xde, 0xf4, - 0x99, 0xa3, 0xd7, 0xaa, + 0x4a, 0x7a, 0x54, 0xac, 0x00, 0x41, 0x95, 0x98, 0xb0, 0x76, 0x01, 0x53, 0xe2, 0x6a, + 0xcc, 0xd2, 0x15, 0x05, 0x24, 0x16, 0x65, 0x17, 0x13, 0xee, 0xa1, 0x89, 0x19, 0xf3, + 0xe2, 0x62, 0xd3, 0xb6, ], k_enc: [ - 0xea, 0x22, 0x99, 0x65, 0x39, 0xd3, 0x74, 0xda, 0x6a, 0x75, 0x34, 0x39, 0x5a, 0xe9, - 0x23, 0x36, 0xfc, 0xa7, 0x85, 0x11, 0x20, 0xdd, 0x1a, 0xe4, 0x9e, 0x45, 0xb3, 0x3e, - 0x0b, 0xed, 0xe9, 0xac, + 0x30, 0x62, 0x6d, 0x92, 0xeb, 0x62, 0x0f, 0xd4, 0xa9, 0x28, 0xb4, 0x3f, 0xd5, 0x50, + 0x69, 0x74, 0x71, 0x76, 0x7d, 0xe4, 0x49, 0x6c, 0xfd, 0xad, 0xb1, 0xda, 0x18, 0xfc, + 0x0c, 0xdd, 0x5a, 0xa6, ], p_enc: [ 0x02, 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, 0x47, 0xee, @@ -588,69 +590,70 @@ pub(crate) fn test_vectors() -> Vec { 0x55, 0x21, 0x93, 0xb1, ], c_enc: [ - 0x12, 0xd6, 0x64, 0xed, 0x05, 0xd6, 0x46, 0x26, 0x89, 0xd4, 0xf2, 0x4a, 0xee, 0x5a, - 0x4f, 0x0f, 0x32, 0x35, 0xff, 0x11, 0x0b, 0x2d, 0xf9, 0x9f, 0x67, 0xd8, 0xc5, 0xb3, - 0x68, 0xdd, 0x47, 0x69, 0xd8, 0x44, 0xd3, 0xdd, 0xa0, 0x3f, 0x58, 0xc5, 0x48, 0x63, - 0x62, 0xe8, 0x90, 0x81, 0xa5, 0xdf, 0xd0, 0xa6, 0x06, 0xa3, 0x91, 0x26, 0x4b, 0x56, - 0xca, 0x3a, 0xfc, 0x4f, 0xe0, 0xe4, 0xc3, 0x05, 0xf3, 0x07, 0x78, 0x09, 0x4a, 0x00, - 0xb7, 0x33, 0x4b, 0xdd, 0x82, 0x45, 0xac, 0x56, 0x0e, 0xf3, 0x29, 0xbc, 0x68, 0x97, - 0xd4, 0xd7, 0xba, 0x31, 0xac, 0x84, 0x54, 0x44, 0x1a, 0x15, 0xc8, 0xd3, 0xce, 0xcc, - 0x71, 0x32, 0xdf, 0x0d, 0x9d, 0x0e, 0xcf, 0x92, 0x84, 0x34, 0xa0, 0xd2, 0x8c, 0x1b, - 0x00, 0x48, 0x52, 0x01, 0xec, 0x33, 0xbe, 0x9a, 0x28, 0x74, 0xb4, 0x29, 0x6c, 0x04, - 0x22, 0xc7, 0xe7, 0xa0, 0xa3, 0xa2, 0x2e, 0xc7, 0xe7, 0x21, 0xa4, 0x79, 0x22, 0x8d, - 0xa2, 0x8b, 0x47, 0x37, 0xaf, 0x52, 0x06, 0xdf, 0x7d, 0x74, 0xe4, 0x84, 0xc4, 0xf7, - 0xa8, 0x56, 0xbe, 0x8c, 0xd0, 0x4b, 0x21, 0x26, 0xb5, 0x27, 0x11, 0xe7, 0xb0, 0xaf, - 0x75, 0xc7, 0x52, 0x84, 0xa1, 0x57, 0x20, 0x40, 0xe8, 0xad, 0xe5, 0x85, 0xe8, 0xa4, - 0x82, 0x80, 0x03, 0x59, 0x67, 0x46, 0xc4, 0x0c, 0x9d, 0x76, 0x0d, 0x92, 0x74, 0xb1, - 0x25, 0x42, 0x2b, 0x63, 0x48, 0x1a, 0x17, 0xff, 0xba, 0xb8, 0xc2, 0xde, 0x13, 0xb2, - 0x19, 0xf5, 0x8a, 0x35, 0x95, 0x2d, 0x88, 0x7a, 0xed, 0xe8, 0xe0, 0x2f, 0x10, 0x33, - 0x8c, 0x23, 0x98, 0x23, 0xfb, 0x43, 0x49, 0x51, 0x84, 0x47, 0x12, 0xf6, 0x8d, 0x6e, - 0x4f, 0xef, 0xae, 0x2b, 0x79, 0x5b, 0xa9, 0x78, 0xe9, 0x81, 0xc1, 0x09, 0x27, 0xab, - 0xbc, 0x16, 0x30, 0x66, 0xa0, 0xe9, 0x60, 0xb3, 0xb8, 0xa3, 0x26, 0xc0, 0x39, 0x85, - 0x81, 0x10, 0x93, 0x99, 0xf6, 0xed, 0x60, 0x44, 0x9a, 0xa8, 0x58, 0xd5, 0xdd, 0x27, - 0xdb, 0xf8, 0x89, 0x9f, 0x9c, 0x9a, 0x50, 0x20, 0x5f, 0x25, 0xd0, 0xcc, 0x50, 0xb2, - 0xde, 0xe3, 0x63, 0x54, 0xc5, 0xe4, 0x48, 0x4d, 0x36, 0xf6, 0x3c, 0x97, 0x63, 0xd8, - 0x41, 0xad, 0x5e, 0x00, 0x21, 0x63, 0x6a, 0x85, 0x7c, 0xfb, 0x79, 0xa5, 0x12, 0x3c, - 0x3d, 0xfb, 0x77, 0x3d, 0x0c, 0x1b, 0xeb, 0x9f, 0x90, 0xa9, 0x72, 0xd0, 0xfc, 0x80, - 0x5f, 0x65, 0x5d, 0x69, 0x40, 0x85, 0x23, 0xb9, 0x9b, 0x62, 0xa8, 0xfa, 0xbe, 0xf0, - 0xc0, 0x24, 0xf2, 0x1f, 0x50, 0xe4, 0xc1, 0x12, 0xe2, 0xfe, 0xdd, 0x58, 0xca, 0xe9, - 0x60, 0x9a, 0xc6, 0xf7, 0xcc, 0x79, 0x83, 0x86, 0xc9, 0xd9, 0x06, 0x42, 0x1c, 0xa5, - 0x7c, 0xf8, 0x1b, 0x09, 0x6b, 0xba, 0xda, 0x64, 0xd0, 0xee, 0x76, 0x95, 0x18, 0x9d, - 0x5f, 0xb1, 0x7a, 0xe2, 0x53, 0x1d, 0xbb, 0x2c, 0x00, 0x58, 0x5a, 0x26, 0xa6, 0x8c, - 0x27, 0xf9, 0x77, 0x77, 0x84, 0x1a, 0x3e, 0x39, 0x30, 0xc7, 0x0f, 0xc3, 0xfa, 0x8e, - 0x2b, 0x7f, 0xc2, 0x1e, 0x87, 0xcf, 0x9f, 0x63, 0xb3, 0x63, 0xb8, 0x8d, 0xaa, 0x1f, - 0xb6, 0x7b, 0xda, 0xe8, 0xe5, 0x5b, 0x68, 0x51, 0x6d, 0x19, 0xdf, 0xef, 0xec, 0x9b, - 0x3d, 0x38, 0xe6, 0xe1, 0xd0, 0xa6, 0xe4, 0x51, 0xd6, 0xd1, 0xf5, 0x2d, 0x1f, 0x96, - 0xdd, 0x0d, 0x53, 0x6d, 0x68, 0xd2, 0x69, 0x86, 0x70, 0x9f, 0x41, 0xe7, 0x60, 0x74, - 0x05, 0x5b, 0xf7, 0x52, 0xbf, 0x38, 0x86, 0x92, 0xc8, 0x2c, 0xfd, 0xa1, 0xeb, 0xb0, - 0x17, 0x8b, 0x8e, 0x0c, 0x85, 0xad, 0x7b, 0x15, 0x99, 0x14, 0x42, 0x8e, 0x30, 0x21, - 0xda, 0xe3, 0x01, 0x0d, 0x65, 0x6c, 0x10, 0x36, 0xf4, 0xa5, 0x7e, 0x7f, 0xad, 0xe0, - 0xfc, 0x32, 0x2a, 0xa6, 0xfd, 0xde, 0x71, 0x4a, 0x8c, 0x53, 0x78, 0x79, 0xe7, 0x04, - 0x41, 0x6f, 0x51, 0x04, 0xdb, 0xbc, 0x8f, 0xf2, 0x42, 0xc1, 0x6d, 0x2d, 0xf4, 0xa8, - 0x41, 0xeb, 0x6b, 0x45, 0x3a, 0x12, 0x83, 0xf6, 0x5f, 0xe1, 0x0d, 0x70, 0xc8, 0x76, - 0x41, 0x8e, 0x44, 0x4a, 0xb3, 0x1b, 0x93, 0x71, 0xa2, 0x7d, 0x36, 0xd8, 0x6e, 0x8f, - 0x1c, 0x32, 0x77, 0xca, 0xfd, 0xf8, + 0x81, 0x56, 0x2d, 0xbe, 0xf7, 0xbb, 0x35, 0x3a, 0x62, 0xe7, 0xc8, 0x1e, 0xbe, 0x68, + 0x15, 0x6c, 0xb7, 0x5c, 0x5c, 0x7e, 0x3d, 0x96, 0xbb, 0xcd, 0x7d, 0xaf, 0xf5, 0x0c, + 0xb0, 0x95, 0x7d, 0x33, 0xdd, 0x99, 0x77, 0x9f, 0x7d, 0x3d, 0x72, 0xb1, 0x8d, 0xeb, + 0x7a, 0x69, 0x75, 0x10, 0xe0, 0x13, 0x5b, 0x8d, 0xf4, 0x83, 0xa4, 0xd7, 0x1d, 0x1a, + 0xb1, 0x08, 0x09, 0x6e, 0x76, 0x08, 0x91, 0xd5, 0x31, 0x07, 0xf0, 0x3d, 0xea, 0x4a, + 0xe8, 0xe4, 0xd3, 0xfe, 0xbd, 0x98, 0x77, 0xf8, 0x57, 0x0a, 0xa3, 0x09, 0xd0, 0x97, + 0xd4, 0x23, 0xbb, 0x76, 0x3f, 0xb3, 0xe7, 0xe9, 0xbe, 0x3c, 0x8f, 0xa0, 0x34, 0xc0, + 0x1d, 0x66, 0x4f, 0x47, 0xa0, 0xe7, 0x13, 0x3c, 0xa1, 0x1a, 0x48, 0xcd, 0x0e, 0xea, + 0x46, 0x35, 0xfa, 0x77, 0x25, 0x0a, 0x17, 0xbd, 0xf7, 0xb7, 0x32, 0xc8, 0x98, 0x46, + 0x51, 0x57, 0x4f, 0xd4, 0xf9, 0x9f, 0x7a, 0xa0, 0xdb, 0x28, 0xc2, 0x97, 0x31, 0x52, + 0xbf, 0x42, 0x6e, 0xe9, 0xa4, 0xd8, 0x41, 0xa9, 0x1d, 0x5d, 0x33, 0x57, 0x18, 0xee, + 0xcb, 0xc9, 0xc8, 0xb2, 0xa2, 0x00, 0x15, 0x70, 0xfe, 0x8b, 0x77, 0x91, 0x43, 0xdf, + 0x22, 0x95, 0x98, 0xa5, 0xbe, 0x25, 0x48, 0xcf, 0x35, 0x84, 0x25, 0x18, 0xcc, 0x1d, + 0xbc, 0x78, 0xcc, 0x2f, 0x0f, 0xc8, 0xea, 0x35, 0x7c, 0xe6, 0xc1, 0x7e, 0xb9, 0x7c, + 0x61, 0x38, 0xd5, 0x3e, 0x6c, 0x8e, 0x00, 0xf0, 0x7f, 0x80, 0x01, 0x25, 0x18, 0x2b, + 0x25, 0xa5, 0xe8, 0x75, 0xc5, 0x37, 0x72, 0x09, 0x52, 0x72, 0x22, 0x37, 0x1f, 0x72, + 0xbf, 0xbd, 0x46, 0x28, 0x44, 0xab, 0x06, 0xf3, 0xb3, 0xa1, 0xeb, 0xa3, 0x44, 0x23, + 0xb6, 0x9a, 0xbf, 0x5d, 0xe6, 0x64, 0xba, 0x83, 0xcd, 0x43, 0xb6, 0xa8, 0xe9, 0xd5, + 0xb7, 0xc5, 0x2a, 0xdb, 0x86, 0x15, 0x04, 0x1b, 0x90, 0xd9, 0x08, 0x83, 0x1a, 0x6f, + 0xf9, 0x2d, 0xb4, 0x8a, 0x14, 0xac, 0x4d, 0xfa, 0x67, 0xd0, 0x2c, 0x72, 0xe0, 0xc8, + 0x63, 0x15, 0x7d, 0x98, 0xf8, 0xf5, 0x45, 0x37, 0x92, 0x97, 0x43, 0xc9, 0x69, 0xbc, + 0x91, 0xc2, 0xc1, 0x37, 0x52, 0x04, 0x98, 0x3c, 0x99, 0x99, 0x97, 0x5f, 0xfa, 0x5e, + 0xe5, 0xfe, 0x1f, 0x69, 0x71, 0x99, 0x40, 0x5f, 0x09, 0x66, 0xe3, 0x1f, 0x34, 0xe1, + 0x52, 0x38, 0x44, 0x38, 0x18, 0x44, 0x98, 0x2b, 0x2c, 0x3b, 0x49, 0xa2, 0x09, 0xff, + 0xa3, 0xce, 0xe9, 0x79, 0xa8, 0x5b, 0x19, 0xb8, 0x50, 0xf4, 0x1d, 0xcc, 0xc4, 0x63, + 0xe2, 0x2e, 0x24, 0xa3, 0x04, 0x9d, 0x37, 0xb1, 0xfb, 0x37, 0x0d, 0xeb, 0xdd, 0xf4, + 0xde, 0x05, 0x46, 0x24, 0x5e, 0x4f, 0x02, 0xa9, 0x84, 0x98, 0xaf, 0x53, 0x2e, 0x27, + 0xac, 0xae, 0x5c, 0x7e, 0xd1, 0x43, 0xe6, 0xe9, 0xcc, 0xfa, 0x74, 0x35, 0x16, 0x02, + 0x16, 0x57, 0xac, 0xb2, 0x5e, 0x44, 0x47, 0x84, 0x5c, 0x5f, 0x9c, 0x59, 0x64, 0x60, + 0x7c, 0x4a, 0x78, 0x72, 0x1d, 0x98, 0x1a, 0x7f, 0xf2, 0xfd, 0xf6, 0xc0, 0x33, 0x62, + 0x8b, 0xff, 0xd6, 0xf0, 0xb8, 0xde, 0x0c, 0xd6, 0x35, 0xec, 0x22, 0xf8, 0xb5, 0x0e, + 0xd6, 0x37, 0xfe, 0x4e, 0x00, 0xf9, 0xd3, 0xc3, 0xd4, 0xf1, 0x81, 0x0b, 0x09, 0xb7, + 0x5c, 0x96, 0xe2, 0xfc, 0xf1, 0x11, 0x85, 0x31, 0x7e, 0xdf, 0xa3, 0x9d, 0x19, 0x25, + 0xde, 0xd8, 0x14, 0xdd, 0xe0, 0xef, 0x00, 0xa3, 0xfb, 0x47, 0xaf, 0x5d, 0x81, 0x20, + 0x94, 0xaf, 0x13, 0xd0, 0x1c, 0x98, 0x56, 0x9f, 0xf7, 0x73, 0x57, 0x87, 0xfa, 0x9b, + 0xd0, 0x1f, 0xa0, 0x69, 0x28, 0x27, 0x5f, 0xdd, 0x10, 0x38, 0x96, 0x5f, 0xb0, 0x6f, + 0xb3, 0x5e, 0xdb, 0x73, 0x80, 0xdd, 0x3c, 0x42, 0x41, 0x9e, 0x0c, 0x0e, 0xde, 0x4c, + 0x48, 0x6a, 0x9d, 0xb4, 0x95, 0x38, 0x86, 0xae, 0xc6, 0xad, 0x30, 0x70, 0x28, 0xeb, + 0x26, 0xa3, 0x7e, 0xf4, 0x71, 0x56, 0x7a, 0xd4, 0xbd, 0x4e, 0xaa, 0xb7, 0xa8, 0x2c, + 0xb0, 0xd6, 0xb5, 0xf0, 0x5e, 0x89, 0x4e, 0x53, 0x25, 0x82, 0x1d, 0x92, 0xbe, 0xd2, + 0xb8, 0x6f, 0xb2, 0x43, 0x37, 0xd5, 0x79, 0x28, 0x8f, 0x6d, 0xf7, 0x34, 0x77, 0x1d, + 0x9e, 0xf8, 0x35, 0x8b, 0xa9, 0x1a, ], ock: [ - 0xca, 0x6f, 0x98, 0xe6, 0xcf, 0x9f, 0xc3, 0x6a, 0xf5, 0xf6, 0x98, 0x82, 0x74, 0x2d, - 0x06, 0xec, 0x5d, 0x29, 0xac, 0x2a, 0x02, 0x89, 0x44, 0xa2, 0x01, 0x89, 0xd5, 0x1c, - 0x8a, 0x9b, 0xdc, 0xd6, + 0xb6, 0x36, 0xc3, 0x9a, 0x6b, 0xad, 0x22, 0x63, 0xb2, 0x44, 0x1e, 0xd5, 0xbb, 0xdb, + 0x01, 0x35, 0x88, 0xfb, 0x46, 0x27, 0x01, 0xe6, 0xf8, 0x76, 0x64, 0x6c, 0x8c, 0x17, + 0xfa, 0x2e, 0xfd, 0xe8, ], op: [ 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, - 0x15, 0x37, 0x14, 0x0d, 0x59, 0xd1, 0x0a, 0x5b, 0x94, 0x15, 0x8a, 0x3f, 0x3a, 0x78, - 0xb3, 0x5d, 0xa9, 0xc6, 0x27, 0xbe, 0xdf, 0x7c, 0xfb, 0x84, 0x7e, 0x3e, 0x59, 0x86, - 0xec, 0x8a, 0xd7, 0xf7, 0x4c, 0xd9, 0xb2, 0x1b, + 0x15, 0x37, 0x14, 0x0d, 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, + 0xa1, 0xc4, 0x12, 0xbc, 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, + 0x95, 0x72, 0x92, 0x93, 0x59, 0xe0, 0x4c, 0x3a, ], c_out: [ - 0xa9, 0x5e, 0x1a, 0x22, 0x45, 0x65, 0x29, 0x5e, 0x9b, 0x55, 0x3a, 0xdd, 0xe8, 0xb0, - 0x14, 0x47, 0x5c, 0x68, 0x7b, 0x5d, 0x13, 0x49, 0xc1, 0xdf, 0x8a, 0xd4, 0xb7, 0xcf, - 0xd3, 0xdf, 0xc1, 0x00, 0x6c, 0x7c, 0x37, 0xde, 0x67, 0x6d, 0x6f, 0xde, 0x31, 0x8e, - 0x2f, 0xdf, 0xcc, 0x2e, 0x2e, 0x23, 0x2c, 0xc5, 0xf8, 0x85, 0x28, 0x39, 0xe7, 0xef, - 0xab, 0x8b, 0x20, 0x0e, 0xbc, 0x6a, 0x4d, 0xf8, 0x2a, 0x75, 0x21, 0xce, 0x0f, 0x38, - 0x4f, 0xe2, 0x7a, 0x0d, 0xec, 0x59, 0xe9, 0xd2, 0xc0, 0xe3, - ], + 0x46, 0xba, 0x14, 0xf8, 0x3f, 0xf5, 0xab, 0x76, 0x0f, 0x14, 0x20, 0xeb, 0xde, 0xd9, + 0x86, 0xfd, 0x93, 0x78, 0x27, 0xbc, 0x05, 0x69, 0x2e, 0xca, 0xdb, 0x65, 0x2e, 0xbb, + 0xc8, 0xf6, 0xd9, 0xb5, 0x2e, 0xc3, 0x97, 0x87, 0xd8, 0xeb, 0xdd, 0x50, 0x6c, 0xa1, + 0xa8, 0x5d, 0xc3, 0xd5, 0xba, 0x4c, 0x5b, 0x41, 0x52, 0x61, 0xb0, 0x75, 0x3a, 0xc1, + 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, + 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -724,34 +727,34 @@ pub(crate) fn test_vectors() -> Vec { 0x32, 0xb5, 0x0e, 0x96, ], rho: [ - 0x18, 0x89, 0x8e, 0x75, 0x21, 0x7b, 0x32, 0x9b, 0x3a, 0x56, 0x7b, 0x09, 0x37, 0x89, - 0xa4, 0xd8, 0x19, 0xcd, 0xb0, 0x34, 0x88, 0xb8, 0x10, 0xda, 0x22, 0x0c, 0x3f, 0x59, - 0xba, 0x03, 0x39, 0x26, + 0xa9, 0x0a, 0x9b, 0x8a, 0xb1, 0x35, 0x9d, 0xc9, 0x6b, 0xda, 0xe9, 0x0e, 0x52, 0x74, + 0x78, 0x8c, 0xb0, 0xc4, 0x26, 0xef, 0xf2, 0x60, 0x43, 0x61, 0x85, 0x39, 0x8b, 0xff, + 0xf5, 0x0e, 0x92, 0x37, ], cmx: [ - 0x23, 0xad, 0xc3, 0xbf, 0x35, 0x0e, 0xb0, 0x84, 0xbd, 0x28, 0xbc, 0x2d, 0xcf, 0xb7, - 0x98, 0x3f, 0xf6, 0xb3, 0xb6, 0xf2, 0xeb, 0x2d, 0x6f, 0x12, 0x4f, 0xfc, 0x46, 0x85, - 0xab, 0xe8, 0xde, 0x3a, + 0x05, 0xb5, 0xe3, 0x20, 0x76, 0xda, 0xe0, 0x94, 0x83, 0x35, 0xac, 0x3d, 0x65, 0x1c, + 0x6d, 0xbe, 0xa6, 0x4c, 0xe9, 0x11, 0x42, 0x3e, 0x2f, 0x2c, 0x7c, 0x1b, 0xdf, 0xa6, + 0xb1, 0x41, 0x41, 0x30, ], esk: [ - 0x34, 0x39, 0x22, 0x52, 0xc9, 0xcc, 0x9f, 0x45, 0x4b, 0x54, 0x2c, 0xf1, 0xb8, 0x88, - 0xb3, 0xab, 0x02, 0xe6, 0x05, 0xa8, 0xda, 0x26, 0x10, 0x7d, 0x98, 0x02, 0xf1, 0x53, - 0x6a, 0x9e, 0x9f, 0x2b, + 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, 0xfe, 0x47, 0x9a, 0x1e, + 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, 0x92, 0x3a, 0x5d, 0x00, + 0xcb, 0x52, 0xa6, 0x13, ], ephemeral_key: [ - 0x91, 0xaf, 0x13, 0x8e, 0xd9, 0x95, 0x44, 0x66, 0x95, 0x16, 0x1b, 0x14, 0x2d, 0xc2, - 0xde, 0x59, 0xac, 0x23, 0x05, 0xec, 0xbe, 0xc6, 0x29, 0x33, 0xf5, 0x2f, 0x2a, 0xa1, - 0xf9, 0xb2, 0x71, 0x86, + 0x86, 0xee, 0x66, 0xa6, 0xc7, 0xd9, 0xb5, 0xc4, 0xf0, 0xe2, 0xd2, 0xa0, 0xe1, 0x56, + 0x1e, 0x2a, 0xfa, 0x55, 0x41, 0xa7, 0x24, 0xee, 0x02, 0x7f, 0xc7, 0x0b, 0xb7, 0xe8, + 0x0a, 0x2c, 0x60, 0x98, ], shared_secret: [ - 0xe1, 0xd3, 0xaf, 0x73, 0x6a, 0xb9, 0xc6, 0x11, 0x6f, 0x46, 0x8f, 0x91, 0x66, 0x80, - 0x63, 0x20, 0x35, 0x0f, 0x7e, 0x73, 0x51, 0x3b, 0xa6, 0x05, 0x50, 0xeb, 0x2d, 0xf0, - 0x1f, 0xf7, 0x83, 0x2d, + 0x88, 0xd1, 0x38, 0x2c, 0x14, 0x42, 0x02, 0xd0, 0xd7, 0x55, 0x75, 0x87, 0xb0, 0xd5, + 0xd0, 0x21, 0x69, 0x29, 0x2a, 0x25, 0x05, 0x43, 0xcb, 0x0a, 0x06, 0xc3, 0x4f, 0x45, + 0x2f, 0x7b, 0x3b, 0x36, ], k_enc: [ - 0xb4, 0x3e, 0x43, 0x3e, 0x16, 0x45, 0xeb, 0x51, 0x5e, 0x4a, 0x4c, 0x7d, 0x10, 0xc9, - 0x3d, 0x08, 0xf2, 0xf1, 0xc3, 0x30, 0x95, 0xbf, 0x8c, 0x80, 0x0a, 0x04, 0x17, 0x62, - 0xab, 0x5c, 0xf8, 0x2c, + 0xe3, 0x73, 0xd8, 0x6e, 0xc9, 0xdd, 0xdd, 0x64, 0x5d, 0x9a, 0x6d, 0x06, 0xef, 0xce, + 0x22, 0xb8, 0x96, 0x42, 0x1d, 0x57, 0xa4, 0x4d, 0x37, 0xa6, 0x50, 0x4a, 0x5d, 0x19, + 0xdf, 0x21, 0x73, 0x73, ], p_enc: [ 0x02, 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, 0xfa, 0x3f, @@ -797,69 +800,70 @@ pub(crate) fn test_vectors() -> Vec { 0x72, 0x65, 0x57, 0x53, ], c_enc: [ - 0x27, 0x62, 0x0d, 0xf5, 0xdb, 0x17, 0x76, 0x6e, 0xbd, 0x9a, 0x99, 0xd6, 0x9a, 0x9a, - 0x49, 0x38, 0x73, 0x21, 0xf0, 0xc9, 0x47, 0x25, 0x23, 0x57, 0xb5, 0xb7, 0x48, 0x49, - 0x38, 0xe3, 0xf5, 0xff, 0x9f, 0x32, 0x0e, 0x80, 0x6c, 0x4b, 0x54, 0xc3, 0x6e, 0x41, - 0x2e, 0x8a, 0x6e, 0xad, 0xe3, 0x5b, 0x83, 0x01, 0xf7, 0x34, 0xf3, 0x71, 0x2e, 0x6a, - 0xac, 0xe6, 0x99, 0xf5, 0x9e, 0x11, 0x2a, 0x7b, 0xf5, 0x44, 0x59, 0xdc, 0x5d, 0x9f, - 0x7b, 0xbf, 0x3b, 0x9f, 0x74, 0x6c, 0x45, 0xbb, 0xed, 0x69, 0xa4, 0x25, 0x1b, 0x29, - 0xf3, 0xd2, 0x15, 0xc2, 0x9f, 0x76, 0x1c, 0x7d, 0x05, 0x88, 0x19, 0xf0, 0xdd, 0x4e, - 0x70, 0x71, 0xb0, 0x77, 0xcb, 0x00, 0xcb, 0x93, 0x62, 0xa4, 0x98, 0x16, 0x88, 0x0d, - 0x49, 0xb7, 0x11, 0xf9, 0x20, 0x65, 0xf1, 0x53, 0x2e, 0x58, 0x18, 0x0b, 0xbd, 0xb4, - 0x91, 0xdb, 0xbb, 0x96, 0x8a, 0x09, 0xb5, 0x63, 0xce, 0x1d, 0x29, 0x87, 0x6f, 0xd0, - 0x52, 0x6d, 0x65, 0xda, 0x67, 0x27, 0xad, 0x40, 0xf9, 0x64, 0x02, 0xf9, 0x9a, 0xa5, - 0xac, 0x06, 0x42, 0x51, 0xc4, 0x65, 0xe3, 0xc7, 0xdb, 0x1f, 0xfe, 0xef, 0xac, 0xd7, - 0xf5, 0x1b, 0xa4, 0xf1, 0x9c, 0x6c, 0x17, 0x87, 0xa0, 0xff, 0xb4, 0x9d, 0xbb, 0x7b, - 0x0a, 0x2b, 0x15, 0x64, 0x03, 0xd6, 0x6c, 0x22, 0x13, 0xe5, 0x1d, 0x58, 0xea, 0xef, - 0xe8, 0x6d, 0x5d, 0xef, 0x0d, 0x24, 0xb7, 0xf2, 0xf8, 0xc1, 0x10, 0x32, 0x9a, 0x3a, - 0x73, 0xcb, 0x33, 0x50, 0x14, 0x0e, 0x6b, 0xf7, 0x2c, 0xb6, 0xaa, 0x22, 0x2d, 0xef, - 0x5a, 0x47, 0xe2, 0x1a, 0xf0, 0xb9, 0xae, 0xeb, 0x74, 0x8c, 0x01, 0xc6, 0x7a, 0xb6, - 0xc9, 0xfd, 0x6e, 0x53, 0x6a, 0x0d, 0x92, 0x76, 0x61, 0x51, 0xb1, 0xac, 0x7c, 0xc9, - 0x85, 0x5c, 0xa9, 0x8d, 0xea, 0x74, 0x85, 0x14, 0xef, 0xee, 0x89, 0xe8, 0x9a, 0x01, - 0x68, 0xf5, 0xdd, 0xf4, 0xac, 0x2b, 0x7c, 0xe1, 0xc9, 0xc2, 0x92, 0xfb, 0xef, 0x2f, - 0x45, 0x51, 0xa8, 0x88, 0xc3, 0x34, 0x5c, 0x65, 0x92, 0x30, 0x39, 0xfc, 0x21, 0xf7, - 0x31, 0x55, 0x9b, 0xd9, 0x24, 0xbc, 0x2c, 0x15, 0x5b, 0xc0, 0xbe, 0x80, 0x38, 0x4a, - 0x9e, 0x49, 0xbd, 0xa6, 0x9a, 0x70, 0x6b, 0x1a, 0xd6, 0xa2, 0x62, 0xab, 0xc6, 0x26, - 0x50, 0x77, 0x2f, 0xd7, 0xea, 0xbc, 0x3f, 0x75, 0xa9, 0xac, 0xca, 0xa2, 0x8b, 0xcd, - 0xea, 0x65, 0xf9, 0x4e, 0x16, 0xcc, 0x3d, 0x05, 0x38, 0xe5, 0x49, 0x86, 0x0a, 0x60, - 0x12, 0x5b, 0xb4, 0xbc, 0x0c, 0x23, 0xe3, 0x22, 0x27, 0x68, 0x2c, 0x09, 0xb5, 0xaa, - 0x30, 0x4a, 0x16, 0x09, 0x2a, 0xd4, 0xa3, 0xe2, 0xf6, 0x28, 0x3c, 0x38, 0x51, 0x80, - 0x6e, 0x72, 0x17, 0x3f, 0x7d, 0x32, 0x97, 0xed, 0x92, 0xe5, 0x32, 0x40, 0x39, 0xa7, - 0x31, 0x4f, 0x5f, 0xb7, 0x38, 0x6e, 0x09, 0x94, 0xf5, 0x2f, 0x8c, 0xcc, 0xf1, 0x87, - 0xd6, 0x20, 0x41, 0x0c, 0xce, 0x9d, 0x0b, 0x91, 0x93, 0xac, 0xec, 0x6d, 0x4c, 0x9b, - 0xd3, 0x4e, 0x08, 0x80, 0x58, 0x0a, 0xbe, 0xae, 0xd9, 0x7c, 0xb7, 0x80, 0x0f, 0x6a, - 0xbc, 0x67, 0xc2, 0x5c, 0x49, 0x19, 0x2e, 0x37, 0xdc, 0xf3, 0x3d, 0x1a, 0x59, 0x16, - 0x47, 0x5a, 0xe9, 0x99, 0x90, 0xd8, 0x29, 0xc1, 0xd5, 0x9e, 0x69, 0x2f, 0x47, 0x36, - 0x93, 0xbc, 0xe3, 0x58, 0x5a, 0xec, 0xd3, 0xc1, 0x3b, 0xae, 0x15, 0xcb, 0xef, 0xf2, - 0x98, 0x52, 0x2a, 0xab, 0xf4, 0x6b, 0xea, 0x3a, 0xbf, 0x63, 0x30, 0xa5, 0x6e, 0x37, - 0x24, 0x51, 0x81, 0x32, 0xce, 0x94, 0x39, 0x41, 0x6a, 0x28, 0xe9, 0x52, 0x0d, 0xdf, - 0x64, 0x17, 0x00, 0xb4, 0x6f, 0x37, 0x49, 0x50, 0xf3, 0x27, 0xaf, 0x3d, 0x0b, 0x3d, - 0x3b, 0x3f, 0x61, 0xa8, 0x84, 0xcf, 0x4f, 0x82, 0x02, 0x56, 0xfb, 0x91, 0x65, 0xdc, - 0xa0, 0xe4, 0x32, 0x60, 0xfc, 0xb5, 0x63, 0xef, 0x1a, 0xb4, 0xe7, 0x12, 0xef, 0x07, - 0x23, 0xd6, 0x75, 0x90, 0xa4, 0xff, 0xc3, 0x66, 0xc4, 0xa7, 0x92, 0x50, 0x29, 0x93, - 0x1b, 0xf0, 0x87, 0x3d, 0xac, 0xaa, 0xe9, 0x38, 0x5d, 0x9a, 0xd9, 0x1a, 0xed, 0x75, - 0x93, 0x9d, 0x8b, 0xd1, 0xaf, 0x5d, + 0xe7, 0x67, 0x81, 0xae, 0x63, 0x84, 0x1f, 0xff, 0xea, 0x30, 0x21, 0x96, 0x15, 0x94, + 0xc2, 0x2a, 0x87, 0x20, 0xc7, 0xd8, 0xaa, 0x80, 0x8b, 0xc8, 0x6e, 0x71, 0xa3, 0x6a, + 0xd7, 0xf8, 0x6f, 0xf8, 0x7c, 0x07, 0xd3, 0xc6, 0x50, 0xa0, 0x8e, 0x23, 0xe9, 0xb5, + 0x4f, 0x00, 0xb4, 0x0b, 0xa0, 0x15, 0x91, 0x69, 0xdf, 0xca, 0x34, 0xc1, 0x40, 0xce, + 0x93, 0x40, 0x19, 0xb2, 0xea, 0xa8, 0xea, 0x84, 0x35, 0x80, 0xb3, 0x5f, 0x14, 0xea, + 0x51, 0x92, 0xde, 0x8a, 0x12, 0xf9, 0xab, 0xc9, 0x06, 0x10, 0x15, 0xe1, 0x47, 0x9e, + 0xf9, 0x8d, 0x19, 0xa5, 0x34, 0xe9, 0xe4, 0x61, 0x64, 0xc3, 0xca, 0xc4, 0xeb, 0x54, + 0x26, 0x4c, 0xed, 0xcd, 0x83, 0xaf, 0xc2, 0xac, 0x2e, 0x08, 0x7e, 0x39, 0xdf, 0xba, + 0xe7, 0x6b, 0xd5, 0x50, 0xcc, 0x64, 0xa4, 0x04, 0xd2, 0x0c, 0x22, 0xca, 0x00, 0x3b, + 0xf7, 0x5b, 0x12, 0xfb, 0xb8, 0xc7, 0x15, 0x13, 0x72, 0x70, 0x0b, 0x43, 0x9b, 0x3e, + 0x06, 0x57, 0xec, 0xc3, 0x07, 0x70, 0x8f, 0xc3, 0x74, 0x94, 0xbd, 0x06, 0x39, 0xe8, + 0xe1, 0xea, 0xea, 0x37, 0x8f, 0x27, 0xa1, 0x35, 0x74, 0xb7, 0x1f, 0xa4, 0x88, 0x3b, + 0x80, 0x71, 0x2c, 0x7b, 0xeb, 0x5c, 0x30, 0x5f, 0x8d, 0x67, 0xe9, 0x19, 0x97, 0xf8, + 0x03, 0x19, 0xdd, 0xb1, 0x15, 0xb9, 0x51, 0x23, 0x89, 0x7a, 0xae, 0x5f, 0x2d, 0x14, + 0xff, 0xcf, 0xac, 0x7f, 0x65, 0x49, 0xca, 0x54, 0x8f, 0x6e, 0xab, 0xdf, 0x74, 0x81, + 0x70, 0x27, 0xd4, 0x2d, 0x92, 0xd5, 0xcd, 0xf8, 0x8e, 0xd8, 0xd5, 0x11, 0xd1, 0xb5, + 0xc4, 0x32, 0x2f, 0x77, 0x79, 0x74, 0x88, 0x6c, 0x0e, 0xd0, 0x13, 0x99, 0x18, 0x0a, + 0xfa, 0x59, 0x7d, 0xd2, 0xb7, 0x7c, 0x58, 0xb2, 0x7c, 0x8a, 0x61, 0x20, 0x69, 0xe3, + 0x86, 0xad, 0x63, 0x4c, 0xb0, 0x17, 0xa8, 0xe9, 0xf4, 0x8e, 0x37, 0xc4, 0x3e, 0xe8, + 0x73, 0x3a, 0x0a, 0xcb, 0x69, 0xf8, 0xed, 0x9f, 0x6f, 0x30, 0x5f, 0x3b, 0xd1, 0xe9, + 0x82, 0xb9, 0x4b, 0x1e, 0x51, 0xf4, 0xba, 0x98, 0x5b, 0x20, 0xec, 0x97, 0x4a, 0xc9, + 0xa7, 0x93, 0xaa, 0x26, 0x4d, 0x61, 0x5b, 0x9d, 0xea, 0x48, 0x59, 0xa4, 0xd4, 0xca, + 0xa7, 0x0d, 0x7a, 0x6b, 0x65, 0x30, 0x76, 0x85, 0xab, 0x53, 0x4e, 0x54, 0x55, 0x63, + 0x1f, 0x6d, 0x68, 0xa4, 0x51, 0xd8, 0xaf, 0x2d, 0x41, 0x82, 0x52, 0x80, 0x0f, 0x68, + 0x42, 0x31, 0xaf, 0xc2, 0x6d, 0x1f, 0xef, 0xc4, 0x03, 0xd7, 0x5f, 0x2e, 0x12, 0x0f, + 0x5b, 0xe2, 0xb6, 0x74, 0x48, 0x60, 0x09, 0x26, 0x7c, 0xbc, 0x0c, 0xb0, 0x01, 0xbb, + 0x47, 0xf0, 0xff, 0x46, 0x97, 0xea, 0xf5, 0x3d, 0xc9, 0x9c, 0x10, 0x77, 0x3a, 0x38, + 0xcd, 0x06, 0xb4, 0x8b, 0xa3, 0x91, 0x19, 0xdb, 0x49, 0x84, 0xd0, 0x9a, 0x5b, 0xde, + 0x13, 0x89, 0x0e, 0xa0, 0x61, 0x3d, 0x0c, 0xe0, 0x04, 0x3e, 0xae, 0x9a, 0x20, 0x89, + 0x14, 0x1f, 0xd9, 0x46, 0x59, 0x13, 0xc1, 0xcc, 0x33, 0x27, 0xa5, 0x59, 0x42, 0xb9, + 0xfd, 0x8f, 0xb8, 0x1c, 0x84, 0x7d, 0x8f, 0xdd, 0xf8, 0xbd, 0xba, 0xcf, 0xa0, 0xfb, + 0x05, 0x52, 0xc1, 0xfe, 0x4c, 0xc4, 0xc0, 0x7f, 0x4d, 0xcf, 0x15, 0x1c, 0x5e, 0x74, + 0xe8, 0xd6, 0x9b, 0x2b, 0x8b, 0xf7, 0xfd, 0x95, 0xec, 0xeb, 0x65, 0x5e, 0x00, 0x53, + 0x58, 0x16, 0xd3, 0x8b, 0x4a, 0x28, 0xd4, 0xa9, 0xae, 0xeb, 0xb6, 0x9a, 0xb4, 0xdd, + 0x12, 0xbf, 0x13, 0xfd, 0x5a, 0x45, 0x9b, 0x6b, 0xb6, 0x83, 0xff, 0xd9, 0xdd, 0x7b, + 0x0d, 0x0c, 0xe7, 0x29, 0x67, 0x75, 0x80, 0x8a, 0x84, 0x3f, 0x3b, 0x8c, 0xc7, 0x89, + 0xfd, 0x5f, 0x43, 0xe0, 0x84, 0xd8, 0x7d, 0x6a, 0xda, 0x8d, 0x1f, 0x28, 0xc2, 0x64, + 0xe6, 0x44, 0xe9, 0xad, 0x96, 0x5c, 0x28, 0x08, 0x8a, 0x52, 0xe4, 0xb3, 0x56, 0x42, + 0xf9, 0xb5, 0xe0, 0x66, 0x49, 0x90, 0x96, 0x3b, 0xc2, 0x3b, 0x9b, 0xb4, 0x8f, 0x46, + 0x74, 0x73, 0x53, 0x58, 0x0e, 0xcc, 0x45, 0x20, 0xcf, 0xf1, 0xfa, 0x7f, 0x8f, 0xbc, + 0x03, 0x0e, 0x64, 0x7d, 0xf1, 0x44, 0xee, 0x6c, 0xa5, 0xb3, 0x16, 0xb3, 0xaf, 0x90, + 0x48, 0x9a, 0x80, 0x9d, 0x9c, 0x9f, ], ock: [ - 0x2a, 0xec, 0x11, 0xd4, 0xae, 0x79, 0x84, 0xe1, 0x69, 0xd1, 0xdf, 0xf1, 0xff, 0x0f, - 0x9a, 0xf5, 0x19, 0x96, 0x34, 0x51, 0xa4, 0x1c, 0x9f, 0x5a, 0xdc, 0x58, 0xe4, 0xf9, - 0x0a, 0xf3, 0x8d, 0x47, + 0x85, 0x6e, 0x1a, 0x97, 0x09, 0xb0, 0xc4, 0x16, 0x93, 0x3f, 0x59, 0x70, 0x71, 0x5c, + 0x56, 0xe2, 0xe0, 0x5c, 0x2e, 0xa9, 0x7d, 0x81, 0x51, 0x25, 0x70, 0x14, 0x79, 0xc3, + 0x3a, 0x5d, 0x91, 0xcb, ], op: [ 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, - 0x14, 0x93, 0x16, 0x36, 0x34, 0x39, 0x22, 0x52, 0xc9, 0xcc, 0x9f, 0x45, 0x4b, 0x54, - 0x2c, 0xf1, 0xb8, 0x88, 0xb3, 0xab, 0x02, 0xe6, 0x05, 0xa8, 0xda, 0x26, 0x10, 0x7d, - 0x98, 0x02, 0xf1, 0x53, 0x6a, 0x9e, 0x9f, 0x2b, + 0x14, 0x93, 0x16, 0x36, 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, + 0xfe, 0x47, 0x9a, 0x1e, 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, + 0x92, 0x3a, 0x5d, 0x00, 0xcb, 0x52, 0xa6, 0x13, ], c_out: [ - 0xe6, 0xeb, 0x22, 0x47, 0xc9, 0x33, 0xe2, 0x4c, 0x9d, 0xf1, 0x28, 0xb1, 0xe0, 0x4e, - 0x8b, 0xc0, 0x5c, 0x65, 0xeb, 0x31, 0x97, 0xdf, 0x9b, 0xa8, 0x70, 0xd8, 0xa0, 0xa1, - 0x8d, 0x9c, 0x24, 0xb7, 0xc9, 0x78, 0xc3, 0x4d, 0x3c, 0x7b, 0xbd, 0x21, 0xe8, 0x7b, - 0x22, 0x39, 0x21, 0x87, 0x54, 0xd9, 0x67, 0x3a, 0x56, 0xa2, 0x73, 0x58, 0x0f, 0x6b, - 0x41, 0xc6, 0x91, 0xe5, 0xfd, 0x30, 0x9c, 0xd5, 0xd1, 0xd2, 0x6d, 0x57, 0x63, 0xa9, - 0xe8, 0xd2, 0x71, 0xc9, 0x77, 0x05, 0x0e, 0x05, 0xdc, 0x96, - ], + 0x72, 0x36, 0xea, 0xb9, 0xf0, 0x12, 0x98, 0xc8, 0x4f, 0x38, 0x28, 0xf6, 0xac, 0x15, + 0x42, 0x76, 0xb5, 0xb7, 0x64, 0x62, 0xf5, 0x74, 0x2d, 0x69, 0xdc, 0x47, 0x7a, 0x10, + 0x5d, 0xc2, 0x71, 0x1b, 0x12, 0xe9, 0xb5, 0x82, 0x8c, 0x01, 0x76, 0xfe, 0xf4, 0x4a, + 0x54, 0x0f, 0x60, 0x95, 0x8e, 0x5a, 0x3e, 0xd6, 0xa2, 0xcc, 0x5e, 0xdd, 0xe9, 0x13, + 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, + 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -933,34 +937,34 @@ pub(crate) fn test_vectors() -> Vec { 0xd2, 0x50, 0x21, 0x17, ], rho: [ - 0x23, 0x39, 0xa8, 0x95, 0x29, 0xcf, 0x35, 0x7b, 0x06, 0x7d, 0xd2, 0x8b, 0xe4, 0x06, - 0x6e, 0x16, 0x23, 0x6d, 0xc5, 0xd7, 0x87, 0x06, 0x14, 0x9a, 0x72, 0x8c, 0x3e, 0x3d, - 0x9d, 0xc1, 0x08, 0x1c, + 0x8d, 0x67, 0xe3, 0xba, 0x4d, 0xbc, 0x9d, 0xa5, 0xe8, 0x38, 0x23, 0xa1, 0x23, 0x11, + 0x63, 0x96, 0x51, 0xa4, 0xff, 0xa9, 0x5f, 0x27, 0xc1, 0x83, 0x0d, 0x91, 0xd8, 0xb7, + 0x3c, 0xfb, 0xf1, 0x31, ], cmx: [ - 0xe3, 0x04, 0xcf, 0x08, 0xc7, 0x86, 0xaf, 0xcb, 0x1d, 0x65, 0x2f, 0x7a, 0x94, 0x17, - 0x29, 0x32, 0x01, 0x51, 0x71, 0x37, 0x93, 0x82, 0x89, 0x42, 0xcb, 0x88, 0xd0, 0x1f, - 0x68, 0x60, 0x4e, 0x1f, + 0xea, 0x7c, 0x13, 0xf7, 0xe1, 0x20, 0x5e, 0x78, 0xc8, 0xce, 0x4e, 0xe4, 0xfd, 0xcd, + 0xb7, 0xee, 0x76, 0x92, 0x8d, 0xdf, 0x6d, 0xbe, 0x1b, 0x2d, 0x6f, 0x69, 0x81, 0xb7, + 0xc9, 0x65, 0x79, 0x10, ], esk: [ - 0x0f, 0xba, 0x68, 0x76, 0xb3, 0x76, 0x5d, 0xff, 0x4f, 0x4c, 0x40, 0xaf, 0x89, 0x3e, - 0x4b, 0xd1, 0x34, 0x3a, 0x53, 0x4c, 0xdf, 0x50, 0x20, 0x15, 0x6b, 0x5e, 0xd1, 0xf6, - 0xbf, 0x62, 0xbe, 0x3c, + 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, 0x73, 0xe9, 0x05, 0x99, + 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, 0x89, 0xcc, 0x63, 0x00, + 0x06, 0x15, 0xb2, 0x0d, ], ephemeral_key: [ - 0xdf, 0xe0, 0xf0, 0x0e, 0xb2, 0xb2, 0xf7, 0x08, 0x04, 0x19, 0x1b, 0x5b, 0x2d, 0xdf, - 0x57, 0x8f, 0x6a, 0xda, 0x21, 0x1b, 0x8b, 0x41, 0x7d, 0x95, 0xd2, 0xb7, 0x34, 0xff, - 0xa2, 0x2d, 0x81, 0x30, + 0x89, 0xfd, 0x2c, 0xf3, 0x79, 0x56, 0xba, 0xaf, 0x11, 0x27, 0xbb, 0x0e, 0x33, 0x40, + 0x01, 0x09, 0xdb, 0x03, 0x50, 0xf4, 0xab, 0xb7, 0xd6, 0xd8, 0x1f, 0xa5, 0x84, 0x8e, + 0x1b, 0xb1, 0x69, 0x26, ], shared_secret: [ - 0x0e, 0xc6, 0x82, 0xc8, 0xdc, 0x66, 0x41, 0x41, 0x02, 0x4f, 0x92, 0x9d, 0x1a, 0xe5, - 0xd3, 0x9c, 0x39, 0x4d, 0x05, 0xa2, 0x4d, 0xad, 0x0e, 0x4a, 0x6f, 0x94, 0x98, 0xed, - 0x5f, 0x87, 0xd4, 0x88, + 0xdb, 0xa6, 0x37, 0x94, 0xb6, 0x7c, 0x49, 0x6d, 0x01, 0x1c, 0xfb, 0x6b, 0xba, 0x29, + 0x7c, 0xa5, 0x7d, 0x18, 0xc7, 0xa9, 0xad, 0xdf, 0xfb, 0xc8, 0x37, 0x17, 0x6a, 0xcf, + 0x3a, 0x30, 0x1e, 0x23, ], k_enc: [ - 0xb1, 0x24, 0x5f, 0xb6, 0x37, 0x47, 0xc0, 0x13, 0x39, 0xcd, 0xe8, 0xf9, 0x35, 0x98, - 0xdf, 0xb2, 0xd3, 0x99, 0xec, 0x5e, 0x03, 0xbe, 0xa1, 0x3f, 0x3d, 0xbf, 0x01, 0xca, - 0xdb, 0x93, 0xc9, 0xba, + 0x80, 0xe7, 0x52, 0x2c, 0xb0, 0x32, 0x51, 0xc8, 0x55, 0x34, 0x1f, 0x06, 0xf9, 0x41, + 0x33, 0x41, 0xe1, 0x6e, 0x83, 0xb4, 0x89, 0xe1, 0x5a, 0x0a, 0x00, 0x65, 0xc3, 0x3b, + 0xf3, 0x81, 0x58, 0xc4, ], p_enc: [ 0x02, 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, 0x7e, 0x65, @@ -1006,69 +1010,70 @@ pub(crate) fn test_vectors() -> Vec { 0xd7, 0x6b, 0xa4, 0x80, ], c_enc: [ - 0x31, 0xec, 0x78, 0xd4, 0x02, 0x14, 0xc1, 0xbc, 0x7b, 0x25, 0x94, 0x7b, 0x42, 0xf3, - 0x54, 0x34, 0x60, 0x72, 0x90, 0x27, 0x7c, 0x44, 0xc4, 0x89, 0xe9, 0x38, 0x72, 0x2f, - 0x7c, 0x12, 0xff, 0x55, 0xc4, 0xf1, 0xdf, 0xbe, 0x0f, 0x1a, 0x65, 0xb1, 0x5c, 0x0c, - 0xc4, 0x7a, 0x46, 0xc9, 0xbb, 0x33, 0x5b, 0xd1, 0xa3, 0xe7, 0xe6, 0x62, 0xee, 0x85, - 0x84, 0x57, 0x6b, 0x6f, 0x42, 0x81, 0x95, 0xc9, 0x8c, 0x72, 0xfb, 0x99, 0x75, 0xc7, - 0x17, 0x9c, 0x4c, 0xab, 0x58, 0x66, 0xf5, 0xb4, 0x85, 0x42, 0x8b, 0x50, 0x8e, 0x2e, - 0x05, 0xbe, 0x0c, 0x98, 0x41, 0xa3, 0xa2, 0x91, 0x12, 0x80, 0x2c, 0x52, 0x15, 0xe2, - 0x51, 0x37, 0xcf, 0xdd, 0x13, 0x8c, 0x99, 0x39, 0x0e, 0xfb, 0xce, 0xb7, 0x52, 0x4e, - 0x84, 0x7c, 0x36, 0xb4, 0x3f, 0x3e, 0xde, 0x32, 0xf2, 0x3b, 0x39, 0x81, 0xf6, 0xd3, - 0xc3, 0x2b, 0x17, 0xbb, 0xbe, 0x65, 0xf2, 0xfd, 0x01, 0xab, 0xdd, 0x99, 0x87, 0xf1, - 0xb8, 0x88, 0xeb, 0xef, 0x41, 0xef, 0x45, 0x55, 0xc9, 0xfb, 0x0c, 0x8a, 0xee, 0x9b, - 0x6d, 0xd0, 0x85, 0xb9, 0xfb, 0xc7, 0x4f, 0xe4, 0x6a, 0x1e, 0x36, 0x3d, 0x68, 0x32, - 0xb5, 0x08, 0x20, 0x0e, 0x50, 0x0d, 0xa6, 0x95, 0x13, 0xb7, 0x9e, 0x81, 0xf7, 0x33, - 0xb6, 0x6c, 0x3f, 0x24, 0x3a, 0x28, 0x5b, 0xf8, 0x6f, 0xfe, 0xef, 0x4f, 0xfd, 0x1c, - 0xac, 0xa7, 0x83, 0x07, 0x26, 0x63, 0xbf, 0x9b, 0x48, 0x7f, 0xbc, 0x3e, 0x7f, 0x5a, - 0xd2, 0xf7, 0xac, 0xbf, 0x2b, 0x6e, 0x00, 0x8e, 0x3e, 0x4d, 0x6f, 0x31, 0xe1, 0x14, - 0x75, 0xe1, 0x96, 0x98, 0x9d, 0xb9, 0x62, 0x8a, 0x5d, 0x56, 0x39, 0x7c, 0x9a, 0x04, - 0x2a, 0xab, 0x55, 0xe1, 0xec, 0xc4, 0x92, 0xfe, 0x94, 0x27, 0xd4, 0x90, 0xf2, 0x73, - 0xb6, 0x01, 0xd6, 0x51, 0x05, 0x56, 0x82, 0xd3, 0x5b, 0x30, 0x75, 0xfa, 0xda, 0x85, - 0x25, 0x84, 0x48, 0x14, 0x95, 0x7f, 0xfc, 0x9b, 0xc7, 0xfb, 0x39, 0x39, 0x73, 0x7b, - 0x01, 0x50, 0x2e, 0x0b, 0x6f, 0x1f, 0x9b, 0x88, 0xf2, 0x71, 0x54, 0x80, 0xae, 0x42, - 0x2e, 0x9b, 0xb7, 0xb7, 0x6e, 0x5d, 0x22, 0xde, 0x0d, 0x3d, 0x7a, 0xea, 0x58, 0x10, - 0x01, 0xdc, 0xf4, 0x6a, 0x62, 0x2f, 0x08, 0x03, 0x10, 0xbe, 0x50, 0xdf, 0x07, 0x75, - 0x21, 0x92, 0xd4, 0xe4, 0x1a, 0xc5, 0x18, 0xe4, 0x24, 0x1e, 0x06, 0x67, 0x76, 0xa8, - 0xea, 0xec, 0xc7, 0x42, 0xfd, 0x2c, 0x1b, 0xf0, 0x6f, 0xc5, 0x8b, 0xd2, 0x8d, 0x1d, - 0x6c, 0x60, 0x1f, 0x91, 0x5d, 0x75, 0x2e, 0x7c, 0xc3, 0xd9, 0x76, 0x3c, 0x8b, 0x9e, - 0xec, 0x14, 0x2c, 0x84, 0x81, 0xf9, 0xc5, 0x23, 0x59, 0xbf, 0xbf, 0x51, 0x24, 0x36, - 0x67, 0x84, 0xe1, 0x71, 0xd7, 0xa4, 0xaa, 0x01, 0x5e, 0x85, 0x56, 0x47, 0x4a, 0x6d, - 0x0f, 0xee, 0x69, 0xb0, 0xd5, 0x3e, 0xe7, 0xf4, 0xed, 0xf5, 0xea, 0x59, 0xfa, 0x55, - 0x97, 0xf4, 0x8d, 0xd6, 0xaa, 0x88, 0x51, 0x84, 0x29, 0xac, 0x8c, 0x18, 0xc4, 0x73, - 0x8d, 0xb8, 0x01, 0x09, 0xa5, 0xe4, 0xbc, 0x81, 0xbb, 0x84, 0xb3, 0x7d, 0x9b, 0x2a, - 0xd4, 0xb1, 0xd2, 0x6b, 0x36, 0x3d, 0x16, 0x60, 0x72, 0xf0, 0x8c, 0x56, 0x70, 0x62, - 0x27, 0xa9, 0xf8, 0x32, 0x97, 0x03, 0x70, 0x12, 0xd1, 0xf6, 0xda, 0x24, 0xa8, 0x69, - 0xeb, 0x32, 0x97, 0xbc, 0xbc, 0xcc, 0x8d, 0x7d, 0xed, 0x03, 0x0a, 0x3d, 0x60, 0xdf, - 0x88, 0x82, 0xe0, 0x62, 0x9e, 0x36, 0x14, 0x3c, 0x09, 0xca, 0x05, 0x21, 0x43, 0xcb, - 0x56, 0x62, 0x93, 0x8f, 0xa9, 0xf1, 0x15, 0xdd, 0xc0, 0x96, 0x65, 0x4c, 0x0b, 0x40, - 0x59, 0x4c, 0xba, 0x19, 0xee, 0xd4, 0x99, 0x53, 0x2b, 0x70, 0x8a, 0xde, 0xbe, 0x47, - 0x72, 0x6a, 0x83, 0xaf, 0x46, 0x3c, 0x80, 0xba, 0x2a, 0x1f, 0xe0, 0x71, 0xe1, 0x66, - 0xc4, 0x4d, 0x70, 0xdd, 0xbb, 0xba, 0x67, 0x06, 0xa1, 0xdc, 0x43, 0x27, 0x26, 0xfe, - 0x0f, 0xdb, 0xc6, 0x28, 0x21, 0xb5, 0x04, 0xea, 0x11, 0x66, 0xda, 0x48, 0xa8, 0x1b, - 0x63, 0x5e, 0x37, 0x63, 0x33, 0xd9, 0xbe, 0xfe, 0xc4, 0x93, 0xa0, 0x7d, 0xf4, 0x7b, - 0xba, 0x0a, 0x2e, 0x2f, 0x65, 0xe7, + 0x3f, 0x4e, 0x9b, 0x18, 0x56, 0xe7, 0xbf, 0xba, 0x7a, 0xbb, 0xc9, 0x4a, 0x72, 0xb4, + 0xab, 0xb1, 0xd8, 0x46, 0x26, 0x79, 0x30, 0x77, 0xe8, 0x37, 0xda, 0xf3, 0x3f, 0xff, + 0xa2, 0x7c, 0x7a, 0x33, 0x97, 0x8a, 0x54, 0x32, 0x51, 0x0d, 0x99, 0x3c, 0x7d, 0x92, + 0x24, 0xc0, 0x97, 0xac, 0xc5, 0x25, 0x88, 0x1c, 0x76, 0x08, 0x3c, 0x1b, 0x65, 0x1a, + 0x9d, 0xe1, 0xb5, 0xc1, 0xa6, 0xe0, 0x48, 0x2f, 0xae, 0x8f, 0x98, 0x6a, 0xb5, 0x9f, + 0xa7, 0xcd, 0x43, 0x98, 0x99, 0x6e, 0x2b, 0xc0, 0x3a, 0xdc, 0xa9, 0x90, 0x32, 0x3b, + 0xaa, 0xbd, 0xda, 0xae, 0x40, 0xb0, 0x56, 0xb7, 0xac, 0x17, 0xf8, 0x20, 0xd1, 0x1c, + 0x0d, 0xec, 0xba, 0x14, 0xf2, 0x57, 0xa6, 0xcf, 0x09, 0x18, 0x19, 0x8f, 0x38, 0x9c, + 0xdb, 0x29, 0x55, 0x77, 0x25, 0x96, 0x92, 0x7c, 0xbf, 0x55, 0x88, 0x56, 0x13, 0x35, + 0xe7, 0xd6, 0x2e, 0x6a, 0x8a, 0xf7, 0xbc, 0x33, 0xb9, 0x9a, 0x55, 0xaf, 0xa1, 0xb7, + 0xef, 0x20, 0xeb, 0x4e, 0xd6, 0xde, 0x89, 0x69, 0xd2, 0x9f, 0x04, 0x21, 0xcd, 0x4d, + 0x99, 0x06, 0x66, 0xfd, 0xcf, 0x1e, 0xbd, 0x09, 0x06, 0x57, 0x02, 0x13, 0x4d, 0x31, + 0xc3, 0x29, 0x26, 0xa3, 0x8b, 0x6b, 0x6b, 0x48, 0xfd, 0xc9, 0xb3, 0xc7, 0x64, 0xc3, + 0xcd, 0x95, 0xb9, 0x72, 0xe7, 0x68, 0xeb, 0xd8, 0xaa, 0xe9, 0x0d, 0x6a, 0x4a, 0x98, + 0xb2, 0xd9, 0x2f, 0xd9, 0xdf, 0xa2, 0xa2, 0x99, 0xd0, 0x60, 0xe8, 0x5e, 0xf5, 0x68, + 0x3f, 0x51, 0xd0, 0x51, 0x4a, 0x6e, 0xba, 0x72, 0x57, 0x3f, 0x7b, 0xae, 0x84, 0xa2, + 0xfd, 0x92, 0xbe, 0x64, 0x24, 0x1c, 0x27, 0xa6, 0xe5, 0xce, 0xac, 0xbf, 0x37, 0xb2, + 0xd9, 0xa9, 0x75, 0xdf, 0x7a, 0xee, 0xbb, 0xa1, 0x4d, 0x8c, 0x81, 0x15, 0x8e, 0xcf, + 0x5a, 0x0a, 0x25, 0xe1, 0x2f, 0x98, 0x5d, 0x08, 0xfb, 0xb4, 0xa1, 0xc1, 0x3f, 0x76, + 0x1f, 0x3f, 0xfe, 0xe8, 0xd5, 0x38, 0xe3, 0x93, 0xf3, 0x58, 0x0b, 0x73, 0x82, 0xcd, + 0x0b, 0xf5, 0x17, 0xce, 0x78, 0x87, 0x1c, 0x19, 0xac, 0xf8, 0xca, 0x06, 0x5d, 0x7c, + 0x83, 0x87, 0xce, 0xcd, 0x0d, 0x37, 0xae, 0x21, 0x7f, 0x44, 0x06, 0x94, 0x77, 0x2a, + 0xbd, 0x4b, 0x36, 0x55, 0x56, 0x85, 0x4b, 0xaa, 0x8b, 0xcc, 0xa9, 0xc4, 0xfe, 0xf7, + 0x18, 0x99, 0x12, 0xf9, 0x8a, 0x25, 0x27, 0x68, 0x92, 0x76, 0xa4, 0x00, 0x8c, 0x83, + 0x8f, 0xe7, 0x4f, 0x7c, 0x2b, 0x75, 0x9f, 0xc2, 0xab, 0x7a, 0xfe, 0x37, 0x82, 0x80, + 0x6e, 0x31, 0xb1, 0xc5, 0x30, 0xcc, 0x46, 0x20, 0x3b, 0xb3, 0xa5, 0x66, 0xca, 0xf4, + 0xd1, 0x5b, 0x99, 0x40, 0xb4, 0x3f, 0x33, 0xa8, 0x6a, 0x65, 0xd4, 0x9d, 0xa8, 0xb6, + 0x78, 0x7d, 0xe0, 0x96, 0x38, 0xb4, 0x81, 0xf3, 0xa8, 0x10, 0x8a, 0x96, 0x9e, 0xca, + 0xdf, 0x90, 0x98, 0xbf, 0xf2, 0x14, 0x0c, 0x4b, 0x42, 0xe2, 0xb0, 0xfb, 0x10, 0xb9, + 0x02, 0x89, 0xb0, 0xc6, 0xdb, 0x8b, 0xc0, 0x85, 0xe8, 0xaf, 0xe9, 0x5d, 0xd3, 0x6a, + 0x45, 0x36, 0xea, 0xd7, 0xe9, 0x5c, 0x99, 0x66, 0x2c, 0xd9, 0x28, 0xc2, 0x2c, 0x3e, + 0xbf, 0x39, 0x79, 0x15, 0x78, 0xbc, 0x66, 0xfe, 0xa3, 0x01, 0x4d, 0x22, 0x92, 0x94, + 0x30, 0x83, 0xe7, 0x46, 0x81, 0x24, 0x52, 0xb0, 0x0b, 0xc2, 0xf3, 0xe4, 0x7c, 0x49, + 0x47, 0x46, 0xce, 0xd5, 0x57, 0xb1, 0x3a, 0xe3, 0x03, 0x0d, 0x8a, 0x95, 0x78, 0x10, + 0x2b, 0xba, 0xd2, 0xfc, 0x3b, 0x84, 0x5f, 0x31, 0xae, 0x16, 0xf8, 0xd8, 0x0b, 0x77, + 0xf8, 0x43, 0x15, 0x84, 0xa3, 0x7e, 0x8f, 0x30, 0xb0, 0xb9, 0x5c, 0xc4, 0x55, 0x5a, + 0xbc, 0x05, 0x3a, 0x0b, 0x4f, 0xf9, 0x13, 0xb0, 0x03, 0x69, 0xf1, 0x74, 0x7b, 0x1f, + 0x1c, 0x0a, 0xc8, 0x75, 0x4f, 0x01, 0x7e, 0x99, 0x47, 0xca, 0x63, 0x25, 0x5b, 0x3c, + 0x23, 0xf4, 0x56, 0xe2, 0x3f, 0x96, 0x76, 0x13, 0x99, 0x60, 0x1f, 0xd8, 0xda, 0xdb, + 0x5e, 0x3f, 0x90, 0xab, 0x1b, 0x20, 0x13, 0x81, 0x80, 0xed, 0x69, 0x73, 0x22, 0x39, + 0xc8, 0xc2, 0x15, 0xd9, 0xcc, 0x8a, 0xc8, 0x05, 0x9b, 0xde, 0x81, 0x63, 0x27, 0xd2, + 0x20, 0xb9, 0xa8, 0xec, 0xba, 0x5d, ], ock: [ - 0xec, 0xa3, 0x70, 0x7a, 0x74, 0x5d, 0x5d, 0x58, 0x65, 0x86, 0xb2, 0x35, 0xf2, 0x92, - 0xad, 0x20, 0x48, 0x93, 0x14, 0xc4, 0x58, 0x80, 0xd9, 0x83, 0x2b, 0x7f, 0x47, 0xee, - 0xbb, 0xd4, 0x5c, 0xfe, + 0xe6, 0xb7, 0x05, 0x50, 0xe1, 0xd7, 0xa2, 0xbe, 0x73, 0x04, 0x39, 0x64, 0x41, 0xec, + 0x6a, 0xc0, 0x47, 0x45, 0x99, 0xf9, 0xea, 0xd7, 0x55, 0xc2, 0xcf, 0x27, 0x6b, 0x87, + 0x50, 0xc5, 0xcf, 0x2d, ], op: [ 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, - 0x03, 0x8e, 0x3d, 0xb3, 0x0f, 0xba, 0x68, 0x76, 0xb3, 0x76, 0x5d, 0xff, 0x4f, 0x4c, - 0x40, 0xaf, 0x89, 0x3e, 0x4b, 0xd1, 0x34, 0x3a, 0x53, 0x4c, 0xdf, 0x50, 0x20, 0x15, - 0x6b, 0x5e, 0xd1, 0xf6, 0xbf, 0x62, 0xbe, 0x3c, + 0x03, 0x8e, 0x3d, 0xb3, 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, + 0x73, 0xe9, 0x05, 0x99, 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, + 0x89, 0xcc, 0x63, 0x00, 0x06, 0x15, 0xb2, 0x0d, ], c_out: [ - 0xd0, 0x65, 0x9a, 0x03, 0xc5, 0x3e, 0x15, 0xdc, 0x11, 0x01, 0xa6, 0x6e, 0xa8, 0x0d, - 0xf4, 0x14, 0x4d, 0x5e, 0xe0, 0x1c, 0x3d, 0xbf, 0x20, 0x2c, 0xe6, 0x08, 0x7e, 0x96, - 0xa8, 0x5a, 0xe1, 0x39, 0xdd, 0x46, 0xfc, 0x82, 0xa1, 0xc3, 0x7d, 0x06, 0x05, 0xf8, - 0x49, 0x98, 0x53, 0x13, 0x16, 0xf1, 0xf0, 0xcb, 0xc0, 0x4e, 0xa2, 0x0a, 0xa4, 0x04, - 0xb3, 0xd5, 0xb0, 0x42, 0x96, 0x01, 0x49, 0x81, 0x6d, 0x9b, 0x8f, 0x06, 0x2a, 0xfc, - 0xc1, 0x93, 0x89, 0x43, 0x82, 0x7a, 0x1b, 0x43, 0xfc, 0xbd, - ], + 0x02, 0xb1, 0x37, 0x3e, 0xb1, 0x89, 0x56, 0x32, 0x2b, 0x47, 0xa1, 0x70, 0x0d, 0xb7, + 0x43, 0x31, 0x6e, 0xde, 0x46, 0x44, 0xd6, 0x59, 0x3c, 0xd7, 0x94, 0x22, 0xd7, 0x51, + 0x3d, 0x1b, 0x80, 0xe6, 0x85, 0x05, 0xdf, 0xe9, 0xd6, 0x86, 0x2e, 0x79, 0x4e, 0x30, + 0x28, 0x8b, 0xae, 0xa8, 0xb0, 0xbc, 0xb3, 0x8b, 0x35, 0x49, 0x77, 0xaa, 0xee, 0x57, + 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, + 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1142,34 +1147,34 @@ pub(crate) fn test_vectors() -> Vec { 0xda, 0x6b, 0x15, 0x14, ], rho: [ - 0xe5, 0xd0, 0x8c, 0x40, 0x26, 0x3e, 0x4a, 0x2a, 0x56, 0x96, 0xda, 0x21, 0x0d, 0x8e, - 0x9a, 0x77, 0xf0, 0xaf, 0xc4, 0xc6, 0x8a, 0x6d, 0xda, 0x38, 0xe2, 0x85, 0xf4, 0xe3, - 0xef, 0x13, 0xb8, 0x17, + 0x9a, 0x09, 0xe4, 0x72, 0xe8, 0xe9, 0x96, 0xfc, 0xc3, 0x0e, 0xd5, 0x23, 0x72, 0x08, + 0xdb, 0xb0, 0x01, 0x71, 0x32, 0x0e, 0x6b, 0xea, 0x43, 0x91, 0x86, 0x00, 0x9d, 0xad, + 0x21, 0x38, 0xab, 0x29, ], cmx: [ - 0xad, 0xc2, 0x44, 0x3a, 0xf9, 0x57, 0x67, 0x47, 0xca, 0x4f, 0x10, 0x4b, 0x1f, 0x5a, - 0x7a, 0xdc, 0x80, 0x5a, 0xc5, 0x5a, 0xcc, 0x56, 0x33, 0xa0, 0xb3, 0xc2, 0xdc, 0x7a, - 0xad, 0xff, 0x21, 0x26, + 0x18, 0xfc, 0xbd, 0x40, 0xac, 0xf1, 0xa7, 0xf4, 0xd6, 0x09, 0x87, 0x9a, 0x5f, 0x5e, + 0x3b, 0x39, 0x70, 0x09, 0x4f, 0xf8, 0xbe, 0x84, 0x18, 0x60, 0x70, 0x16, 0xc6, 0xa6, + 0x97, 0xf8, 0x9c, 0x20, ], esk: [ - 0x24, 0x75, 0x30, 0x5c, 0x35, 0xcf, 0x37, 0xeb, 0xd2, 0x77, 0x82, 0x35, 0x16, 0x58, - 0x5a, 0xfa, 0x06, 0x05, 0x78, 0x52, 0x17, 0x1e, 0x0c, 0xe4, 0xb0, 0x52, 0xd5, 0xb4, - 0x20, 0x41, 0xd8, 0x1c, + 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, 0x6b, 0x8d, 0x6f, 0xea, + 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, 0xd5, 0xcb, 0xab, 0x1a, + 0xcc, 0xd5, 0x4e, 0x3a, ], ephemeral_key: [ - 0x00, 0x5d, 0x31, 0x5b, 0xd1, 0x80, 0xa2, 0x94, 0x0b, 0xd7, 0xfb, 0x34, 0xa7, 0x0e, - 0x90, 0xe8, 0x32, 0x6c, 0xb1, 0x34, 0x30, 0x66, 0x05, 0x46, 0x53, 0xd2, 0x64, 0x4d, - 0x20, 0x45, 0xe3, 0x0f, + 0xcf, 0xe0, 0x3e, 0xb2, 0xd3, 0x36, 0x76, 0xb7, 0x73, 0x83, 0x7d, 0xa8, 0x39, 0x17, + 0x2d, 0x33, 0x33, 0x31, 0x88, 0xc9, 0xdf, 0xef, 0x05, 0xc8, 0x32, 0xa2, 0x5c, 0x86, + 0xd3, 0xbf, 0x0e, 0x8f, ], shared_secret: [ - 0x8e, 0x59, 0x0d, 0x06, 0x3f, 0x7e, 0xc3, 0x8e, 0xb2, 0x00, 0x84, 0x70, 0xf9, 0xbb, - 0x42, 0x29, 0x04, 0xfc, 0x0b, 0xaf, 0x97, 0x80, 0xf8, 0xfd, 0x1f, 0x54, 0x22, 0xea, - 0x30, 0x8c, 0x47, 0xba, + 0xd2, 0xc2, 0x88, 0x9e, 0x03, 0x7e, 0xac, 0x60, 0x60, 0x58, 0x68, 0x2b, 0xaa, 0x38, + 0x86, 0xa4, 0xc2, 0xdd, 0x44, 0xea, 0xdf, 0x8b, 0x2c, 0xe4, 0x39, 0x95, 0xde, 0xd7, + 0x61, 0xfd, 0xaf, 0xb5, ], k_enc: [ - 0xeb, 0xb2, 0xff, 0x9b, 0x1f, 0x29, 0x0d, 0xa5, 0x63, 0x27, 0xa9, 0x67, 0x71, 0xb2, - 0x5f, 0x71, 0x29, 0xff, 0x10, 0x2e, 0xe6, 0xd2, 0xb2, 0x0d, 0xa0, 0x9a, 0x06, 0x25, - 0xf8, 0xbb, 0x26, 0x07, + 0xfe, 0xe3, 0xe3, 0xb5, 0xfd, 0x6c, 0xd8, 0x54, 0x44, 0x2b, 0x2a, 0xc2, 0x97, 0x70, + 0xfb, 0x0e, 0x39, 0x32, 0xf4, 0x71, 0x52, 0x43, 0x26, 0xda, 0x4a, 0x57, 0xc2, 0x56, + 0x18, 0x06, 0x9e, 0x99, ], p_enc: [ 0x02, 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, 0x91, 0x20, @@ -1215,69 +1220,70 @@ pub(crate) fn test_vectors() -> Vec { 0x34, 0x1e, 0x4e, 0x6f, ], c_enc: [ - 0x96, 0x3b, 0xe3, 0x6e, 0xdc, 0xa4, 0x8b, 0x7c, 0x4a, 0x1c, 0xd6, 0xa1, 0x37, 0x2e, - 0x84, 0xc0, 0x54, 0x54, 0x83, 0x4c, 0x5e, 0xe1, 0x92, 0x5e, 0xed, 0xeb, 0x48, 0xda, - 0x16, 0x77, 0x79, 0xe3, 0x99, 0x83, 0x58, 0xcb, 0x92, 0x7a, 0x0a, 0x0b, 0x36, 0x9c, - 0x85, 0xee, 0xb3, 0x30, 0xf7, 0x00, 0x5c, 0x26, 0x9d, 0x0b, 0xe4, 0xf2, 0x38, 0x09, - 0x57, 0xb1, 0x62, 0x97, 0x7c, 0xae, 0x7a, 0x7b, 0x1d, 0x0b, 0xe5, 0xd0, 0xb7, 0x03, - 0xd3, 0x92, 0xac, 0xae, 0xd2, 0x4f, 0x52, 0x5b, 0x83, 0xcf, 0xdd, 0x7f, 0x35, 0xc1, - 0xf1, 0x74, 0xbf, 0x06, 0x6b, 0x7a, 0xfd, 0xb7, 0x45, 0xed, 0xbe, 0xdc, 0x0b, 0x46, - 0xa5, 0x91, 0x36, 0x21, 0x47, 0x61, 0x9d, 0x6b, 0xd3, 0xf3, 0xce, 0x6b, 0x45, 0x23, - 0xf0, 0x64, 0x9a, 0x7c, 0x65, 0x32, 0x2d, 0x05, 0xfa, 0xe2, 0x22, 0x70, 0x1a, 0x8c, - 0xd6, 0xca, 0xbf, 0x8d, 0xc3, 0x2f, 0x05, 0x5f, 0xeb, 0x14, 0x1e, 0x55, 0x6d, 0xdf, - 0xb1, 0x98, 0x30, 0xb7, 0x20, 0x4c, 0x30, 0x98, 0x4e, 0xdd, 0xf4, 0x34, 0xec, 0xc5, - 0xf0, 0xea, 0x82, 0x5c, 0xf8, 0xd9, 0xd5, 0x03, 0x8f, 0x28, 0xe2, 0x3e, 0xf3, 0x6b, - 0xa9, 0x38, 0x52, 0xe5, 0x8e, 0x85, 0xf8, 0x90, 0xb1, 0x77, 0x5c, 0x6d, 0x4c, 0x13, - 0x5b, 0xef, 0x0e, 0x2a, 0x19, 0x33, 0x02, 0xd9, 0x0a, 0x80, 0x4c, 0x85, 0x31, 0x25, - 0xaa, 0x5b, 0x11, 0x6f, 0x8c, 0x58, 0x0e, 0xb6, 0x54, 0xfe, 0x35, 0xe6, 0x73, 0x79, - 0x9e, 0x93, 0xcf, 0x58, 0xfe, 0x1e, 0x70, 0xcd, 0xe1, 0x19, 0xab, 0x58, 0x6c, 0x12, - 0xc4, 0x95, 0x75, 0xe6, 0x1a, 0xc4, 0xb7, 0x71, 0xfa, 0x8e, 0xbf, 0x76, 0xca, 0x95, - 0xd6, 0x51, 0xa4, 0xba, 0x87, 0x3b, 0x24, 0xcf, 0x97, 0xff, 0x75, 0x5b, 0xc7, 0x49, - 0xf4, 0x09, 0x6d, 0x2d, 0xa1, 0x5c, 0xf8, 0x30, 0x36, 0xcc, 0x22, 0x0f, 0x0a, 0x68, - 0x93, 0x43, 0x21, 0xc9, 0xae, 0x33, 0x4e, 0x2d, 0x99, 0xa9, 0x95, 0xe9, 0x29, 0x04, - 0xc1, 0x45, 0x23, 0x33, 0x19, 0x00, 0xcb, 0xca, 0x20, 0x4a, 0xdc, 0xb6, 0x93, 0x9d, - 0xc1, 0x71, 0x87, 0x53, 0x53, 0xa1, 0x1e, 0x12, 0xba, 0xcb, 0x2a, 0xab, 0x0f, 0x57, - 0x17, 0x9f, 0x1b, 0x67, 0xea, 0xcc, 0x7e, 0x7b, 0x6c, 0x5c, 0xc8, 0xa3, 0x78, 0x64, - 0x9b, 0x62, 0xb8, 0x52, 0xfa, 0x47, 0x6f, 0x93, 0x37, 0x88, 0x59, 0xd0, 0xd9, 0xa3, - 0x03, 0x3d, 0xa1, 0x31, 0x28, 0x17, 0x57, 0xad, 0x98, 0x5c, 0x86, 0xfe, 0x03, 0x7a, - 0x4e, 0xdd, 0x0a, 0x4a, 0x49, 0xee, 0x5c, 0x4f, 0x48, 0x15, 0xf0, 0x14, 0x73, 0xb9, - 0x60, 0xa1, 0x8a, 0x3b, 0x7f, 0x75, 0x07, 0xee, 0x3d, 0x8b, 0x39, 0x5a, 0x76, 0x68, - 0x40, 0x95, 0x5b, 0xaa, 0xdd, 0x0a, 0xbb, 0xf4, 0xf5, 0x91, 0x4e, 0x92, 0x10, 0xf5, - 0x9e, 0x4c, 0xd1, 0x3c, 0x82, 0xe0, 0xac, 0xf8, 0x79, 0x51, 0x78, 0x02, 0x91, 0xd0, - 0xa9, 0xa7, 0x0f, 0x6b, 0x4f, 0xf5, 0x0d, 0x81, 0x0d, 0x50, 0x90, 0x20, 0x45, 0x30, - 0xad, 0x69, 0x44, 0xb1, 0x3d, 0x23, 0x83, 0xab, 0xca, 0x42, 0x0c, 0xb6, 0xd9, 0xfc, - 0xd8, 0xfd, 0xcb, 0xe9, 0xb3, 0xb5, 0xf4, 0x2f, 0x0a, 0xf5, 0xdf, 0x36, 0x37, 0x8c, - 0xe7, 0x3d, 0xc9, 0x06, 0x16, 0x7d, 0xd4, 0xb3, 0x80, 0x41, 0x8f, 0x17, 0xe4, 0x50, - 0x61, 0x18, 0x57, 0x23, 0xda, 0xbb, 0x6f, 0xfd, 0xbb, 0xd5, 0xa4, 0x18, 0xc3, 0xc6, - 0xfd, 0x33, 0x70, 0x34, 0x09, 0x94, 0x27, 0x7b, 0x88, 0x8e, 0xe4, 0x9b, 0x08, 0x91, - 0xbb, 0xb9, 0x4b, 0x6b, 0x8b, 0x06, 0x5f, 0xd1, 0x92, 0x00, 0xdc, 0x3a, 0x68, 0x1c, - 0xa5, 0xff, 0x2a, 0x98, 0x8f, 0xa6, 0x6d, 0x02, 0x9d, 0xdd, 0xf9, 0xb0, 0x3a, 0x5e, - 0x6c, 0x6e, 0x99, 0xb6, 0x35, 0x41, 0x15, 0x6a, 0x09, 0x51, 0xd9, 0x08, 0x7d, 0xd8, - 0x83, 0xd5, 0x13, 0x9e, 0xe6, 0x7a, 0x8c, 0xe5, 0xdd, 0x6e, 0xf1, 0x4c, 0x9a, 0x10, - 0xdb, 0x81, 0x8b, 0x93, 0x69, 0x02, 0xc7, 0x99, 0x93, 0x90, 0xf9, 0x72, 0xba, 0xfa, - 0x5a, 0x57, 0x2f, 0xc8, 0x73, 0x42, 0xe2, 0xc5, 0x1c, 0xeb, 0x80, 0x30, 0xe0, 0x6b, - 0x72, 0x40, 0x95, 0xf9, 0x8d, 0x7b, + 0xbe, 0x1d, 0xff, 0xd3, 0x37, 0x0c, 0x67, 0x56, 0x69, 0xcc, 0x9a, 0xe1, 0xd0, 0x30, + 0x2d, 0x7f, 0x90, 0x6d, 0x25, 0x23, 0x09, 0x3c, 0x24, 0xf4, 0x25, 0x7a, 0x83, 0xbc, + 0x4f, 0x36, 0x62, 0x3a, 0x08, 0x2c, 0xe6, 0xeb, 0x45, 0x21, 0x95, 0x71, 0x91, 0xd5, + 0x7e, 0x14, 0x11, 0xed, 0xe7, 0x1d, 0x44, 0xb5, 0x6c, 0x57, 0xcb, 0x22, 0x81, 0x4a, + 0x04, 0x69, 0x39, 0xd2, 0xff, 0xf9, 0x2b, 0x46, 0x62, 0x76, 0x2d, 0x4f, 0x21, 0xc0, + 0x78, 0x42, 0x74, 0x72, 0xb9, 0x18, 0x10, 0x10, 0x55, 0x56, 0xf4, 0xde, 0x0a, 0x27, + 0xe7, 0x70, 0x08, 0x47, 0x72, 0xcb, 0xfe, 0xbf, 0x87, 0xdb, 0x33, 0x14, 0xab, 0x70, + 0xf2, 0x6d, 0x11, 0xea, 0x5d, 0xe2, 0x67, 0xc3, 0xa9, 0xa8, 0xf4, 0x6b, 0xad, 0x13, + 0xc7, 0x36, 0x26, 0x10, 0xbd, 0xba, 0x81, 0x02, 0xd4, 0xb7, 0x26, 0xef, 0x26, 0xec, + 0x79, 0x4a, 0x15, 0x66, 0x57, 0x1b, 0xfd, 0xc1, 0x02, 0x47, 0x7d, 0xa5, 0xb4, 0x9b, + 0xbf, 0x9f, 0xe4, 0xb1, 0xa4, 0x4e, 0xd0, 0xb3, 0xbc, 0xed, 0x99, 0xba, 0x81, 0x9a, + 0x4f, 0x30, 0x22, 0x65, 0x49, 0x44, 0x5b, 0xc6, 0x1c, 0xff, 0x5c, 0x33, 0x16, 0x33, + 0x5f, 0x6b, 0xd4, 0xa9, 0xa4, 0x24, 0xc9, 0x4a, 0xe0, 0xb5, 0xcb, 0xe4, 0x8a, 0xfb, + 0x2b, 0x94, 0xd0, 0xc7, 0xe4, 0x4e, 0x32, 0x30, 0x95, 0xa7, 0x2e, 0x42, 0x64, 0xe9, + 0x1c, 0x48, 0x94, 0xb9, 0xe8, 0x45, 0xaf, 0x32, 0x35, 0x02, 0xda, 0xe8, 0xc1, 0x86, + 0x78, 0xa4, 0xf7, 0x40, 0xe5, 0xa6, 0x3a, 0x4c, 0x70, 0x29, 0x92, 0xfa, 0xcd, 0xd3, + 0x57, 0x35, 0xb1, 0xd1, 0x34, 0x8b, 0x91, 0x9c, 0x70, 0x0c, 0x42, 0xd3, 0x30, 0xd3, + 0x86, 0xaf, 0xb8, 0x73, 0xfa, 0xba, 0xd8, 0xcb, 0x32, 0x18, 0x15, 0x1b, 0x40, 0x18, + 0x01, 0xe3, 0x69, 0x34, 0x4f, 0xf2, 0x0a, 0xaa, 0x66, 0x73, 0x47, 0x4f, 0x4b, 0xfc, + 0x98, 0xd0, 0x7e, 0x36, 0x7b, 0xc4, 0x2e, 0xf1, 0xa0, 0x4f, 0xa1, 0xbc, 0x12, 0x52, + 0x18, 0x8d, 0xd9, 0xd3, 0xe0, 0x00, 0xe3, 0xf5, 0xe9, 0xdf, 0xc9, 0xe1, 0x3e, 0xe9, + 0xdb, 0x55, 0x04, 0x0d, 0x17, 0x22, 0x7d, 0xa4, 0x4a, 0x3e, 0x08, 0xfd, 0x5e, 0xc8, + 0x58, 0xc4, 0x9c, 0x2e, 0x6a, 0x71, 0x1f, 0x8e, 0x68, 0xd0, 0xa1, 0xdf, 0x88, 0xef, + 0x09, 0x40, 0xf7, 0x2e, 0xd7, 0x3e, 0xf4, 0x9e, 0x8a, 0x45, 0xae, 0x2e, 0x5e, 0x1b, + 0xf1, 0x37, 0xba, 0x58, 0xcf, 0xb9, 0x25, 0x79, 0xab, 0xb2, 0xa4, 0x93, 0x13, 0xa2, + 0xff, 0x3d, 0xb6, 0x16, 0x93, 0xd2, 0xb7, 0x58, 0xaf, 0x20, 0x47, 0x2a, 0xc6, 0x40, + 0x6b, 0xa3, 0x55, 0xb4, 0x8c, 0xee, 0x22, 0xe7, 0x0f, 0xb8, 0xf9, 0xd4, 0x8e, 0xa3, + 0x93, 0x4b, 0x62, 0x24, 0xac, 0xe2, 0x69, 0xb9, 0xef, 0x54, 0x6d, 0xbf, 0xc5, 0x2a, + 0xbe, 0xcf, 0xac, 0x59, 0x40, 0xf0, 0x40, 0xbd, 0x21, 0xe9, 0x0e, 0xfa, 0x82, 0x75, + 0x56, 0x1a, 0x88, 0xbc, 0x18, 0xe2, 0x6b, 0x98, 0x8d, 0x11, 0x79, 0xb7, 0xa2, 0xc3, + 0xaf, 0xd8, 0x6e, 0xf2, 0xa0, 0x90, 0x62, 0x52, 0x23, 0x23, 0x4b, 0x39, 0xc9, 0xe2, + 0x06, 0x8d, 0x94, 0x5d, 0xd7, 0x76, 0x3b, 0x01, 0x0c, 0x28, 0xc8, 0x9b, 0x72, 0xe2, + 0x55, 0x13, 0xb3, 0x9c, 0x3c, 0xe1, 0x17, 0x73, 0x42, 0x8a, 0xd3, 0x44, 0xe1, 0xd5, + 0xd5, 0x1b, 0x92, 0x00, 0x14, 0xf9, 0x17, 0x06, 0xff, 0xae, 0x3d, 0x86, 0x36, 0x14, + 0x77, 0xfd, 0x5d, 0xe0, 0x13, 0x42, 0x2c, 0x06, 0xa3, 0x32, 0xe3, 0x45, 0x79, 0x75, + 0xcf, 0x9b, 0xe9, 0xf9, 0xab, 0x3a, 0x06, 0x87, 0x2e, 0xf0, 0x71, 0x7d, 0x39, 0x08, + 0xbd, 0xeb, 0xf8, 0x41, 0x8c, 0xe5, 0x57, 0xd5, 0x2d, 0x51, 0xa2, 0x50, 0xc0, 0x8c, + 0x5b, 0x79, 0x3a, 0xd4, 0xbc, 0x0f, 0x16, 0xc6, 0x27, 0x89, 0xfe, 0xa2, 0xca, 0xb3, + 0x9c, 0xcc, 0xa4, 0x07, 0xee, 0x9e, 0x47, 0xf5, 0x6d, 0x20, 0xa7, 0x41, 0x91, 0x2c, + 0x6b, 0xad, 0xdb, 0xd7, 0xfa, 0x7b, 0x97, 0xe5, 0x46, 0x33, 0x61, 0x28, 0x74, 0x5a, + 0xe7, 0xd7, 0x30, 0xa5, 0x5a, 0x6a, 0xc7, 0xb8, 0xfc, 0xbd, 0x72, 0xce, 0x78, 0x95, + 0x9c, 0x7a, 0x79, 0x75, 0x21, 0x2c, ], ock: [ - 0x5b, 0x5b, 0x20, 0xfc, 0x46, 0xba, 0x14, 0xbd, 0x18, 0x43, 0xb6, 0xc7, 0x7e, 0xc3, - 0xf4, 0x55, 0xb7, 0x65, 0xb4, 0xd1, 0x2d, 0xb6, 0x52, 0xeb, 0x34, 0x20, 0x0c, 0x41, - 0x48, 0x88, 0x1f, 0xfc, + 0xeb, 0x3e, 0xd9, 0xfc, 0xb3, 0xaa, 0x91, 0xc4, 0xf5, 0xec, 0xfd, 0x43, 0xdb, 0xda, + 0x40, 0x33, 0x06, 0x93, 0xc3, 0xa6, 0x56, 0x75, 0x45, 0xfd, 0x23, 0x6a, 0xf1, 0x90, + 0x8e, 0x29, 0x42, 0xa3, ], op: [ 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, - 0x67, 0xa8, 0x60, 0x9e, 0x24, 0x75, 0x30, 0x5c, 0x35, 0xcf, 0x37, 0xeb, 0xd2, 0x77, - 0x82, 0x35, 0x16, 0x58, 0x5a, 0xfa, 0x06, 0x05, 0x78, 0x52, 0x17, 0x1e, 0x0c, 0xe4, - 0xb0, 0x52, 0xd5, 0xb4, 0x20, 0x41, 0xd8, 0x1c, + 0x67, 0xa8, 0x60, 0x9e, 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, + 0x6b, 0x8d, 0x6f, 0xea, 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, + 0xd5, 0xcb, 0xab, 0x1a, 0xcc, 0xd5, 0x4e, 0x3a, ], c_out: [ - 0xe0, 0x1b, 0x5c, 0x1e, 0x01, 0x90, 0x0f, 0xf7, 0x9b, 0xf7, 0x27, 0xf5, 0x37, 0xc4, - 0xac, 0x36, 0xf8, 0x06, 0x7a, 0x0c, 0xc5, 0xc8, 0xe9, 0xc8, 0x20, 0x44, 0x28, 0x43, - 0x69, 0x35, 0x30, 0x91, 0x8a, 0xea, 0x67, 0x2c, 0x4c, 0xd8, 0xfa, 0x3f, 0x6f, 0x2c, - 0xb6, 0x8b, 0x87, 0x17, 0x22, 0xe7, 0x78, 0xf6, 0xe2, 0x5e, 0x78, 0xae, 0x00, 0xa8, - 0x43, 0x28, 0xc4, 0xc2, 0xbf, 0x1c, 0x79, 0xb2, 0xc9, 0xd8, 0x69, 0x72, 0x60, 0xcd, - 0x44, 0x7e, 0x2e, 0xff, 0x31, 0x5d, 0x74, 0xb5, 0xb1, 0xfd, - ], + 0x60, 0xf3, 0xe8, 0x94, 0xe3, 0x86, 0x4e, 0xfb, 0x48, 0xcc, 0xae, 0x50, 0xe1, 0x0d, + 0xa7, 0x73, 0xdc, 0xcf, 0x85, 0x62, 0x45, 0x5d, 0x1b, 0x73, 0x1a, 0xad, 0x44, 0xe1, + 0x5e, 0x3e, 0x40, 0x18, 0x31, 0xce, 0x6f, 0x92, 0xf4, 0x53, 0x2d, 0x90, 0x83, 0x92, + 0x59, 0xce, 0x9c, 0xb1, 0x44, 0x62, 0x1f, 0x12, 0x01, 0x77, 0x8f, 0x61, 0x5d, 0x09, + 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, + 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1351,34 +1357,34 @@ pub(crate) fn test_vectors() -> Vec { 0x88, 0xff, 0xee, 0x2f, ], rho: [ - 0xe9, 0x16, 0x93, 0xc3, 0x7d, 0x04, 0x37, 0x5e, 0x67, 0xc5, 0x71, 0x5a, 0x39, 0xc9, - 0x79, 0x4a, 0x4e, 0xcd, 0x08, 0x38, 0xe2, 0x35, 0x1f, 0xd7, 0xcd, 0x93, 0xa1, 0x55, - 0x7f, 0x01, 0x02, 0x3e, + 0x54, 0x3e, 0xa7, 0x11, 0x56, 0xc9, 0xa6, 0xf8, 0x04, 0x1f, 0xa7, 0x7e, 0xc1, 0xc5, + 0xaf, 0x90, 0x28, 0x8f, 0x27, 0x20, 0xf1, 0x3f, 0xf0, 0x93, 0xc6, 0x86, 0x26, 0x6b, + 0x92, 0xd7, 0xa0, 0x24, ], cmx: [ - 0xcc, 0x29, 0x41, 0xe0, 0xf6, 0x38, 0x25, 0x7f, 0xb6, 0x51, 0x6a, 0x27, 0xc3, 0x0e, - 0xaa, 0xe0, 0xb4, 0x6d, 0x2f, 0xf0, 0x6a, 0x73, 0x50, 0x70, 0x41, 0x74, 0x6c, 0xdc, - 0x23, 0x07, 0x61, 0x25, + 0x1d, 0x51, 0xea, 0x92, 0xfa, 0x43, 0x55, 0x0a, 0x0e, 0xdd, 0xea, 0x23, 0x6e, 0x17, + 0xa0, 0x16, 0x93, 0xc2, 0x2d, 0x8d, 0xd8, 0x1c, 0x9c, 0x9e, 0xc8, 0x76, 0xa2, 0x4e, + 0x67, 0xd4, 0x93, 0x0b, ], esk: [ - 0xec, 0x99, 0xeb, 0x6f, 0x67, 0x1d, 0x0a, 0x9e, 0x84, 0x5a, 0xbf, 0xb7, 0x8a, 0xec, - 0xe9, 0x32, 0xeb, 0x13, 0xf5, 0xae, 0xd6, 0x4f, 0x20, 0xa7, 0x77, 0xc9, 0x46, 0xe9, - 0xcd, 0x7a, 0x24, 0x23, + 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, 0x14, 0xb0, 0xdf, 0x85, + 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, 0xc4, 0x84, 0xa9, 0xf4, + 0xc7, 0xda, 0x74, 0x36, ], ephemeral_key: [ - 0xad, 0xa7, 0x60, 0x27, 0xdc, 0xae, 0xb5, 0xf1, 0x58, 0xac, 0x6c, 0x5c, 0x6d, 0x7f, - 0x05, 0x31, 0x8f, 0xec, 0x26, 0xd5, 0xc7, 0x94, 0xf2, 0xe9, 0x00, 0xcb, 0x96, 0x29, - 0x92, 0x49, 0xe0, 0xb5, + 0x8f, 0xbe, 0xb6, 0xb3, 0x03, 0x8e, 0x69, 0x49, 0x91, 0x6a, 0x2c, 0x06, 0x0e, 0xf9, + 0xa4, 0xb1, 0xfe, 0xf1, 0x3a, 0xce, 0x2f, 0xee, 0x00, 0x25, 0xda, 0x32, 0xc3, 0x6d, + 0x23, 0x1a, 0x61, 0x34, ], shared_secret: [ - 0xc2, 0x5c, 0xf1, 0xd6, 0x53, 0x2e, 0x06, 0xcb, 0x8b, 0x15, 0x22, 0x14, 0x76, 0x6e, - 0xee, 0xd7, 0x5a, 0x17, 0x8c, 0x82, 0x2a, 0x11, 0x51, 0xf6, 0x9e, 0x92, 0xe9, 0xcf, - 0xfa, 0x47, 0xcb, 0x19, + 0x67, 0xd6, 0x8a, 0x5a, 0x05, 0x93, 0xfd, 0x16, 0x7d, 0x38, 0x08, 0x2e, 0x49, 0xd2, + 0x30, 0x30, 0x86, 0xe5, 0x5a, 0x43, 0xc1, 0x24, 0xd5, 0xaa, 0xa8, 0x20, 0xab, 0x0c, + 0x3f, 0x5c, 0xc5, 0x37, ], k_enc: [ - 0xd4, 0xef, 0x89, 0xc4, 0x64, 0xbe, 0x8f, 0x42, 0xf6, 0xb7, 0xf2, 0x6d, 0x89, 0x37, - 0x8b, 0x73, 0xa3, 0x55, 0xa4, 0xfe, 0x24, 0x6c, 0x2e, 0xc8, 0xe8, 0x14, 0x6b, 0xef, - 0x7d, 0xdd, 0x14, 0x19, + 0x6b, 0x8d, 0x83, 0xf2, 0xf1, 0xfd, 0x1e, 0xad, 0x7d, 0x45, 0x42, 0xb3, 0x63, 0x09, + 0x34, 0x07, 0xc5, 0x0a, 0x20, 0xed, 0x7f, 0x0e, 0x8c, 0xf2, 0xdb, 0x53, 0x6d, 0xb1, + 0xbe, 0x25, 0xe9, 0x8d, ], p_enc: [ 0x02, 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, 0x10, 0xb8, @@ -1424,69 +1430,70 @@ pub(crate) fn test_vectors() -> Vec { 0x1a, 0x81, 0xa3, 0x59, ], c_enc: [ - 0xea, 0x86, 0x7e, 0x07, 0xac, 0xb7, 0xfa, 0x03, 0xe7, 0x36, 0xce, 0xdd, 0xed, 0x82, - 0x3d, 0x19, 0x91, 0x30, 0xfb, 0x3f, 0xef, 0x62, 0xcc, 0x3e, 0xa9, 0xa0, 0xc9, 0x35, - 0xdf, 0x05, 0xc5, 0xad, 0x5e, 0x67, 0xf7, 0x4f, 0xcb, 0xa6, 0x67, 0xe0, 0x81, 0x1c, - 0xdc, 0x0c, 0xa9, 0xf3, 0xd7, 0x81, 0x76, 0x43, 0x75, 0x56, 0x47, 0xbe, 0x59, 0xdf, - 0x09, 0x6e, 0x46, 0x5e, 0xc1, 0x11, 0x24, 0x36, 0x3c, 0x98, 0x1c, 0x55, 0xd5, 0x5f, - 0x8d, 0x8a, 0xc8, 0xb6, 0x54, 0x0a, 0x98, 0xcf, 0xcc, 0x29, 0x4a, 0xa7, 0xcc, 0x62, - 0x95, 0x50, 0x85, 0x3a, 0x25, 0xbf, 0x6b, 0x32, 0x35, 0x16, 0xe1, 0x58, 0x2b, 0x4e, - 0x8b, 0x82, 0x95, 0xe2, 0x7f, 0x6b, 0x99, 0x94, 0x80, 0x2e, 0xfe, 0xf5, 0x43, 0x1f, - 0x03, 0x7d, 0x22, 0x09, 0xa0, 0x88, 0x07, 0x34, 0x6f, 0xb3, 0x9c, 0xad, 0xd8, 0x93, - 0xd6, 0x5f, 0x64, 0xc7, 0xfe, 0x92, 0xec, 0xbc, 0xdf, 0xe5, 0x55, 0x54, 0xca, 0xff, - 0xb0, 0xcf, 0x41, 0xeb, 0x5c, 0x55, 0x72, 0xba, 0x44, 0x39, 0x90, 0x00, 0xe9, 0xfa, - 0x9a, 0xaf, 0x6e, 0xb7, 0x6c, 0x2a, 0x8a, 0x5d, 0x7b, 0x6b, 0x52, 0xb9, 0xa9, 0xef, - 0x6e, 0xc3, 0xed, 0xa6, 0x65, 0xfe, 0x8a, 0xa8, 0x07, 0x48, 0xb8, 0x1f, 0x7d, 0x55, - 0x96, 0xf1, 0x94, 0x2f, 0xf7, 0x1d, 0x29, 0xc6, 0x78, 0xa3, 0xb6, 0xc6, 0x6b, 0xa7, - 0x0f, 0x45, 0xb1, 0xfc, 0xf2, 0x22, 0x38, 0x84, 0x50, 0x68, 0xf3, 0x60, 0xb0, 0x99, - 0xae, 0xe9, 0xf2, 0xf0, 0xef, 0x22, 0x33, 0x3f, 0xd6, 0x4f, 0xf1, 0x1e, 0x48, 0x15, - 0x43, 0xa5, 0x2b, 0xb3, 0x3f, 0x52, 0x3d, 0xe2, 0xec, 0x92, 0x3a, 0xe9, 0x86, 0x58, - 0x57, 0x71, 0x7b, 0x65, 0xd4, 0x4c, 0x3d, 0x9d, 0xb7, 0xb3, 0xec, 0xb2, 0xff, 0x02, - 0x25, 0x29, 0x7d, 0xeb, 0x83, 0xdd, 0x1b, 0x9a, 0x39, 0x4d, 0x69, 0x7c, 0x09, 0xd7, - 0xfe, 0xc6, 0x1e, 0xac, 0xee, 0x39, 0xa2, 0xf1, 0xce, 0xd9, 0xe6, 0xfd, 0xa5, 0xc0, - 0xf3, 0x27, 0x71, 0xc6, 0xce, 0x3f, 0x17, 0xbe, 0x0e, 0xef, 0x81, 0x10, 0x99, 0xc1, - 0x09, 0xe4, 0xfb, 0x6a, 0xec, 0x30, 0xdf, 0x04, 0x5b, 0x43, 0xda, 0x89, 0x30, 0x8b, - 0xc8, 0x37, 0x68, 0x8b, 0xb0, 0xf4, 0xa2, 0xc6, 0x04, 0xa1, 0x54, 0xa8, 0x47, 0xc5, - 0xd7, 0x87, 0x27, 0xf0, 0xe1, 0xab, 0x11, 0xe3, 0x40, 0xcf, 0xd4, 0xc7, 0xe8, 0xc6, - 0xba, 0xff, 0xfe, 0xfc, 0x74, 0xef, 0x55, 0x3d, 0x4b, 0x29, 0x26, 0x9f, 0x38, 0xb4, - 0xb7, 0xfe, 0x6e, 0x07, 0x3a, 0x70, 0xae, 0xf2, 0x0d, 0x6c, 0x23, 0x8b, 0x9f, 0xfd, - 0x24, 0x1f, 0xf6, 0x99, 0x99, 0x92, 0x30, 0xf0, 0xb3, 0x9c, 0x96, 0x3e, 0xfa, 0x00, - 0xef, 0x7f, 0x09, 0x2d, 0x76, 0x0c, 0x40, 0x9a, 0x2b, 0x6c, 0x26, 0xb4, 0x97, 0x82, - 0x9b, 0x81, 0xcb, 0xa4, 0xc8, 0x3b, 0x11, 0x44, 0xc6, 0x5a, 0x2d, 0x31, 0x78, 0xbb, - 0x28, 0xc1, 0xd8, 0xe3, 0x30, 0xd3, 0xf4, 0xaf, 0x90, 0x10, 0xad, 0x49, 0xa5, 0xdb, - 0x70, 0xd6, 0x6a, 0xf5, 0x70, 0x19, 0x21, 0x49, 0x80, 0x5f, 0xe1, 0xca, 0x61, 0xc6, - 0xd4, 0xec, 0xaf, 0xa7, 0x97, 0x51, 0x7f, 0x33, 0x06, 0xaf, 0x2a, 0x32, 0x27, 0x3b, - 0xf3, 0xd6, 0x98, 0xaa, 0x55, 0xa5, 0x72, 0xb2, 0xdf, 0x80, 0x36, 0xd9, 0x7c, 0xf5, - 0x8c, 0x12, 0x9f, 0x82, 0x85, 0xd0, 0xd7, 0xea, 0x04, 0xc1, 0x88, 0xa8, 0x39, 0x6e, - 0x73, 0x8b, 0xd4, 0x48, 0x46, 0x5e, 0x7b, 0x9a, 0x64, 0xb7, 0x96, 0x7b, 0xcb, 0x25, - 0xf8, 0xaa, 0x85, 0x9e, 0xa5, 0xca, 0x06, 0xc3, 0xdf, 0x39, 0x0f, 0xac, 0x8a, 0xc6, - 0x06, 0x05, 0x03, 0x1a, 0x02, 0x09, 0xbb, 0x80, 0x24, 0x0d, 0x05, 0x45, 0xf4, 0x11, - 0x77, 0xea, 0xb4, 0x40, 0x2e, 0x8a, 0x42, 0x3a, 0x40, 0xcc, 0xff, 0x58, 0x6b, 0x2e, - 0xdd, 0x6a, 0xcf, 0xb8, 0xf1, 0xd8, 0x0d, 0x8c, 0x60, 0x5f, 0x49, 0x05, 0x2e, 0x7a, - 0x30, 0x82, 0x6e, 0x1f, 0x03, 0x09, 0x9c, 0x71, 0x43, 0xad, 0x0b, 0x51, 0xfc, 0x63, - 0x6f, 0x1d, 0x87, 0x05, 0x83, 0xd6, 0xed, 0xce, 0xcd, 0xe9, 0x42, 0x38, 0x9e, 0x6c, - 0x01, 0x00, 0x66, 0x78, 0xda, 0xad, + 0x77, 0xc6, 0xef, 0xc8, 0xb5, 0x42, 0xa7, 0x07, 0xc0, 0xa5, 0xcf, 0x5c, 0xe3, 0xf3, + 0xb9, 0x6d, 0xe1, 0x91, 0x95, 0x7c, 0x9f, 0xa6, 0xe9, 0xbb, 0x4b, 0x8d, 0x89, 0x9e, + 0x1f, 0x19, 0xe0, 0x20, 0xba, 0x7b, 0xb3, 0xfe, 0xf1, 0x67, 0x81, 0xc8, 0x8c, 0xc5, + 0xd4, 0x4a, 0x5e, 0xf8, 0x17, 0x31, 0x47, 0xdc, 0x3d, 0x1b, 0x51, 0x6a, 0xf6, 0xdd, + 0x77, 0xdd, 0xb6, 0xee, 0x67, 0xaa, 0xf5, 0x42, 0xce, 0xe2, 0xbe, 0xd3, 0xe4, 0xa0, + 0x7e, 0xce, 0x42, 0x8f, 0x22, 0xa8, 0x01, 0xcf, 0x01, 0xba, 0xad, 0x18, 0x27, 0xfd, + 0x42, 0x57, 0x46, 0xc5, 0x45, 0x00, 0x1c, 0x35, 0x6d, 0x0a, 0xbe, 0xaa, 0xa5, 0xa4, + 0x22, 0xdf, 0xff, 0x0e, 0xe2, 0x18, 0xac, 0x37, 0xef, 0x83, 0x97, 0xc6, 0x2c, 0xa8, + 0x6f, 0xab, 0xeb, 0xb6, 0x88, 0xb3, 0x8f, 0xb4, 0xa6, 0x54, 0x29, 0x11, 0xbe, 0x1c, + 0x5e, 0x71, 0x77, 0x8b, 0x5e, 0xb5, 0x3a, 0xf1, 0xc4, 0xcb, 0x4d, 0xd9, 0x94, 0x72, + 0x4f, 0x61, 0x0f, 0x38, 0x72, 0x4a, 0x73, 0xdf, 0x09, 0x2b, 0xea, 0xe8, 0xb8, 0x7f, + 0x7f, 0x6a, 0x2b, 0xc0, 0x9d, 0xf2, 0xaa, 0x18, 0xc2, 0xf8, 0xee, 0xba, 0x63, 0xee, + 0x0d, 0x31, 0x35, 0x3b, 0x6f, 0x28, 0x3e, 0xf5, 0x9a, 0xc1, 0x53, 0x60, 0x73, 0xda, + 0x7a, 0x6d, 0x82, 0xbf, 0xdc, 0x09, 0x74, 0x02, 0x08, 0x0f, 0xa1, 0x03, 0xcb, 0x8b, + 0x3e, 0xfb, 0x94, 0x1e, 0xe5, 0x01, 0xf6, 0x41, 0x2c, 0xfb, 0xc2, 0x50, 0xaf, 0xad, + 0xbe, 0x54, 0x4a, 0xc5, 0x1f, 0xce, 0x41, 0x5a, 0x24, 0x93, 0xba, 0x83, 0x9e, 0x38, + 0x18, 0xb0, 0xfe, 0x30, 0x18, 0xbf, 0xa4, 0x37, 0xf0, 0x6e, 0x31, 0x86, 0x14, 0x8a, + 0xa4, 0x05, 0xba, 0xb8, 0x21, 0xa2, 0x6e, 0xa0, 0x7f, 0x93, 0xcf, 0xe7, 0x56, 0x8f, + 0xe3, 0xef, 0x08, 0xfa, 0x0b, 0x80, 0xfc, 0xec, 0x5b, 0xd5, 0x91, 0x5f, 0x68, 0x8c, + 0xf5, 0x99, 0x31, 0x5e, 0x79, 0xaa, 0xea, 0x34, 0xd5, 0x18, 0xd9, 0x55, 0xfe, 0xef, + 0x30, 0x3f, 0x69, 0xb2, 0x87, 0xc6, 0xd0, 0x51, 0x6d, 0xa2, 0x39, 0xfb, 0xbd, 0xdb, + 0xaf, 0x25, 0x56, 0xeb, 0xce, 0x77, 0xa3, 0xd5, 0x97, 0x23, 0x5c, 0x22, 0xd3, 0x8c, + 0x5b, 0x5e, 0xeb, 0x98, 0xc7, 0xc0, 0x8d, 0xa8, 0xd3, 0x76, 0xbb, 0xa1, 0xb5, 0x07, + 0x85, 0xbe, 0x82, 0xbf, 0xe0, 0x9a, 0xe7, 0x1c, 0xcc, 0xaf, 0x31, 0xa2, 0xf0, 0xcf, + 0xa0, 0x76, 0xd1, 0xe4, 0xd1, 0xb5, 0x2f, 0xee, 0x45, 0xc8, 0xed, 0x23, 0xdf, 0x33, + 0xa8, 0x1c, 0xb1, 0xa8, 0xac, 0xec, 0x9f, 0x53, 0x5d, 0xa4, 0x96, 0x70, 0xf9, 0x98, + 0x6d, 0x5c, 0x92, 0xc8, 0x2b, 0x0a, 0xd2, 0x20, 0xf8, 0x5f, 0x3b, 0x38, 0x72, 0xeb, + 0xe0, 0x53, 0xcd, 0xeb, 0x96, 0x1b, 0xd2, 0xd3, 0xab, 0x3b, 0xcd, 0x67, 0x6e, 0x6f, + 0xd7, 0xcb, 0xe9, 0x79, 0x5e, 0x1f, 0x2d, 0x82, 0x87, 0x00, 0x7c, 0x91, 0x0e, 0x7b, + 0x43, 0x01, 0x69, 0xe4, 0x51, 0xf0, 0xb2, 0xd7, 0x63, 0xe5, 0x43, 0x03, 0x3b, 0xc6, + 0xc7, 0x38, 0x9f, 0xa1, 0x61, 0x5b, 0xa1, 0x9d, 0x1f, 0x27, 0x48, 0xb2, 0x17, 0xc9, + 0x60, 0xfe, 0x05, 0x04, 0x07, 0xc8, 0xf4, 0x73, 0x35, 0x6b, 0xaa, 0x6e, 0x0c, 0x7d, + 0x77, 0xfa, 0xc6, 0xc7, 0xdb, 0x45, 0x12, 0xaf, 0x57, 0x96, 0xb3, 0xbc, 0xf1, 0x23, + 0xe0, 0x90, 0xb9, 0x80, 0xeb, 0xc2, 0xd6, 0x4b, 0x86, 0xdd, 0x24, 0xcb, 0x9a, 0x6d, + 0xab, 0x1d, 0xb4, 0x13, 0x04, 0x75, 0x38, 0x90, 0x2e, 0x2e, 0x49, 0x0e, 0x4f, 0xc8, + 0x78, 0xaa, 0x04, 0xdb, 0xef, 0x66, 0x99, 0x63, 0x9c, 0x3d, 0xab, 0x17, 0xc5, 0x14, + 0x70, 0x48, 0xac, 0x6d, 0x48, 0x49, 0x0d, 0xc4, 0x88, 0x5e, 0xd9, 0x86, 0x70, 0x63, + 0x35, 0xf4, 0x1b, 0xa4, 0x15, 0x59, 0x65, 0x9e, 0x1b, 0x53, 0xda, 0x76, 0x51, 0x4c, + 0xc4, 0x0a, 0xdb, 0x66, 0xc3, 0x5c, 0xe5, 0x6f, 0x3a, 0xbe, 0x39, 0xe1, 0xae, 0xe5, + 0x84, 0x9f, 0xff, 0xcc, 0x6e, 0x1f, 0x1b, 0xf8, 0x11, 0xce, 0xb6, 0x65, 0xa6, 0xfc, + 0xf8, 0x80, 0x6b, 0xbb, 0xba, 0x4a, 0x5b, 0x87, 0x38, 0xa1, 0x17, 0xdc, 0xaf, 0xfb, + 0x4f, 0xdf, 0x10, 0x08, 0x00, 0x6f, ], ock: [ - 0xf9, 0x59, 0x87, 0xcc, 0x0c, 0x73, 0x57, 0xc7, 0x20, 0x26, 0x27, 0xa5, 0xa5, 0x50, - 0x09, 0xef, 0xd7, 0x17, 0x55, 0x3e, 0x9d, 0x34, 0xc1, 0x5f, 0xad, 0xf5, 0xc9, 0x46, - 0xa9, 0xa0, 0x72, 0x17, + 0xb4, 0xf8, 0x8a, 0x29, 0x2d, 0x09, 0xd9, 0x35, 0xb4, 0x77, 0x5a, 0x29, 0x30, 0xeb, + 0x38, 0xce, 0xbd, 0x5a, 0xf6, 0xff, 0x3f, 0x39, 0xef, 0x5b, 0xb2, 0x4c, 0xd5, 0x72, + 0x81, 0xf0, 0x8c, 0xfb, ], op: [ 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, - 0x6b, 0x80, 0xbb, 0xb7, 0xec, 0x99, 0xeb, 0x6f, 0x67, 0x1d, 0x0a, 0x9e, 0x84, 0x5a, - 0xbf, 0xb7, 0x8a, 0xec, 0xe9, 0x32, 0xeb, 0x13, 0xf5, 0xae, 0xd6, 0x4f, 0x20, 0xa7, - 0x77, 0xc9, 0x46, 0xe9, 0xcd, 0x7a, 0x24, 0x23, + 0x6b, 0x80, 0xbb, 0xb7, 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, + 0x14, 0xb0, 0xdf, 0x85, 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, + 0xc4, 0x84, 0xa9, 0xf4, 0xc7, 0xda, 0x74, 0x36, ], c_out: [ - 0x28, 0x9d, 0x00, 0xd4, 0x62, 0x78, 0x0b, 0xdb, 0xb6, 0xcd, 0x6c, 0xec, 0x93, 0x6b, - 0xe6, 0x5e, 0x63, 0x0d, 0x4a, 0x3c, 0x2a, 0xf7, 0x6e, 0x10, 0x4b, 0x17, 0x4e, 0x3d, - 0x5b, 0x71, 0x66, 0x39, 0xb0, 0x68, 0xb3, 0x85, 0x00, 0xd8, 0x04, 0x00, 0xee, 0x64, - 0x2f, 0x8e, 0x08, 0xc8, 0xdb, 0x29, 0xff, 0xd5, 0xa9, 0xda, 0xde, 0x84, 0xa5, 0x49, - 0x5d, 0x57, 0x7b, 0x2f, 0x56, 0xd3, 0x2b, 0x07, 0x96, 0xca, 0x23, 0xf0, 0x0f, 0x0f, - 0x8e, 0xf9, 0x93, 0x07, 0x4f, 0x88, 0x0d, 0x6a, 0xeb, 0xcb, - ], + 0x94, 0xe3, 0x7f, 0xd6, 0x62, 0x82, 0xc0, 0x2e, 0x90, 0xe7, 0x69, 0x91, 0x4c, 0xaf, + 0x95, 0xa4, 0x95, 0xf4, 0x89, 0x7f, 0x55, 0xa5, 0xae, 0x95, 0xad, 0xe8, 0xbf, 0x67, + 0x61, 0xe3, 0x1b, 0xa5, 0xd1, 0xcf, 0xeb, 0x30, 0x6f, 0x4e, 0x22, 0x01, 0x42, 0x51, + 0xcb, 0xe3, 0xf8, 0x72, 0x4b, 0xe7, 0x69, 0x21, 0xe2, 0xad, 0xa4, 0x6e, 0x3b, 0x14, + 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, + 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1560,34 +1567,34 @@ pub(crate) fn test_vectors() -> Vec { 0xe2, 0x3c, 0x39, 0x11, ], rho: [ - 0x35, 0x6f, 0xc7, 0x2e, 0x1b, 0xf1, 0xe3, 0xa2, 0xa5, 0x9a, 0xa9, 0xe4, 0x75, 0x15, - 0x5c, 0xf7, 0x43, 0xf8, 0xfd, 0xf0, 0xd1, 0x5b, 0x4c, 0xc4, 0x02, 0x60, 0xd0, 0xd0, - 0x9a, 0xda, 0x04, 0x08, + 0xbd, 0xda, 0xe8, 0xdf, 0xf1, 0x20, 0x5e, 0x04, 0x96, 0x8f, 0xae, 0x1f, 0xd9, 0xbe, + 0x51, 0xd8, 0x25, 0xf5, 0xd8, 0x78, 0x1d, 0x93, 0x3d, 0x0f, 0x5b, 0xce, 0x9c, 0xa8, + 0x3e, 0xe8, 0xed, 0x20, ], cmx: [ - 0xca, 0xa2, 0x8a, 0x69, 0x04, 0x54, 0x66, 0x37, 0xa7, 0xd4, 0xe5, 0xfb, 0xc2, 0x65, - 0x4c, 0xbf, 0x24, 0x4d, 0x18, 0x77, 0x9d, 0x35, 0x62, 0x25, 0x6c, 0x14, 0xd5, 0xb1, - 0x00, 0x5d, 0xc6, 0x0f, + 0xbe, 0x43, 0xee, 0x84, 0x70, 0x70, 0x75, 0xac, 0x48, 0x08, 0xd0, 0x97, 0x54, 0x07, + 0xc0, 0x27, 0x36, 0xd7, 0x66, 0x64, 0xf4, 0xe7, 0xae, 0xce, 0x01, 0xd9, 0xcc, 0x68, + 0x32, 0x4a, 0xe9, 0x04, ], esk: [ - 0x01, 0xa3, 0x66, 0x1e, 0xa9, 0xaa, 0xb8, 0xf4, 0x32, 0x53, 0x42, 0x0e, 0xff, 0xd7, - 0xa4, 0x83, 0xc2, 0x79, 0xd4, 0x18, 0x18, 0xbc, 0xb3, 0xee, 0x91, 0x90, 0x01, 0xf8, - 0x66, 0xa8, 0xe9, 0x2c, + 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, 0x14, 0x49, 0x72, 0x62, + 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, 0xe2, 0x63, 0xf3, 0xe3, + 0x99, 0x07, 0xea, 0x0c, ], ephemeral_key: [ - 0x00, 0x62, 0x7e, 0x29, 0xc1, 0x83, 0x3e, 0x4e, 0x8f, 0xad, 0xe0, 0x82, 0x52, 0xf3, - 0x83, 0x67, 0x78, 0xb9, 0x39, 0x4c, 0x1f, 0xfe, 0xab, 0x70, 0xbf, 0x35, 0x93, 0xd5, - 0x9a, 0x81, 0xa0, 0xa5, + 0xfa, 0x19, 0xa1, 0x52, 0x7b, 0x76, 0x04, 0x8f, 0xf3, 0x7f, 0xa4, 0xf8, 0x27, 0x89, + 0xfe, 0x80, 0xb0, 0xcd, 0xd3, 0x5d, 0x5d, 0xa9, 0xc2, 0xec, 0x3f, 0xe3, 0x04, 0x38, + 0x05, 0xc0, 0x61, 0x23, ], shared_secret: [ - 0xa9, 0x93, 0x34, 0x1f, 0x99, 0xeb, 0xa8, 0x2d, 0xb6, 0xec, 0x5e, 0x71, 0x3e, 0xe2, - 0x9c, 0x01, 0xf4, 0xce, 0x2a, 0x8b, 0xb6, 0xb5, 0xeb, 0xb6, 0x0b, 0xa6, 0xeb, 0xa9, - 0x6b, 0xa4, 0x17, 0x9b, + 0x2d, 0xb5, 0xb8, 0x92, 0xb6, 0x1b, 0x9c, 0x55, 0x3b, 0x6c, 0x9b, 0x7a, 0xcc, 0x7d, + 0x71, 0x05, 0xc1, 0xdd, 0x4c, 0x28, 0xc6, 0x7f, 0x97, 0x8b, 0x6d, 0x79, 0xc7, 0x1b, + 0x98, 0xa0, 0xd0, 0x00, ], k_enc: [ - 0x35, 0x81, 0x19, 0x19, 0x3c, 0x9d, 0x2a, 0xb6, 0xd4, 0x95, 0xe0, 0x19, 0xf9, 0x7a, - 0x1c, 0x41, 0x30, 0xae, 0xe6, 0x3d, 0xae, 0xc6, 0xbb, 0xa2, 0xf2, 0x74, 0x40, 0x0f, - 0xd3, 0x4f, 0xad, 0x28, + 0x16, 0xe3, 0xf9, 0x85, 0xc0, 0x7f, 0xef, 0xe5, 0x30, 0xd9, 0xe6, 0x94, 0x5e, 0xde, + 0xc1, 0x90, 0x3b, 0xb1, 0xca, 0x8d, 0xa5, 0xa2, 0x5b, 0xe9, 0x59, 0x78, 0x63, 0x7a, + 0x40, 0x8c, 0x2e, 0xfe, ], p_enc: [ 0x02, 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, 0x46, 0x49, @@ -1633,69 +1640,70 @@ pub(crate) fn test_vectors() -> Vec { 0x84, 0x37, 0x3f, 0x4f, ], c_enc: [ - 0x31, 0xac, 0xda, 0xa6, 0xc1, 0x76, 0xbb, 0x7a, 0x2c, 0x7d, 0x66, 0x09, 0xdc, 0x2c, - 0x5e, 0x7b, 0x2e, 0xe7, 0x1d, 0xa9, 0x3c, 0x73, 0x87, 0x52, 0x74, 0xfa, 0x6c, 0x2a, - 0xd6, 0x26, 0x13, 0xc7, 0x18, 0x9b, 0x35, 0x33, 0xec, 0xf0, 0x34, 0xd8, 0x76, 0xc7, - 0x26, 0xf1, 0xed, 0x99, 0x43, 0xd4, 0x45, 0x07, 0x87, 0x52, 0x75, 0xa8, 0xe3, 0x71, - 0x0a, 0x11, 0x8d, 0x91, 0x64, 0x72, 0x91, 0x28, 0x6c, 0xf8, 0x80, 0xa7, 0x82, 0xab, - 0xea, 0xa8, 0xa6, 0xc3, 0x2f, 0xdf, 0x6f, 0x30, 0x4b, 0x0e, 0xe5, 0xbc, 0xb1, 0x4b, - 0x82, 0x79, 0x2a, 0xa3, 0xaf, 0xd7, 0x24, 0x3f, 0x57, 0xb7, 0xdc, 0xa7, 0x93, 0x52, - 0x19, 0xdf, 0x98, 0x2c, 0xe1, 0x28, 0xae, 0xa6, 0xf6, 0xbd, 0x18, 0xe1, 0x30, 0x7e, - 0xba, 0x0e, 0x3d, 0xb0, 0x06, 0x14, 0xc2, 0x65, 0xc6, 0xf2, 0x8b, 0xfe, 0x58, 0xc1, - 0x1d, 0x4a, 0xc9, 0x6d, 0x49, 0x02, 0x96, 0x7b, 0x54, 0xbc, 0x5d, 0xd1, 0x5c, 0x14, - 0x3f, 0xf4, 0x2b, 0xbb, 0x62, 0xb9, 0x34, 0xb0, 0x9e, 0x79, 0xb6, 0x1e, 0xaf, 0xe7, - 0x9a, 0xbc, 0x86, 0x94, 0x47, 0x5b, 0x6c, 0x8e, 0x19, 0x94, 0xba, 0x05, 0x5e, 0xa3, - 0xc1, 0x82, 0x93, 0xb0, 0x3c, 0x42, 0x49, 0x50, 0x1d, 0xfd, 0xc0, 0x14, 0x60, 0xcf, - 0x78, 0xcd, 0x97, 0x51, 0x30, 0xae, 0x34, 0x05, 0xba, 0x7d, 0xdc, 0x71, 0x30, 0xcb, - 0xdb, 0xb9, 0x8c, 0x7a, 0xaf, 0x6b, 0x1d, 0x0b, 0x44, 0xa5, 0x16, 0x79, 0xaa, 0x63, - 0x0a, 0x43, 0xae, 0x23, 0xb3, 0xd2, 0x2f, 0x73, 0x4c, 0xe1, 0xdb, 0xed, 0xea, 0x17, - 0x5a, 0x00, 0x62, 0xb0, 0x6e, 0x23, 0xf4, 0xd0, 0x6d, 0x2a, 0xd0, 0x45, 0xae, 0x98, - 0x2d, 0xb4, 0x34, 0x8f, 0x20, 0xc8, 0x9b, 0xf9, 0x67, 0x0e, 0x2f, 0xda, 0x47, 0x2e, - 0x55, 0xce, 0x4c, 0x35, 0x82, 0xb7, 0x64, 0x43, 0xe0, 0xab, 0xbb, 0x77, 0x8a, 0xec, - 0xa0, 0xf3, 0x9c, 0x55, 0xb6, 0xab, 0xbe, 0xd8, 0x1f, 0xde, 0x89, 0xad, 0x2c, 0x56, - 0x7d, 0xfe, 0x27, 0x7b, 0xb2, 0x69, 0xac, 0x6a, 0xe0, 0xe1, 0x88, 0x39, 0x8d, 0xea, - 0x24, 0xad, 0xcc, 0xe1, 0x82, 0xe7, 0xfd, 0xdc, 0x80, 0xeb, 0xd7, 0x69, 0xd0, 0xf0, - 0x76, 0xf9, 0xaf, 0x2d, 0xd9, 0x83, 0x07, 0xa5, 0x27, 0xc6, 0x99, 0x42, 0xdf, 0xa3, - 0xe7, 0xf4, 0x86, 0x76, 0x10, 0x1a, 0x47, 0xeb, 0x07, 0x80, 0xb6, 0x90, 0xb1, 0xaf, - 0x10, 0xfc, 0xfb, 0x5e, 0xe2, 0xbd, 0x40, 0xd2, 0x7d, 0x10, 0x9b, 0xa1, 0x5a, 0xb0, - 0xb1, 0xe9, 0x55, 0x4f, 0xdd, 0xfa, 0x81, 0x6b, 0x99, 0xcd, 0x8f, 0xdd, 0xe6, 0x81, - 0xae, 0x6b, 0x6c, 0xbb, 0xfb, 0xf0, 0x2c, 0x36, 0x32, 0x68, 0xd0, 0xf3, 0xc6, 0xa7, - 0x26, 0x1b, 0x6d, 0x00, 0x87, 0xbc, 0xad, 0xb6, 0xfb, 0x9b, 0xf3, 0x93, 0x04, 0xfc, - 0x08, 0x41, 0x5d, 0x83, 0x6f, 0xe4, 0x09, 0xa4, 0x3f, 0xaf, 0x9e, 0x28, 0xfb, 0x48, - 0x3f, 0x4a, 0x47, 0xaa, 0xd7, 0xe1, 0xf7, 0x97, 0x30, 0xb3, 0x21, 0x53, 0x60, 0x80, - 0xdb, 0x35, 0x12, 0x48, 0xb2, 0x66, 0x9b, 0x6e, 0x74, 0x48, 0x90, 0x87, 0xae, 0x72, - 0xba, 0x15, 0xd2, 0xae, 0xdd, 0x0c, 0x1e, 0x7e, 0xb1, 0x5a, 0x2f, 0x5a, 0x77, 0x31, - 0xeb, 0x45, 0xa6, 0x17, 0x8a, 0x44, 0x87, 0x09, 0x31, 0xec, 0x8e, 0x34, 0x8c, 0x19, - 0x2b, 0xc8, 0x87, 0xc8, 0x63, 0x60, 0x56, 0x67, 0x6f, 0x58, 0xd0, 0xc6, 0x34, 0xfc, - 0x99, 0xea, 0x7b, 0x07, 0xfa, 0x1b, 0x62, 0x99, 0xae, 0x5d, 0xbf, 0xe0, 0x84, 0x45, - 0xad, 0x99, 0x9f, 0x45, 0xdf, 0x00, 0xf1, 0xa4, 0x7a, 0xa5, 0xef, 0x6f, 0x88, 0xcd, - 0xba, 0x80, 0xc8, 0x8f, 0x94, 0x01, 0xe6, 0xe9, 0x09, 0xca, 0x2c, 0x5d, 0xe2, 0xcf, - 0x8f, 0x6a, 0x98, 0x44, 0xca, 0x32, 0xfe, 0x91, 0xf7, 0x13, 0xfe, 0x10, 0xa0, 0x69, - 0x8a, 0x1b, 0x3b, 0xfd, 0xf4, 0x47, 0x43, 0x75, 0xb4, 0x79, 0x1d, 0xc8, 0x50, 0x50, - 0xc9, 0x28, 0x90, 0x0e, 0x73, 0x1f, 0x7c, 0x4a, 0x12, 0x9d, 0x8e, 0x21, 0xfc, 0xf4, - 0x17, 0x62, 0x7c, 0x47, 0xdd, 0xc9, 0xf5, 0x88, 0x40, 0x38, 0x41, 0x31, 0x7a, 0x9a, - 0xc2, 0x6e, 0xef, 0x6c, 0xda, 0x23, + 0x2d, 0x40, 0x4a, 0x68, 0x81, 0xa6, 0xee, 0x76, 0x0c, 0xb5, 0x3b, 0x9c, 0xc2, 0x71, + 0x5c, 0xa7, 0x6a, 0x3a, 0x2f, 0xc9, 0x69, 0x3b, 0x1a, 0xbb, 0xcd, 0xc7, 0x5c, 0xb6, + 0xd6, 0xc3, 0x6e, 0xcf, 0x84, 0xd6, 0x93, 0x67, 0x2c, 0x53, 0xce, 0xd8, 0x79, 0x8c, + 0xc8, 0xf1, 0xe5, 0x3b, 0x8a, 0x9d, 0xe7, 0xbb, 0xb5, 0xe8, 0xc5, 0xa4, 0x6c, 0x3a, + 0x74, 0x12, 0xdf, 0x11, 0xc5, 0xda, 0x16, 0xb4, 0xdd, 0x22, 0x90, 0x1a, 0x59, 0x2b, + 0x0e, 0x93, 0x29, 0x77, 0xba, 0x06, 0x67, 0x3d, 0x6f, 0xd0, 0x38, 0xac, 0xba, 0xa9, + 0xbf, 0x79, 0xc1, 0x5b, 0xa6, 0x2b, 0x6e, 0x30, 0x74, 0xef, 0x95, 0x3b, 0x81, 0x4c, + 0xf1, 0xbd, 0xf0, 0x15, 0x77, 0xed, 0x3e, 0x3f, 0xae, 0xf4, 0x71, 0x55, 0xc9, 0x1c, + 0x68, 0xee, 0x32, 0x88, 0x1b, 0x73, 0x74, 0x94, 0xb3, 0xb4, 0x76, 0x08, 0x3b, 0x3b, + 0xd1, 0x77, 0x93, 0xc4, 0x98, 0x93, 0x1e, 0xaa, 0x92, 0xb1, 0x7c, 0x7d, 0x10, 0x47, + 0x58, 0xfc, 0x8b, 0x34, 0x93, 0xd2, 0x47, 0x41, 0x7f, 0x5e, 0xc1, 0x97, 0x9a, 0x35, + 0x28, 0x93, 0xe9, 0x95, 0x63, 0xb6, 0xc3, 0xab, 0x95, 0xcc, 0x5a, 0xfa, 0x37, 0x32, + 0xef, 0xae, 0xce, 0x9e, 0x74, 0x32, 0xc8, 0x04, 0x15, 0xe2, 0x5f, 0x55, 0x56, 0x53, + 0xc7, 0xda, 0x5d, 0xb0, 0xcc, 0x61, 0x08, 0x74, 0x21, 0x95, 0x9b, 0xb1, 0xdf, 0x80, + 0x03, 0xb7, 0x3d, 0xa0, 0xbe, 0xf0, 0x60, 0xf3, 0xa8, 0x4c, 0x8b, 0xc2, 0x4c, 0xc7, + 0x6d, 0x0d, 0x9e, 0x9c, 0x33, 0x76, 0x5c, 0x20, 0xf0, 0x7d, 0x80, 0xe2, 0x0f, 0xdf, + 0x27, 0x81, 0x5d, 0xbd, 0x9d, 0x71, 0x7c, 0x09, 0x66, 0xf8, 0x0b, 0x94, 0xb9, 0x59, + 0x15, 0x08, 0x1e, 0xa4, 0x55, 0x37, 0xa5, 0xa0, 0x74, 0xb9, 0xc9, 0x4b, 0x43, 0xdd, + 0xf4, 0xa9, 0xcb, 0xad, 0xe9, 0x04, 0x51, 0x0e, 0xaa, 0x96, 0x9e, 0x66, 0x6c, 0x94, + 0x34, 0xb9, 0xf6, 0x3e, 0xae, 0x62, 0xad, 0x58, 0x27, 0x99, 0x62, 0xe9, 0x41, 0x33, + 0x05, 0x5c, 0xbc, 0xc4, 0xb1, 0x55, 0xc0, 0x0f, 0x1b, 0x83, 0xff, 0x41, 0x28, 0xa8, + 0xab, 0xb4, 0xce, 0x68, 0xe9, 0xf1, 0xe3, 0x08, 0xe6, 0xf9, 0x7e, 0x51, 0x3a, 0xf5, + 0x95, 0x47, 0x1a, 0x16, 0x77, 0xef, 0x78, 0xe9, 0x77, 0x0f, 0x43, 0xad, 0xde, 0x1a, + 0x64, 0x58, 0x6d, 0xe6, 0xa5, 0x87, 0xc3, 0xd6, 0x93, 0xfe, 0xa8, 0xfc, 0xc6, 0xac, + 0xc8, 0x94, 0x96, 0x1e, 0x2f, 0x47, 0xb2, 0x02, 0xe8, 0x6a, 0x57, 0x38, 0x79, 0xb5, + 0xbf, 0xd7, 0x29, 0xda, 0x2f, 0xbe, 0xfc, 0x64, 0x5c, 0xfa, 0xb1, 0x88, 0x0d, 0x51, + 0x76, 0x40, 0xdf, 0x5f, 0x53, 0xe5, 0x7c, 0x72, 0xd6, 0x5a, 0x63, 0x3a, 0xa5, 0x36, + 0xb2, 0x98, 0x34, 0xbf, 0x28, 0x16, 0xb1, 0xf7, 0x16, 0xbf, 0x43, 0x6d, 0x6b, 0x2b, + 0x6e, 0x47, 0x73, 0x28, 0xc9, 0x58, 0xa6, 0xb8, 0xcf, 0x73, 0xb9, 0x5d, 0x22, 0xf6, + 0x99, 0x3b, 0x3f, 0xc5, 0x25, 0xdb, 0x62, 0x7f, 0x6f, 0x38, 0xd0, 0x77, 0x9a, 0x1d, + 0x39, 0xaf, 0x05, 0xed, 0x74, 0xfd, 0xfe, 0xff, 0x98, 0x7a, 0x95, 0x88, 0xd8, 0x0b, + 0x7e, 0x79, 0x69, 0x4a, 0xe4, 0x55, 0x29, 0x29, 0x88, 0x1c, 0x5b, 0xfe, 0x20, 0x49, + 0x2f, 0xd6, 0xf3, 0x37, 0xca, 0x88, 0xdf, 0xb5, 0x01, 0xe5, 0x45, 0xd2, 0x36, 0x73, + 0xac, 0xac, 0xbc, 0x3d, 0x33, 0x14, 0xa8, 0xbb, 0xf5, 0xec, 0x70, 0xb7, 0x05, 0xcc, + 0x9d, 0x26, 0x57, 0xbd, 0xd5, 0xa7, 0x09, 0x15, 0xbe, 0xf6, 0xd0, 0xf0, 0x39, 0xd3, + 0xeb, 0xa6, 0xbb, 0x71, 0x5b, 0xe5, 0x1e, 0xbf, 0x6e, 0xf6, 0x59, 0xea, 0x32, 0xff, + 0x80, 0xc8, 0x2c, 0x04, 0x21, 0x67, 0x5f, 0xe3, 0x71, 0xef, 0x49, 0xf1, 0xb9, 0xe3, + 0x8f, 0x43, 0x7b, 0x4a, 0x76, 0x55, 0xdc, 0x29, 0x16, 0xaa, 0x30, 0x86, 0xde, 0x6c, + 0x62, 0xa8, 0x2b, 0x36, 0x1c, 0x05, 0x3f, 0xc6, 0x34, 0x54, 0xcc, 0xd0, 0x2c, 0x22, + 0xd4, 0x1f, 0xf5, 0xbb, 0x83, 0x62, 0xde, 0xaa, 0x70, 0x82, 0x5a, 0xd2, 0xf9, 0x93, + 0x63, 0x9f, 0xc4, 0x46, 0x06, 0x9d, 0x78, 0xa6, 0x1d, 0x33, 0x8d, 0xf5, 0x8f, 0x77, + 0x63, 0xe3, 0x55, 0xe6, 0xa9, 0xff, ], ock: [ - 0x9c, 0x10, 0x3d, 0xd5, 0xd6, 0x38, 0x6c, 0xdd, 0x67, 0x69, 0x51, 0xe6, 0x56, 0x4b, - 0x16, 0x6b, 0xc5, 0xc5, 0x72, 0x32, 0xcf, 0xc3, 0x1e, 0x0e, 0x69, 0xce, 0x84, 0xda, - 0xe8, 0x32, 0x76, 0xbe, + 0x8b, 0x0d, 0x29, 0x8e, 0xe8, 0xb4, 0x25, 0x34, 0xa4, 0x2f, 0xb9, 0x63, 0x5b, 0xa7, + 0x58, 0xea, 0x9f, 0x91, 0x8b, 0x83, 0x16, 0xc0, 0xe8, 0x94, 0xa9, 0x08, 0x48, 0x89, + 0x01, 0xd9, 0xfb, 0xa3, ], op: [ 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, - 0x17, 0x5b, 0xa9, 0x8b, 0x01, 0xa3, 0x66, 0x1e, 0xa9, 0xaa, 0xb8, 0xf4, 0x32, 0x53, - 0x42, 0x0e, 0xff, 0xd7, 0xa4, 0x83, 0xc2, 0x79, 0xd4, 0x18, 0x18, 0xbc, 0xb3, 0xee, - 0x91, 0x90, 0x01, 0xf8, 0x66, 0xa8, 0xe9, 0x2c, + 0x17, 0x5b, 0xa9, 0x8b, 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, + 0x14, 0x49, 0x72, 0x62, 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, + 0xe2, 0x63, 0xf3, 0xe3, 0x99, 0x07, 0xea, 0x0c, ], c_out: [ - 0xdf, 0x6b, 0xb6, 0x2e, 0x3b, 0x64, 0xf7, 0xe9, 0x37, 0xc1, 0xde, 0x38, 0xaa, 0xc5, - 0xe6, 0xb1, 0x61, 0x35, 0xba, 0x2f, 0x9d, 0xbe, 0xed, 0xb0, 0x7a, 0x45, 0xb6, 0xf0, - 0x9d, 0xf3, 0xeb, 0xec, 0xac, 0x04, 0x6c, 0x61, 0x92, 0xfb, 0xe8, 0x95, 0xd2, 0x31, - 0x02, 0x77, 0xb3, 0xe0, 0x3a, 0x90, 0xfd, 0xc8, 0x53, 0x48, 0x4a, 0x01, 0x5c, 0x88, - 0xd6, 0x63, 0x2e, 0x97, 0xba, 0x98, 0xad, 0xca, 0x9e, 0x49, 0xf5, 0x38, 0xc3, 0xa7, - 0xcb, 0x6d, 0x77, 0x23, 0xbd, 0xcc, 0x9c, 0x03, 0xae, 0x88, - ], + 0xf3, 0xbf, 0x90, 0x76, 0xf3, 0xdb, 0x66, 0x32, 0x6d, 0xa6, 0x0c, 0xc7, 0x94, 0x3c, + 0x85, 0x4d, 0x8d, 0xe9, 0x9f, 0x57, 0x53, 0xf7, 0x0c, 0x32, 0xed, 0x01, 0xfb, 0x2e, + 0x84, 0x9c, 0x9d, 0xc7, 0x3f, 0x80, 0xb5, 0xcb, 0xaa, 0xb4, 0x99, 0x2d, 0xd7, 0xe7, + 0x38, 0xb9, 0x61, 0xfd, 0x75, 0x3f, 0x7c, 0x5b, 0x29, 0x24, 0xd1, 0xd9, 0x63, 0x06, + 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, + 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1769,34 +1777,34 @@ pub(crate) fn test_vectors() -> Vec { 0x87, 0xe5, 0x05, 0xad, ], rho: [ - 0x32, 0x91, 0x87, 0x35, 0x66, 0x3f, 0x34, 0xad, 0xa0, 0x22, 0x8a, 0xea, 0x4a, 0xcc, - 0x19, 0x2a, 0x12, 0x3f, 0xcf, 0xa0, 0x60, 0x46, 0x89, 0xf9, 0x1a, 0xcb, 0xe9, 0x38, - 0x31, 0xe4, 0x8c, 0x0c, + 0xc2, 0x79, 0xfa, 0x9d, 0x1c, 0x84, 0x11, 0x93, 0xd3, 0x32, 0xf8, 0xcc, 0xf4, 0xd0, + 0xb1, 0xe4, 0x56, 0x01, 0xa8, 0xaf, 0x66, 0x76, 0xd7, 0x62, 0xfb, 0xa7, 0x31, 0x33, + 0x45, 0x89, 0x35, 0x14, ], cmx: [ - 0xde, 0x7b, 0xf1, 0x55, 0x08, 0x29, 0x51, 0x96, 0x0a, 0x10, 0xbb, 0x8b, 0x75, 0x41, - 0x02, 0x43, 0x0f, 0x89, 0xf5, 0x32, 0x67, 0x24, 0x04, 0x36, 0x81, 0xf5, 0x06, 0xf7, - 0x48, 0xe2, 0x6f, 0x07, + 0x6d, 0x29, 0x97, 0xd1, 0xce, 0x0a, 0x94, 0x9a, 0x63, 0x70, 0x0f, 0x46, 0x1b, 0x57, + 0x12, 0xae, 0xeb, 0x43, 0xd4, 0x55, 0x04, 0xe3, 0x5b, 0xda, 0x16, 0x52, 0x97, 0x77, + 0xc7, 0x4d, 0x19, 0x1b, ], esk: [ - 0x1d, 0xb6, 0x79, 0x07, 0x9a, 0xcd, 0xef, 0xe9, 0xfc, 0x1e, 0x59, 0xa1, 0x33, 0xf3, - 0x7b, 0x6d, 0x1f, 0xfb, 0xed, 0x78, 0x8c, 0xce, 0x3b, 0x0c, 0xdd, 0x63, 0xe0, 0x62, - 0x83, 0x05, 0x47, 0x08, + 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, 0x6b, 0xa0, 0x02, 0x0c, + 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, 0x57, 0x32, 0x63, 0xf4, + 0x99, 0xbd, 0x4c, 0x13, ], ephemeral_key: [ - 0x18, 0x20, 0x84, 0x5b, 0x2d, 0x90, 0xe5, 0x45, 0x76, 0x0f, 0xca, 0x4d, 0xab, 0x30, - 0xa6, 0x78, 0x3e, 0x03, 0x1c, 0x0e, 0x54, 0x28, 0xcc, 0x22, 0x6f, 0x3f, 0x40, 0x1d, - 0xec, 0x20, 0x0b, 0x11, + 0xe4, 0x76, 0x95, 0x86, 0x30, 0x4a, 0x6a, 0x9b, 0x3a, 0x2a, 0xef, 0x3a, 0xf5, 0x8b, + 0x97, 0xda, 0xc2, 0xcc, 0x4a, 0xeb, 0x38, 0x9f, 0x68, 0xc1, 0x28, 0x87, 0x73, 0x1e, + 0x0e, 0x12, 0xbc, 0x1e, ], shared_secret: [ - 0x79, 0x38, 0x77, 0xa1, 0xae, 0xda, 0xe9, 0xac, 0x6d, 0xa3, 0xd7, 0xe8, 0x02, 0xb5, - 0xbc, 0x77, 0x3c, 0x0d, 0x93, 0x1c, 0x79, 0x6d, 0x17, 0x0c, 0x59, 0x7f, 0x22, 0xba, - 0x6f, 0xcc, 0xa2, 0x06, + 0xf6, 0xba, 0x4b, 0x1f, 0xbe, 0x01, 0xfa, 0x2f, 0x1d, 0xd4, 0x09, 0x3c, 0x5c, 0xc4, + 0x85, 0xa9, 0xbf, 0xd9, 0xef, 0x0f, 0x57, 0x89, 0x49, 0xd6, 0xe1, 0x00, 0xb0, 0x05, + 0x5c, 0xb8, 0xf3, 0x31, ], k_enc: [ - 0x28, 0x20, 0xb9, 0x38, 0xd6, 0xfc, 0xea, 0x99, 0xa7, 0x23, 0x37, 0x50, 0xa0, 0xf0, - 0x9a, 0x32, 0x10, 0xad, 0x91, 0x73, 0x46, 0x16, 0x6a, 0xea, 0xdc, 0x89, 0xbb, 0x50, - 0xf4, 0x54, 0x50, 0xa3, + 0xd3, 0xc2, 0x20, 0x51, 0x00, 0x3e, 0x88, 0x2a, 0x5d, 0xdd, 0xfb, 0x48, 0x23, 0xd6, + 0x77, 0x26, 0x96, 0xa7, 0xe9, 0x9f, 0x26, 0xb1, 0xa6, 0xac, 0xd2, 0x4b, 0xee, 0xd5, + 0xf2, 0x2f, 0x9f, 0xf8, ], p_enc: [ 0x02, 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, 0x22, 0x92, @@ -1842,69 +1850,70 @@ pub(crate) fn test_vectors() -> Vec { 0x3e, 0xcc, 0xc6, 0x23, ], c_enc: [ - 0xd9, 0x6a, 0xe8, 0x2f, 0xba, 0xff, 0xb9, 0xe4, 0xbd, 0x36, 0x47, 0x57, 0x96, 0x33, - 0xbc, 0x8a, 0x89, 0x66, 0xae, 0x4e, 0x18, 0x85, 0x99, 0xdc, 0x3c, 0xf0, 0x30, 0x41, - 0xd2, 0x64, 0x4f, 0x60, 0x3c, 0xe5, 0x56, 0x2e, 0x7f, 0xa1, 0xd3, 0x83, 0x12, 0x79, - 0xb6, 0x32, 0x60, 0x4d, 0x06, 0x5e, 0xd2, 0x46, 0xad, 0x2d, 0x4f, 0x73, 0xf3, 0xa4, - 0x1b, 0x2a, 0x27, 0x99, 0xe5, 0xba, 0xf8, 0x6e, 0x7d, 0x9f, 0xcc, 0x64, 0xd5, 0x6b, - 0xde, 0x56, 0xcb, 0xb0, 0x01, 0xeb, 0x7c, 0x7c, 0x0c, 0xf1, 0xe2, 0xae, 0xc3, 0xce, - 0xb1, 0x49, 0x2d, 0xdf, 0x4e, 0x35, 0x20, 0x76, 0x1f, 0x70, 0xf6, 0xa9, 0x5c, 0x9e, - 0xde, 0xed, 0x51, 0x43, 0x6d, 0xca, 0xcf, 0x71, 0x1e, 0xb5, 0x53, 0x24, 0xd3, 0xf0, - 0x1d, 0xcc, 0xa0, 0x1b, 0xca, 0x15, 0xba, 0xf2, 0x8f, 0xed, 0x81, 0x4c, 0xc3, 0x3a, - 0x43, 0x6b, 0xbc, 0x08, 0x60, 0x56, 0x78, 0x55, 0xa4, 0x9f, 0x5e, 0xfd, 0x49, 0xea, - 0x78, 0x30, 0xc2, 0xf6, 0x00, 0x61, 0xd8, 0x13, 0xa8, 0x49, 0xb4, 0x40, 0xb1, 0x2e, - 0x8f, 0x31, 0xe2, 0xdc, 0x0c, 0x39, 0x4c, 0xeb, 0x92, 0x4f, 0x0d, 0xc6, 0xd5, 0x7b, - 0xcc, 0x39, 0x1d, 0x4a, 0x5f, 0x56, 0x9f, 0x34, 0x74, 0x6b, 0x9d, 0x92, 0x08, 0x82, - 0x25, 0xb1, 0xaa, 0x3e, 0x90, 0x6f, 0x6d, 0xe4, 0xa7, 0x92, 0x2a, 0xc1, 0x16, 0xac, - 0xb2, 0x78, 0xe8, 0xef, 0xbb, 0xf6, 0xf1, 0xe3, 0xe0, 0x8d, 0x66, 0xb3, 0x4d, 0x6e, - 0xde, 0x34, 0xae, 0x78, 0x40, 0xa8, 0x80, 0x2b, 0x7c, 0x10, 0x0f, 0xa7, 0x98, 0x46, - 0x4d, 0xb5, 0x29, 0x45, 0xdb, 0xbe, 0x35, 0xe7, 0x7a, 0x77, 0x21, 0xb2, 0xe0, 0xf8, - 0xb9, 0xa1, 0x0f, 0x6b, 0xf9, 0xa2, 0x80, 0x8f, 0xa5, 0x85, 0xff, 0x21, 0xb0, 0xa3, - 0xaf, 0xfd, 0x5f, 0x3c, 0xb2, 0x30, 0x63, 0x4e, 0x2e, 0x43, 0xff, 0xde, 0x6d, 0x09, - 0x0a, 0xfc, 0xc6, 0x70, 0x4d, 0x7b, 0x3f, 0xc6, 0x15, 0x44, 0x85, 0x3b, 0xcd, 0xa7, - 0xa1, 0x06, 0xd8, 0x5b, 0xd8, 0xd8, 0x6c, 0x6f, 0x8c, 0xe0, 0x34, 0x01, 0x6e, 0xd9, - 0xa3, 0x69, 0x46, 0xf8, 0x52, 0x8b, 0x6f, 0x1e, 0x1a, 0x19, 0x82, 0xd6, 0x8d, 0x38, - 0x86, 0xe5, 0xea, 0xe6, 0xc1, 0xe3, 0x88, 0xf3, 0xde, 0xad, 0x0d, 0x35, 0x3b, 0x6c, - 0x0c, 0xbf, 0x57, 0xc2, 0xe4, 0x7d, 0x30, 0x72, 0x3e, 0xac, 0x95, 0x7b, 0x4a, 0xec, - 0x82, 0xc8, 0xa1, 0x00, 0x9e, 0x3d, 0x71, 0x96, 0x92, 0xb2, 0xfc, 0xbd, 0xda, 0xae, - 0x62, 0x5a, 0x89, 0x6a, 0x47, 0x29, 0x85, 0xb7, 0x9e, 0xb6, 0x2b, 0x1f, 0xe3, 0x3d, - 0x6e, 0x27, 0xbc, 0x1f, 0x10, 0xe4, 0xfe, 0x5c, 0x06, 0xb2, 0x4c, 0x59, 0x7f, 0x72, - 0x3c, 0x67, 0x13, 0x36, 0x13, 0xae, 0x8e, 0x15, 0x4d, 0x81, 0x69, 0x78, 0xb8, 0xfc, - 0xa6, 0x50, 0xc0, 0x1d, 0x77, 0x1a, 0x62, 0x69, 0x2a, 0x84, 0x82, 0x94, 0x2e, 0x28, - 0xfe, 0xf0, 0x45, 0x19, 0x9e, 0xd1, 0xa6, 0x64, 0x99, 0xeb, 0xa1, 0xee, 0xc1, 0x9a, - 0xc8, 0x4a, 0x12, 0xe4, 0x10, 0x29, 0xd2, 0x2f, 0x21, 0x87, 0x6e, 0xd7, 0x4a, 0x76, - 0xef, 0x39, 0xa0, 0x57, 0xce, 0x0a, 0x15, 0x8e, 0x68, 0x51, 0xec, 0x35, 0x6d, 0x97, - 0x7b, 0x1a, 0xa6, 0x8d, 0xcf, 0x70, 0x88, 0xa9, 0xf0, 0xf9, 0xe4, 0x75, 0xa2, 0xbb, - 0xc1, 0xc4, 0x49, 0x5b, 0x54, 0x6f, 0xff, 0xed, 0xaa, 0x66, 0xc4, 0xf9, 0x51, 0x74, - 0xc6, 0x2f, 0x56, 0x5a, 0x3c, 0xc0, 0xac, 0xaf, 0x85, 0x4a, 0xde, 0xd4, 0xb4, 0x25, - 0xa0, 0xc7, 0xdb, 0xcd, 0x37, 0x42, 0xa7, 0xe0, 0x59, 0x2e, 0x83, 0x73, 0x41, 0xf8, - 0x95, 0x32, 0x90, 0x99, 0xe1, 0x70, 0xb6, 0xff, 0xb1, 0x05, 0xfd, 0xbc, 0x77, 0x29, - 0x8e, 0x8c, 0x0f, 0x5e, 0xeb, 0x9e, 0x99, 0xc6, 0x58, 0x4b, 0xcf, 0xf1, 0x20, 0x20, - 0x9d, 0x69, 0x22, 0xb5, 0x34, 0xbe, 0xc9, 0xfa, 0xc1, 0xd7, 0xd2, 0x74, 0xdb, 0xcb, - 0x4a, 0x12, 0xea, 0x5a, 0x99, 0x21, 0x39, 0x2f, 0x00, 0x96, 0x60, 0x29, 0xff, 0x26, - 0x0e, 0xd2, 0x4c, 0x32, 0x78, 0x58, 0xe0, 0x34, 0x64, 0x0a, 0x8c, 0xfb, 0x28, 0xad, - 0x97, 0xe5, 0x3d, 0x80, 0xe1, 0xc9, + 0x72, 0x29, 0xa0, 0xa5, 0x6a, 0x14, 0x4b, 0x04, 0x2c, 0x1e, 0xad, 0x91, 0x80, 0xac, + 0x54, 0xda, 0xc6, 0xc5, 0x5c, 0xf4, 0xc2, 0x2f, 0xbe, 0x7c, 0xde, 0x99, 0x96, 0x0b, + 0xc6, 0x20, 0xd4, 0xdd, 0x60, 0xe4, 0xbf, 0x18, 0xa0, 0xea, 0x7a, 0xd9, 0x09, 0x3b, + 0xcd, 0x3f, 0xf6, 0xd1, 0x61, 0x1c, 0x56, 0x5f, 0x88, 0xe7, 0x35, 0xef, 0x4c, 0x51, + 0x8c, 0x77, 0xd6, 0x22, 0x28, 0xe1, 0xe4, 0xa1, 0x35, 0xca, 0x6c, 0xb4, 0xed, 0x5a, + 0xbb, 0xdf, 0x3e, 0x81, 0xd0, 0x96, 0x50, 0xa8, 0xfa, 0x9b, 0x5c, 0x3d, 0x05, 0xb6, + 0xda, 0xcf, 0x3c, 0x3d, 0xb3, 0xb3, 0x63, 0xe4, 0x10, 0x57, 0x23, 0x70, 0x0c, 0x69, + 0x13, 0x9f, 0x81, 0xec, 0xc4, 0x8d, 0x88, 0x3d, 0xa0, 0x39, 0xdd, 0xed, 0x5e, 0xf6, + 0x04, 0x0a, 0xb2, 0x12, 0x0e, 0x53, 0x3b, 0x1f, 0xfd, 0x06, 0x74, 0xdb, 0x5b, 0x92, + 0x6e, 0x58, 0x7f, 0x16, 0xe7, 0xe8, 0x96, 0x2b, 0x12, 0x48, 0x35, 0xbd, 0x56, 0xcf, + 0xd8, 0xe7, 0x5b, 0xf6, 0xaa, 0x4d, 0xcd, 0x4d, 0x6f, 0x0b, 0x55, 0x61, 0x71, 0x9c, + 0x80, 0xaa, 0x82, 0xb3, 0xbc, 0xea, 0x16, 0x7a, 0x31, 0xc6, 0x69, 0x87, 0x61, 0xe2, + 0xd2, 0x6c, 0xb5, 0x6d, 0xd3, 0x04, 0x16, 0x72, 0x1c, 0x93, 0x37, 0x32, 0x92, 0x85, + 0x33, 0x58, 0xfa, 0xfe, 0x74, 0x95, 0x55, 0x8d, 0xb9, 0x9e, 0x47, 0xa3, 0xa1, 0x6e, + 0xd2, 0x2c, 0xdb, 0x9d, 0x7d, 0x16, 0xcf, 0xd9, 0xa7, 0xbb, 0x55, 0x9c, 0x72, 0x86, + 0xed, 0x84, 0xf8, 0x89, 0x9c, 0xb0, 0x52, 0x2e, 0x8a, 0x49, 0x7f, 0x3e, 0x14, 0x45, + 0x2b, 0xa8, 0xa9, 0x4a, 0x7f, 0x58, 0xe5, 0xde, 0x37, 0x1d, 0x76, 0xec, 0xc9, 0xef, + 0xe2, 0x0a, 0xe7, 0x9b, 0xee, 0x12, 0xbc, 0xe4, 0xe4, 0xb6, 0xf2, 0x35, 0x35, 0xe5, + 0xc3, 0xc4, 0x3a, 0x4c, 0xa2, 0x07, 0x6f, 0xd6, 0x73, 0xf0, 0x80, 0x6f, 0xa9, 0x85, + 0xc5, 0x88, 0xd1, 0x14, 0xc0, 0x7d, 0x8c, 0xe3, 0xa2, 0x33, 0xe5, 0x4d, 0x77, 0x11, + 0x6c, 0x8a, 0x2a, 0x56, 0xa6, 0x82, 0xe7, 0xa4, 0x85, 0xdf, 0x71, 0xb3, 0x02, 0xa0, + 0x36, 0xdd, 0xab, 0x21, 0x4d, 0xee, 0x77, 0x62, 0x19, 0xcc, 0x24, 0x25, 0x94, 0xf7, + 0x5b, 0x8e, 0xbd, 0x56, 0x6d, 0x74, 0xb1, 0x6c, 0x9e, 0xc0, 0x05, 0x8b, 0xca, 0x28, + 0x81, 0xb7, 0x9b, 0x10, 0xe8, 0xa8, 0x01, 0x08, 0x20, 0x61, 0x8a, 0xc6, 0x52, 0x6c, + 0xf9, 0x4b, 0x13, 0xd9, 0x75, 0x9f, 0x37, 0x33, 0x93, 0x34, 0xe8, 0xb2, 0xc6, 0xbd, + 0xd1, 0xd0, 0xf5, 0xe2, 0x46, 0x3c, 0xff, 0x2b, 0x8d, 0xa6, 0xd2, 0xc6, 0x86, 0xaa, + 0x98, 0x7c, 0xd1, 0xf0, 0x7e, 0x9a, 0xa2, 0x60, 0xdd, 0x04, 0x28, 0xa4, 0xff, 0x78, + 0xaa, 0x8f, 0xda, 0x47, 0x7a, 0xb3, 0x8a, 0xcf, 0xcc, 0xb1, 0x90, 0x91, 0x77, 0xb5, + 0x27, 0xe9, 0x38, 0xf1, 0xf9, 0xdc, 0xf3, 0x1f, 0x4f, 0x40, 0xa9, 0x62, 0x89, 0x51, + 0xfc, 0x2a, 0x7a, 0xbc, 0x04, 0x1e, 0x8c, 0x93, 0x36, 0x08, 0xbb, 0x47, 0xb4, 0x50, + 0xb2, 0x8f, 0xee, 0xe0, 0x41, 0x58, 0xa8, 0x17, 0x4b, 0xff, 0xe4, 0x97, 0x06, 0x02, + 0x48, 0x86, 0x42, 0xc1, 0x9e, 0x61, 0xd4, 0x73, 0xf3, 0xde, 0x0c, 0xb0, 0xb6, 0x4a, + 0x30, 0xd6, 0xf1, 0x46, 0x68, 0xd1, 0xb0, 0x17, 0x77, 0x56, 0x6f, 0xb5, 0xac, 0xc2, + 0xe9, 0x2e, 0x64, 0xd9, 0x75, 0x7f, 0xba, 0x13, 0xc1, 0xee, 0x9c, 0xd0, 0x3a, 0xbe, + 0x98, 0xbd, 0x7e, 0x8a, 0xd7, 0x04, 0x1c, 0x3f, 0xea, 0xe7, 0xc1, 0xa7, 0x24, 0x3a, + 0xe3, 0x61, 0x0a, 0xac, 0x64, 0xfe, 0xc6, 0xc9, 0xfc, 0x94, 0x3d, 0x6a, 0xbc, 0xe9, + 0x10, 0xad, 0xbe, 0x23, 0xb5, 0x46, 0xb4, 0xc2, 0x4a, 0xa9, 0xf2, 0xce, 0x5d, 0x97, + 0x06, 0x2e, 0xe0, 0xd1, 0xcc, 0xc4, 0x8c, 0xfd, 0x1f, 0xdb, 0xa7, 0xfd, 0xac, 0x0b, + 0x04, 0xd1, 0xb3, 0xdc, 0x7a, 0x70, 0x78, 0x1c, 0xdd, 0xa2, 0xa2, 0x70, 0x3d, 0xe0, + 0x03, 0xcd, 0x01, 0x51, 0xec, 0x65, 0xbf, 0x7d, 0x1a, 0xc6, 0x3b, 0xb7, 0x35, 0xbc, + 0x2b, 0xb6, 0x7a, 0xd2, 0xb0, 0x1e, 0xd6, 0xb9, 0xae, 0x2e, 0xbb, 0xd3, 0x7a, 0x8f, + 0x8e, 0xc1, 0xa6, 0x53, 0xa8, 0x7e, ], ock: [ - 0x28, 0xcf, 0x3b, 0xea, 0xc3, 0xbd, 0xe2, 0xe9, 0x63, 0xaa, 0x60, 0x91, 0x3f, 0x10, - 0x5d, 0x25, 0x67, 0xcd, 0xaf, 0xbb, 0x66, 0x09, 0x08, 0x5a, 0x84, 0x3f, 0x75, 0x68, - 0xe4, 0x92, 0xd4, 0x4e, + 0x1b, 0xa4, 0xac, 0xd7, 0x75, 0x10, 0xc4, 0xf0, 0xc7, 0x66, 0xad, 0xf7, 0xc7, 0xdf, + 0x1d, 0x1c, 0x54, 0xd5, 0xbc, 0xe3, 0xd6, 0x0a, 0xf3, 0x5e, 0x8d, 0xd4, 0x8f, 0xdd, + 0x04, 0xa7, 0x8c, 0x0b, ], op: [ 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, - 0x01, 0x70, 0x89, 0x1a, 0x1d, 0xb6, 0x79, 0x07, 0x9a, 0xcd, 0xef, 0xe9, 0xfc, 0x1e, - 0x59, 0xa1, 0x33, 0xf3, 0x7b, 0x6d, 0x1f, 0xfb, 0xed, 0x78, 0x8c, 0xce, 0x3b, 0x0c, - 0xdd, 0x63, 0xe0, 0x62, 0x83, 0x05, 0x47, 0x08, + 0x01, 0x70, 0x89, 0x1a, 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, + 0x6b, 0xa0, 0x02, 0x0c, 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, + 0x57, 0x32, 0x63, 0xf4, 0x99, 0xbd, 0x4c, 0x13, ], c_out: [ - 0x0b, 0x2c, 0xc0, 0xa2, 0x2d, 0x06, 0xfc, 0x36, 0xa0, 0x8a, 0x7d, 0x82, 0x33, 0x8d, - 0x4a, 0xd0, 0x95, 0xa3, 0x93, 0xa1, 0xc2, 0x4a, 0x78, 0x8d, 0x45, 0x24, 0x35, 0x94, - 0x4a, 0xcc, 0xe6, 0x38, 0x1e, 0xcc, 0x69, 0x37, 0xf2, 0xc3, 0x8c, 0x89, 0xa5, 0xf5, - 0x1a, 0xa6, 0x0c, 0xa6, 0x58, 0xfe, 0x71, 0x37, 0x1c, 0x2a, 0x83, 0xf4, 0x96, 0xca, - 0x2e, 0x62, 0x49, 0x79, 0x2e, 0x09, 0xeb, 0x79, 0xea, 0x3a, 0x13, 0x80, 0x32, 0x18, - 0xff, 0x20, 0x88, 0x9d, 0x8c, 0x59, 0xc8, 0x5e, 0x90, 0x99, - ], + 0x43, 0x0d, 0xaa, 0x6b, 0x75, 0x63, 0x22, 0x80, 0xd5, 0xe6, 0xda, 0xcb, 0xd2, 0xa0, + 0xff, 0xe2, 0xaf, 0x98, 0x60, 0xc8, 0x3a, 0x3d, 0x2a, 0x87, 0xf1, 0x79, 0x62, 0x88, + 0xeb, 0xed, 0x64, 0xd0, 0xcd, 0xc4, 0x60, 0xe2, 0xc8, 0x61, 0xc4, 0xf9, 0x38, 0x7d, + 0x92, 0x59, 0xfc, 0x60, 0x01, 0xac, 0xd0, 0xe7, 0x6f, 0x3b, 0x0f, 0xdb, 0x5d, 0xac, + 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, + 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1978,34 +1987,34 @@ pub(crate) fn test_vectors() -> Vec { 0x71, 0x55, 0x00, 0xb5, ], rho: [ - 0x3b, 0x37, 0x96, 0x78, 0x0c, 0x0a, 0xec, 0x14, 0xed, 0x28, 0x74, 0xb5, 0x23, 0x06, - 0xe1, 0xc3, 0xd5, 0xde, 0x45, 0x93, 0xc6, 0x69, 0xaf, 0x1c, 0xaf, 0x11, 0xbc, 0xb4, - 0xd3, 0x5c, 0x60, 0x12, + 0xea, 0x38, 0x44, 0x75, 0x9a, 0x9a, 0x1c, 0xc5, 0x28, 0xb2, 0x95, 0xce, 0x70, 0x13, + 0x7a, 0x85, 0xf9, 0xf0, 0x8e, 0x41, 0xa5, 0xc7, 0xc1, 0xca, 0xc1, 0x55, 0xa6, 0x69, + 0xa3, 0x18, 0x53, 0x3e, ], cmx: [ - 0x4d, 0xa9, 0xdf, 0xdc, 0x70, 0x8c, 0xe8, 0xa0, 0x77, 0xa0, 0x6e, 0xc0, 0x67, 0x79, - 0x24, 0xcf, 0x37, 0x70, 0xed, 0xc2, 0x07, 0xfd, 0x5e, 0x7d, 0x69, 0x5f, 0x71, 0xb0, - 0x15, 0xbb, 0x03, 0x05, + 0x6a, 0xba, 0x28, 0x10, 0x5b, 0xc0, 0x72, 0xc5, 0x2a, 0xb8, 0xa3, 0x14, 0x79, 0x7f, + 0xf8, 0x66, 0x66, 0xdf, 0xb7, 0xcd, 0x8a, 0x2a, 0xe1, 0x7c, 0x58, 0x5f, 0xb7, 0xb6, + 0x51, 0x5b, 0x97, 0x1c, ], esk: [ - 0xae, 0xec, 0x0d, 0xb9, 0x0e, 0x55, 0x83, 0x3c, 0x8b, 0xaf, 0x52, 0x6d, 0x66, 0x54, - 0xa1, 0x74, 0x5b, 0xa4, 0x4c, 0xad, 0x3c, 0xf9, 0xa6, 0x2c, 0xfb, 0xee, 0x5d, 0xe3, - 0x99, 0xca, 0x31, 0x26, + 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, 0xd5, 0x64, 0x6b, 0xc4, + 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, 0x15, 0x5b, 0xef, 0x4d, + 0x46, 0x1e, 0xec, 0x29, ], ephemeral_key: [ - 0x2d, 0xa0, 0x59, 0x4c, 0xd8, 0x74, 0x91, 0x46, 0x52, 0x67, 0xe7, 0x2c, 0x61, 0x89, - 0x07, 0x91, 0xfe, 0xb4, 0x25, 0xa2, 0xbb, 0xcd, 0xda, 0xcf, 0xe4, 0x5a, 0x66, 0x62, - 0x2f, 0x49, 0xef, 0x35, + 0x95, 0x9b, 0xea, 0x8e, 0x11, 0x96, 0x8b, 0x0f, 0x34, 0x3c, 0x04, 0xcd, 0x6d, 0x50, + 0x16, 0xfc, 0xd4, 0x33, 0x90, 0x75, 0x36, 0xa2, 0x46, 0xba, 0x1c, 0x5d, 0x3e, 0x88, + 0x97, 0xf3, 0x23, 0x1c, ], shared_secret: [ - 0xe0, 0xb1, 0x52, 0x67, 0xfd, 0x21, 0x08, 0xeb, 0xbd, 0xd4, 0x16, 0x3f, 0x83, 0xad, - 0xef, 0xb6, 0x1c, 0x3e, 0xdf, 0x56, 0x6d, 0x94, 0x6f, 0xa1, 0xc1, 0x5e, 0x96, 0x46, - 0x43, 0xb1, 0x9c, 0x8e, + 0xe2, 0x69, 0x19, 0xb4, 0x0c, 0x70, 0xaf, 0x74, 0x1d, 0xf9, 0x04, 0x51, 0x72, 0x55, + 0x03, 0x58, 0x89, 0xee, 0x5a, 0x44, 0x42, 0x6d, 0x6a, 0xb8, 0x5c, 0x07, 0x4b, 0x86, + 0x2b, 0xa0, 0x63, 0x08, ], k_enc: [ - 0x28, 0x48, 0xae, 0x53, 0xaa, 0xce, 0xbe, 0x7c, 0xab, 0x58, 0x73, 0x1d, 0xc2, 0x21, - 0x88, 0x1b, 0x60, 0x2c, 0xc5, 0xa5, 0x3b, 0xcc, 0x1f, 0x76, 0xc8, 0x20, 0xb0, 0xea, - 0x13, 0x55, 0x68, 0x8e, + 0x09, 0xda, 0xc6, 0x51, 0x1c, 0x38, 0x44, 0x58, 0x7f, 0x82, 0x9c, 0x2f, 0x1e, 0xa0, + 0x37, 0xa8, 0x1a, 0x8d, 0x54, 0x85, 0xed, 0x04, 0xea, 0xf2, 0x75, 0x80, 0x05, 0xb3, + 0x2a, 0x20, 0x47, 0x0b, ], p_enc: [ 0x02, 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, 0xad, 0x95, @@ -2051,69 +2060,2210 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0xc6, 0x38, 0xbf, ], c_enc: [ - 0xf1, 0x42, 0xc4, 0xe5, 0x0e, 0xef, 0x2c, 0x64, 0x44, 0xcc, 0xd4, 0x0b, 0x8c, 0x99, - 0xe5, 0x6a, 0x72, 0xec, 0x4e, 0x30, 0xcf, 0x73, 0x68, 0x75, 0xf0, 0xaa, 0x6b, 0x8e, - 0x6d, 0x9c, 0xc3, 0x67, 0x73, 0x2d, 0xbc, 0x9a, 0xf0, 0xb3, 0x7d, 0x1f, 0xca, 0x6d, - 0x5b, 0xdd, 0x1d, 0xc1, 0x23, 0x79, 0x29, 0x66, 0x99, 0x9d, 0x62, 0xea, 0xf8, 0xc5, - 0xfe, 0x8d, 0x99, 0x91, 0x84, 0xf2, 0x8b, 0x99, 0xec, 0xef, 0xcc, 0x8f, 0x14, 0x8d, - 0xbd, 0x52, 0x02, 0x6f, 0xdb, 0x48, 0xdf, 0xda, 0x7b, 0xad, 0xb6, 0xd1, 0xfc, 0xd2, - 0x9a, 0xd2, 0x19, 0xea, 0xbf, 0xbb, 0x44, 0x3f, 0x5d, 0x0f, 0x98, 0xb6, 0x6a, 0x3a, - 0x25, 0x73, 0x1b, 0x52, 0xd7, 0xf2, 0xdf, 0x70, 0x01, 0x4b, 0x4a, 0xc6, 0x99, 0x34, - 0x32, 0xf8, 0x98, 0x1e, 0x9c, 0xbf, 0xe1, 0x69, 0x13, 0xf6, 0x8a, 0x93, 0x5d, 0x2d, - 0xd0, 0x06, 0xd4, 0x28, 0xf1, 0x45, 0x53, 0xe7, 0x29, 0x86, 0xc7, 0x0f, 0xb4, 0x43, - 0x18, 0xd2, 0x7c, 0x4d, 0x6f, 0x6f, 0xd3, 0x92, 0x3a, 0xb0, 0xf6, 0x28, 0x9a, 0x02, - 0x48, 0x5e, 0x87, 0x17, 0xe5, 0x7d, 0xa0, 0x24, 0xeb, 0xe1, 0x6e, 0x9c, 0xf8, 0x35, - 0xcf, 0x53, 0xd2, 0x19, 0x4f, 0xd4, 0x25, 0x50, 0x06, 0xb8, 0x1b, 0xfd, 0x51, 0xd1, - 0xef, 0x5a, 0xe9, 0xf9, 0xef, 0x6a, 0xf6, 0x57, 0x41, 0x81, 0xe2, 0xe2, 0x26, 0x50, - 0xcb, 0x91, 0x2a, 0x6b, 0x89, 0x88, 0xa0, 0x28, 0x86, 0x32, 0xbc, 0x73, 0x62, 0xbb, - 0xe1, 0x87, 0x23, 0xd8, 0x27, 0xf7, 0x94, 0x58, 0x62, 0x26, 0x0d, 0xf7, 0x8e, 0x95, - 0xd7, 0xd5, 0xe3, 0x31, 0x3f, 0x5a, 0xff, 0x72, 0xe2, 0x1c, 0xe2, 0xdf, 0x00, 0xee, - 0x7e, 0x81, 0x5a, 0xba, 0x17, 0xcc, 0xde, 0x15, 0xc2, 0x7e, 0xee, 0x08, 0x5f, 0x52, - 0xf3, 0x6c, 0x02, 0xec, 0xd6, 0x6c, 0xe1, 0x8b, 0x40, 0x15, 0xbe, 0xb6, 0x09, 0x23, - 0x3f, 0x6e, 0xb2, 0x8e, 0x4a, 0xd5, 0xcd, 0xbe, 0x6f, 0xdc, 0xab, 0x68, 0xbf, 0xbb, - 0x6f, 0xfd, 0x87, 0xd3, 0x86, 0xd8, 0x7e, 0xb1, 0xfe, 0x00, 0x34, 0x27, 0x0f, 0x41, - 0x27, 0x1e, 0xa0, 0x1f, 0x9e, 0xae, 0xa9, 0xe8, 0x9f, 0x78, 0x35, 0x9e, 0x41, 0x73, - 0x94, 0xbb, 0x9d, 0xf5, 0xb6, 0x1c, 0x36, 0xe3, 0x0b, 0xc1, 0xce, 0x4a, 0xb1, 0xbd, - 0xd7, 0x9f, 0xa4, 0x08, 0x3e, 0x82, 0x8d, 0xd1, 0x04, 0xe4, 0x73, 0x80, 0xcd, 0x83, - 0xcd, 0x65, 0x9d, 0xf4, 0x4d, 0xb9, 0x43, 0xdc, 0x07, 0xbc, 0xc8, 0x07, 0x05, 0x04, - 0xa1, 0xc6, 0x55, 0x23, 0x02, 0xe7, 0x4b, 0xe4, 0xb9, 0xc4, 0x32, 0x75, 0xec, 0xc2, - 0x88, 0xce, 0xda, 0x41, 0x59, 0xa9, 0xcc, 0x55, 0x7c, 0x18, 0x19, 0x5c, 0xec, 0x92, - 0x62, 0x24, 0xd8, 0xd6, 0x9e, 0x98, 0xe1, 0x83, 0x5a, 0x2e, 0x29, 0x05, 0x63, 0xef, - 0x20, 0xd0, 0x83, 0xd1, 0x4e, 0x93, 0xcc, 0x1f, 0x3f, 0x76, 0x3e, 0xf5, 0x58, 0x0e, - 0x13, 0x5f, 0xae, 0x1b, 0xb8, 0x54, 0x4a, 0x0c, 0x5c, 0x6d, 0x88, 0x17, 0x41, 0xe4, - 0x51, 0x34, 0x47, 0xac, 0xeb, 0x09, 0x33, 0xe6, 0xeb, 0xaf, 0x0c, 0xe3, 0x13, 0xc1, - 0x8c, 0x9a, 0xf9, 0x5b, 0xa5, 0x61, 0x31, 0xf7, 0x8f, 0x42, 0x72, 0x41, 0x22, 0x65, - 0xbc, 0xf4, 0xc5, 0xf6, 0x80, 0x89, 0x3c, 0xcd, 0xa5, 0x73, 0x7d, 0xa8, 0x23, 0xb7, - 0x63, 0x6e, 0x98, 0xdb, 0xa5, 0x62, 0x44, 0xf2, 0xb9, 0x6a, 0x10, 0x90, 0xa6, 0x60, - 0x38, 0x15, 0xc0, 0xef, 0x54, 0x97, 0x50, 0xf2, 0x47, 0x06, 0x19, 0x0b, 0x55, 0x76, - 0x6e, 0x8a, 0x62, 0x09, 0xa1, 0xc2, 0x2f, 0x67, 0xe8, 0x77, 0x62, 0x66, 0xb6, 0xfa, - 0xe4, 0x5b, 0xf7, 0x94, 0x90, 0x7f, 0x64, 0x71, 0x4f, 0xbe, 0x26, 0xc3, 0x0a, 0xc4, - 0x04, 0x11, 0xf5, 0xe6, 0x4f, 0xc1, 0x66, 0xc8, 0x4f, 0x28, 0xb8, 0x23, 0xfd, 0xaa, - 0x68, 0x32, 0xa3, 0x25, 0x63, 0x31, 0x7d, 0x25, 0x4c, 0x53, 0x16, 0x9b, 0x9f, 0xfb, - 0x24, 0x53, 0xa1, 0x12, 0x2f, 0xa4, 0x4c, 0x7f, 0x17, 0xc1, 0x36, 0xb5, 0x7e, 0x20, - 0xad, 0x17, 0x7a, 0x7e, 0xee, 0xbf, 0x9f, 0x56, 0xfb, 0x0b, 0x55, 0xcc, 0xcf, 0x68, - 0x2b, 0x8a, 0x5b, 0xd8, 0xa7, 0x45, + 0x7b, 0x59, 0x87, 0x78, 0xa7, 0x28, 0x4d, 0x52, 0xa7, 0x47, 0x77, 0x4c, 0x54, 0xbd, + 0x92, 0x57, 0xb3, 0xf1, 0x7a, 0xf1, 0x3e, 0xcc, 0x72, 0xc0, 0xe3, 0xcd, 0x95, 0xeb, + 0xfa, 0xfa, 0xa3, 0x7d, 0x16, 0x65, 0x15, 0x53, 0xdd, 0x27, 0xf0, 0x1c, 0x9c, 0xf2, + 0x4b, 0x62, 0xd7, 0xdc, 0xfd, 0x52, 0xfa, 0x4b, 0x2b, 0x3b, 0x4a, 0x8c, 0xa9, 0xeb, + 0xfc, 0xe7, 0xf4, 0xfc, 0xec, 0x27, 0xe6, 0x05, 0x8e, 0x44, 0x68, 0xc1, 0x50, 0x10, + 0xd0, 0x17, 0xcb, 0x90, 0x1a, 0xbf, 0xb2, 0x2e, 0xad, 0x86, 0x99, 0x83, 0xf6, 0x9a, + 0xed, 0xf2, 0xda, 0x7d, 0x6a, 0xaf, 0xd1, 0x30, 0x6e, 0xe7, 0x36, 0xf2, 0xdb, 0x33, + 0xbc, 0xe4, 0xb0, 0x9f, 0xca, 0x74, 0x69, 0x2a, 0x52, 0x09, 0xa7, 0x39, 0x2b, 0x7e, + 0xa9, 0x68, 0x5b, 0xe9, 0xec, 0x43, 0x1f, 0xfe, 0x50, 0xf7, 0x0f, 0x90, 0x22, 0x74, + 0x05, 0x03, 0x45, 0x2a, 0xb5, 0x14, 0x92, 0xb1, 0xf7, 0x47, 0x7e, 0xda, 0x42, 0x7b, + 0x42, 0x3a, 0x93, 0x1b, 0x26, 0x38, 0x6c, 0x56, 0xe4, 0x27, 0x86, 0x3d, 0x46, 0xb1, + 0x99, 0xff, 0xa0, 0x8c, 0x52, 0x9f, 0xa5, 0x72, 0x1f, 0x68, 0xe9, 0x14, 0xf6, 0xea, + 0x6a, 0x8a, 0xe6, 0xae, 0xcb, 0xf7, 0x37, 0x47, 0x1e, 0xbd, 0x83, 0xdb, 0xa9, 0xa7, + 0xcd, 0x89, 0x75, 0x66, 0x20, 0x4e, 0x2b, 0xae, 0x63, 0xe3, 0x4e, 0x70, 0x32, 0x51, + 0x02, 0x96, 0x92, 0x0d, 0x7e, 0x7a, 0x7c, 0xcf, 0x0f, 0xeb, 0xe7, 0xa8, 0x33, 0x69, + 0x6a, 0x4b, 0x67, 0x41, 0x88, 0x5e, 0x9b, 0x94, 0x0c, 0x61, 0xdd, 0x8d, 0x44, 0x38, + 0x54, 0x74, 0x15, 0x31, 0x0b, 0x15, 0xcf, 0x18, 0xdc, 0x19, 0x90, 0x07, 0x8c, 0x70, + 0x8b, 0xea, 0xc3, 0x32, 0xa8, 0xe0, 0x81, 0x46, 0xa6, 0x95, 0x8e, 0xa6, 0xf4, 0x3f, + 0xd0, 0xc2, 0xc8, 0xe9, 0x99, 0xaa, 0x4f, 0xdf, 0x1e, 0x77, 0xef, 0xde, 0x54, 0xfd, + 0x65, 0xc6, 0x7a, 0x3f, 0x07, 0xda, 0xf5, 0xf6, 0x04, 0x49, 0x60, 0xa0, 0xb6, 0xdd, + 0x84, 0x1f, 0xf8, 0xb8, 0xa5, 0x92, 0xc7, 0xb1, 0x09, 0x34, 0x2c, 0x73, 0x5c, 0x2a, + 0x0e, 0x37, 0xb3, 0x0b, 0x8b, 0xaa, 0x5c, 0x77, 0x01, 0xeb, 0xc7, 0xa8, 0xf8, 0x20, + 0xc0, 0x22, 0x7c, 0xa5, 0x00, 0x3f, 0x36, 0xee, 0x68, 0xf7, 0xb2, 0x89, 0x81, 0xc2, + 0x73, 0x32, 0x03, 0x9d, 0xd6, 0xa4, 0x94, 0xf0, 0xcd, 0x02, 0xbd, 0xd2, 0x8f, 0x68, + 0x3e, 0xca, 0x1b, 0x03, 0x2a, 0xfc, 0x09, 0xdd, 0x0c, 0xd8, 0x56, 0xcb, 0xc1, 0xa3, + 0x5e, 0x74, 0xd4, 0x0c, 0x24, 0x53, 0xdf, 0xe2, 0x42, 0xc8, 0x6a, 0x7a, 0x60, 0xbc, + 0xbd, 0xdb, 0x17, 0x96, 0x6c, 0x7d, 0xba, 0x76, 0x9e, 0xab, 0xd1, 0xc1, 0x67, 0xb7, + 0xe8, 0x19, 0x78, 0xf9, 0x12, 0x8b, 0xac, 0x26, 0xa2, 0x8d, 0x77, 0x21, 0x30, 0x79, + 0xcb, 0x56, 0xc0, 0x95, 0xa7, 0xc0, 0x60, 0xde, 0x0e, 0x77, 0x5c, 0xa8, 0xac, 0x8e, + 0x6c, 0xa9, 0x4d, 0x19, 0xc6, 0x16, 0x2e, 0x44, 0xf7, 0xa8, 0xf0, 0x14, 0x9d, 0x31, + 0xd3, 0x46, 0x3d, 0x01, 0xb6, 0x1a, 0x14, 0x63, 0xa9, 0xde, 0x3d, 0x8a, 0xb7, 0x40, + 0x04, 0x0a, 0x76, 0xe0, 0x5b, 0x37, 0x64, 0x28, 0x86, 0x29, 0x87, 0x59, 0x5b, 0x87, + 0xce, 0xa6, 0x94, 0xfe, 0x92, 0x0a, 0x06, 0x7e, 0x81, 0x6b, 0x4f, 0x29, 0xa3, 0xa2, + 0x24, 0x50, 0x14, 0x0f, 0x13, 0x5d, 0x71, 0x9a, 0x97, 0x1b, 0x81, 0xfc, 0x19, 0x16, + 0x98, 0x0a, 0x55, 0xdd, 0xf8, 0xd9, 0x87, 0x30, 0x57, 0x36, 0x35, 0xa0, 0x70, 0x85, + 0xc4, 0xe7, 0x7c, 0x7e, 0x1c, 0xdb, 0xb6, 0x85, 0x42, 0x6e, 0xe4, 0x62, 0xcc, 0x30, + 0x83, 0xa3, 0xf5, 0xa3, 0xb9, 0x17, 0xc0, 0x6f, 0x9a, 0x96, 0xf9, 0xf7, 0xbd, 0x81, + 0xac, 0xa4, 0x9b, 0xef, 0x95, 0xb9, 0x28, 0x06, 0xc4, 0x2d, 0x09, 0x12, 0x01, 0x31, + 0x42, 0xb2, 0x2a, 0x7b, 0xad, 0x72, 0x12, 0x11, 0x46, 0x91, 0xf1, 0xdc, 0x72, 0x64, + 0xc6, 0x7e, 0x76, 0x34, 0xf5, 0xd7, 0x95, 0xc9, 0x75, 0x30, 0x62, 0xe3, 0x06, 0xc0, + 0x6b, 0xc1, 0x03, 0xaa, 0x01, 0xc1, 0x0d, 0x1f, 0x5d, 0xd4, 0xcd, 0x59, 0xf6, 0x53, + 0x2c, 0xb7, 0x23, 0xe3, 0xa0, 0x26, ], ock: [ - 0x06, 0x3c, 0x83, 0xa4, 0x95, 0x74, 0xe7, 0x80, 0x35, 0x89, 0xcc, 0x3d, 0x34, 0xb4, - 0x38, 0x90, 0xf3, 0xd7, 0x63, 0x87, 0x35, 0xe7, 0xbd, 0x5e, 0xbd, 0xd1, 0xa5, 0xea, - 0xb9, 0xd9, 0xc5, 0xd6, + 0x4a, 0x25, 0x25, 0x4c, 0xcc, 0x44, 0x4e, 0xc6, 0x1c, 0x2b, 0xac, 0xeb, 0x2e, 0xe3, + 0x97, 0x7a, 0x63, 0x32, 0x44, 0x9a, 0x3a, 0x53, 0xad, 0xd2, 0x31, 0xab, 0xf3, 0xd1, + 0x8b, 0xb3, 0x29, 0x3d, ], op: [ 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, - 0x44, 0x6d, 0xf4, 0x39, 0xae, 0xec, 0x0d, 0xb9, 0x0e, 0x55, 0x83, 0x3c, 0x8b, 0xaf, - 0x52, 0x6d, 0x66, 0x54, 0xa1, 0x74, 0x5b, 0xa4, 0x4c, 0xad, 0x3c, 0xf9, 0xa6, 0x2c, - 0xfb, 0xee, 0x5d, 0xe3, 0x99, 0xca, 0x31, 0x26, + 0x44, 0x6d, 0xf4, 0x39, 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, + 0xd5, 0x64, 0x6b, 0xc4, 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, + 0x15, 0x5b, 0xef, 0x4d, 0x46, 0x1e, 0xec, 0x29, + ], + c_out: [ + 0x7b, 0xf4, 0x12, 0x7d, 0x22, 0xcc, 0x57, 0x35, 0x87, 0x51, 0x2f, 0xf8, 0x1e, 0x55, + 0x3e, 0x3c, 0x98, 0x23, 0x5f, 0x51, 0xc7, 0x23, 0x7e, 0x9e, 0x76, 0x1a, 0x08, 0xf2, + 0xe1, 0xe8, 0x0d, 0x04, 0x26, 0x98, 0xfc, 0x3b, 0x1d, 0x03, 0x18, 0xf1, 0xfd, 0xca, + 0x8e, 0x41, 0xa3, 0x16, 0xd6, 0xaf, 0x3a, 0xc0, 0xc4, 0x0c, 0xe1, 0x99, 0x47, 0xa2, + 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, + 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, + ], + note_type: None, + }, + TestVector { + incoming_viewing_key: [ + 0xdc, 0x10, 0x95, 0x20, 0x57, 0xc4, 0xbe, 0xaa, 0xd8, 0xaf, 0x37, 0xce, 0x4e, 0xee, + 0x9b, 0x10, 0xed, 0x84, 0xf4, 0x6b, 0xad, 0xd4, 0x8e, 0x0a, 0x22, 0x9b, 0xe8, 0x41, + 0x54, 0xa9, 0xbf, 0x75, 0x6b, 0xe0, 0x2e, 0xcf, 0xa9, 0xad, 0x6d, 0x9c, 0x02, 0xc8, + 0xf9, 0x54, 0xcb, 0x15, 0x71, 0x7b, 0x79, 0x46, 0x1f, 0x00, 0x4b, 0xf1, 0xbc, 0x5c, + 0x7e, 0x3f, 0xda, 0x73, 0x53, 0x7c, 0x1a, 0x0a, + ], + ovk: [ + 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, + 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, + 0x0f, 0x26, 0x3b, 0x35, + ], + default_d: [ + 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, + ], + default_pk_d: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, + ], + v: 2111628168871420429, + rseed: [ + 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, + 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, + 0x3b, 0xd5, 0xbc, 0x87, + ], + memo: [ + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x09, 0xee, 0x7e, 0xf6, 0x3a, 0xb1, 0xcf, 0x24, 0x2b, 0xaa, 0x76, 0xfc, 0xbf, 0xfb, + 0xe5, 0x75, 0x5f, 0x13, 0x14, 0x2b, 0x38, 0xb1, 0xa0, 0x40, 0x4d, 0x7d, 0x5a, 0x3f, + 0x4f, 0x22, 0x1e, 0x96, + ], + rho: [ + 0xf6, 0x5d, 0x22, 0x96, 0x09, 0x58, 0xd7, 0x28, 0x59, 0x60, 0x9c, 0x99, 0x46, 0xd8, + 0xa9, 0x4a, 0x06, 0x04, 0xb8, 0x00, 0x6c, 0xc7, 0x94, 0xbc, 0xab, 0x57, 0x73, 0x49, + 0xbc, 0xf8, 0x63, 0x37, + ], + cmx: [ + 0x85, 0xec, 0x16, 0xe8, 0x78, 0x77, 0x33, 0x37, 0x07, 0x9a, 0xec, 0xf3, 0x2c, 0x45, + 0x5e, 0xbf, 0x16, 0x96, 0x8d, 0xa1, 0xd4, 0x34, 0x51, 0xb7, 0xa3, 0x06, 0x87, 0x6c, + 0xa3, 0x08, 0xea, 0x3c, + ], + esk: [ + 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, 0x39, 0x16, 0x0f, 0xe5, + 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, 0xe0, 0xd2, 0x9b, 0x35, + 0x9a, 0xc4, 0xfa, 0x2c, + ], + ephemeral_key: [ + 0x10, 0x0d, 0xf0, 0x1d, 0x49, 0x86, 0x01, 0x21, 0x8a, 0x28, 0x6b, 0x8f, 0x4e, 0x54, + 0xda, 0x9b, 0x3f, 0x14, 0x5c, 0x34, 0x70, 0xa9, 0xdb, 0xc4, 0x14, 0x48, 0x0a, 0xa8, + 0xf2, 0xf4, 0x90, 0x9c, + ], + shared_secret: [ + 0x93, 0x68, 0xdd, 0x4f, 0x2a, 0xf6, 0x23, 0x34, 0xb8, 0x85, 0xb9, 0x6b, 0xc4, 0xc3, + 0x8f, 0x10, 0x3a, 0xec, 0x25, 0x6b, 0xed, 0xc2, 0x8b, 0x5e, 0x2e, 0x10, 0x36, 0x4c, + 0xdd, 0xf3, 0x84, 0xa4, + ], + k_enc: [ + 0x7a, 0xff, 0xfc, 0x6e, 0xae, 0x5d, 0x56, 0xb2, 0x7b, 0x86, 0xdb, 0x9e, 0xc8, 0xae, + 0xc2, 0x70, 0xbb, 0x0a, 0xb7, 0x31, 0x23, 0xfd, 0x2a, 0x0b, 0x83, 0xf4, 0xef, 0x84, + 0xc6, 0x98, 0xe1, 0x67, + ], + p_enc: [ + 0x03, 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, 0x0d, 0x22, + 0x4a, 0xb7, 0xa1, 0x02, 0x4e, 0x1d, 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, + 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, + 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, 0x3b, 0xd5, 0xbc, 0x87, 0xa9, 0x71, 0x5e, 0x65, + 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, + 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, + ], + c_enc: [ + 0x45, 0x6b, 0x2b, 0xb8, 0x03, 0xc7, 0xdf, 0xf7, 0xac, 0x82, 0xe6, 0x42, 0xf4, 0xd8, + 0x46, 0x1e, 0x0b, 0x7a, 0x3b, 0x3c, 0x95, 0xa4, 0xcb, 0xf1, 0xc0, 0x6f, 0xeb, 0x93, + 0xa1, 0x8b, 0xeb, 0xa2, 0x9f, 0x2b, 0x8f, 0x12, 0x1a, 0x61, 0x5c, 0xa5, 0x3f, 0xc2, + 0xa7, 0x60, 0x63, 0xb8, 0x0d, 0xaa, 0x71, 0x01, 0x8b, 0x66, 0x3b, 0x7c, 0x46, 0x6d, + 0xb2, 0x63, 0xf9, 0x04, 0x27, 0xd0, 0x11, 0x7f, 0x0b, 0x89, 0x90, 0x6e, 0x98, 0x41, + 0x7f, 0x3e, 0xe8, 0x5a, 0xcc, 0xed, 0xb1, 0x41, 0xfb, 0x10, 0x26, 0xa3, 0xb3, 0xf7, + 0xa4, 0xfd, 0x10, 0x24, 0xf9, 0xc8, 0x08, 0x9a, 0x2e, 0xbe, 0x1a, 0x27, 0x82, 0xf8, + 0xb0, 0xbf, 0x5c, 0x40, 0xb6, 0xd5, 0x2f, 0xfe, 0x38, 0x37, 0xf4, 0xe4, 0x42, 0x52, + 0x13, 0x41, 0xc2, 0x4d, 0x3e, 0x89, 0x55, 0x95, 0x08, 0x86, 0x27, 0x85, 0xea, 0x63, + 0x56, 0xb4, 0xe4, 0x66, 0xc3, 0x25, 0x9c, 0xeb, 0x0d, 0x28, 0x2e, 0x07, 0xbb, 0x35, + 0xdc, 0xf2, 0xd9, 0xa8, 0x62, 0xc7, 0x47, 0x58, 0xd3, 0x83, 0xaa, 0xa2, 0x82, 0xfa, + 0xc4, 0xfa, 0xcf, 0xe5, 0x39, 0xe4, 0xe1, 0xbb, 0xd5, 0x46, 0x8a, 0xcf, 0x25, 0xec, + 0x2b, 0x4b, 0xa5, 0x11, 0x9d, 0xea, 0xed, 0x01, 0x1d, 0x4f, 0x30, 0xb0, 0xc5, 0x82, + 0x01, 0xfe, 0xe1, 0xc6, 0xe4, 0xf6, 0xb5, 0x2e, 0x41, 0xad, 0xfa, 0x5d, 0x6f, 0xda, + 0x94, 0xa5, 0x23, 0x20, 0xe8, 0x3b, 0x80, 0xc6, 0xfc, 0xee, 0xb8, 0x97, 0x89, 0xd8, + 0x79, 0x94, 0xb7, 0xa0, 0x16, 0xec, 0x64, 0xe4, 0x70, 0x78, 0x07, 0xf8, 0xf2, 0xd2, + 0x30, 0x63, 0x10, 0x74, 0x10, 0x9f, 0xc5, 0x9d, 0xe3, 0xe4, 0x37, 0x10, 0xca, 0xe8, + 0x9c, 0xb1, 0x89, 0xa0, 0xa4, 0x64, 0x8b, 0x37, 0x54, 0x5d, 0x25, 0x49, 0x47, 0x95, + 0xa8, 0xdf, 0x3f, 0xfc, 0x7a, 0x3a, 0x21, 0xe3, 0xb9, 0x1c, 0x95, 0x96, 0xe0, 0xd5, + 0x10, 0x5d, 0xf8, 0xad, 0xa9, 0xcf, 0xe9, 0x31, 0x10, 0xb1, 0x9f, 0xf2, 0xaf, 0x83, + 0x03, 0xb5, 0xd2, 0x79, 0x3f, 0xff, 0xd0, 0x4d, 0x8e, 0x02, 0xf7, 0xb9, 0x30, 0x14, + 0x80, 0xdf, 0xd9, 0x35, 0x50, 0x2d, 0x98, 0xe2, 0xf3, 0xc3, 0xe9, 0xe9, 0x5e, 0x64, + 0xe4, 0x96, 0xeb, 0x7d, 0x15, 0xcf, 0x2c, 0x70, 0x11, 0x94, 0xe6, 0x25, 0xde, 0x52, + 0x1a, 0x02, 0x55, 0x20, 0xdf, 0x67, 0xac, 0x2b, 0xa4, 0x3b, 0x9c, 0x4a, 0x6d, 0x77, + 0xb8, 0x6a, 0x40, 0x18, 0x2d, 0x70, 0x31, 0x8b, 0x8f, 0xa3, 0x48, 0xb1, 0x86, 0x47, + 0xd8, 0x4e, 0x0e, 0xe5, 0xf0, 0x56, 0x07, 0xa2, 0xb8, 0xf2, 0x69, 0xe1, 0x86, 0xc7, + 0x94, 0x28, 0xbe, 0xa6, 0x7c, 0xbf, 0x71, 0xda, 0xcc, 0x98, 0xe9, 0xcc, 0x72, 0x5e, + 0x50, 0x53, 0xa4, 0x40, 0xca, 0xa6, 0xca, 0xd2, 0x41, 0xa5, 0x06, 0x28, 0x18, 0x3a, + 0xe9, 0xef, 0x9f, 0x0c, 0xbd, 0xfe, 0xf7, 0x0a, 0x42, 0xe5, 0xb7, 0x97, 0xbc, 0x99, + 0xd9, 0x22, 0xfc, 0xc2, 0x81, 0x37, 0x84, 0xea, 0xe4, 0x48, 0x60, 0x18, 0x0e, 0xf8, + 0xe8, 0x1f, 0x7b, 0x94, 0xf2, 0xad, 0x62, 0x12, 0x8b, 0xb6, 0x1f, 0x10, 0xd5, 0x0c, + 0x9c, 0xad, 0x9d, 0x80, 0x48, 0xd9, 0x78, 0x01, 0x8a, 0x1f, 0x3b, 0xc9, 0x24, 0x28, + 0xf8, 0x9d, 0x7d, 0xdc, 0xe5, 0x45, 0x4b, 0xc4, 0x49, 0x1f, 0xb4, 0xc2, 0xcb, 0x66, + 0x88, 0x35, 0xb2, 0x2f, 0xcc, 0x4d, 0xf2, 0x08, 0xf2, 0x16, 0x64, 0xf7, 0x12, 0x94, + 0xc5, 0xce, 0xd3, 0x3c, 0x8e, 0x11, 0xd4, 0x25, 0xd1, 0x39, 0x85, 0x23, 0xc2, 0x79, + 0x88, 0x3a, 0x38, 0x2f, 0x70, 0xfe, 0xfe, 0xc8, 0x25, 0xc5, 0xe3, 0x50, 0x85, 0xaf, + 0x82, 0xd0, 0xa0, 0xa9, 0xbf, 0x45, 0x11, 0x65, 0x0a, 0x2b, 0xfb, 0xf0, 0xb2, 0x18, + 0x82, 0x10, 0x5e, 0xc6, 0xe5, 0x99, 0x74, 0xd8, 0xd6, 0xce, 0x73, 0x07, 0x8f, 0xb4, + 0xb5, 0x63, 0x4e, 0x85, 0xd7, 0xe2, 0x0a, 0x97, 0xff, 0xb6, 0x5d, 0x4f, 0x5e, 0xaf, + 0x42, 0x63, 0x9b, 0x09, 0xf5, 0xed, 0xa5, 0x9a, 0xb1, 0x04, 0x97, 0x69, 0x95, 0x41, + 0xd1, 0xc8, 0x22, 0x8e, 0xb5, 0xdf, 0x47, 0xa6, 0x67, 0xc4, 0x6d, 0x4c, 0xff, 0xeb, + 0xfe, 0x3f, 0xbb, 0x0a, 0x4e, 0x48, + ], + ock: [ + 0x17, 0xeb, 0xb4, 0x82, 0xdf, 0x8d, 0x13, 0xc2, 0x0d, 0x9b, 0x4a, 0x03, 0x9f, 0x40, + 0x5a, 0x93, 0x69, 0x8a, 0xc2, 0x24, 0xf3, 0xea, 0x03, 0xfb, 0x55, 0x8d, 0x5b, 0x53, + 0x11, 0x46, 0xfb, 0xea, + ], + op: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, + 0x39, 0x16, 0x0f, 0xe5, 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, + 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, + ], + c_out: [ + 0x2d, 0x76, 0x57, 0x79, 0x67, 0x44, 0x5f, 0xb9, 0x17, 0xee, 0x72, 0xd3, 0x2d, 0x4b, + 0x75, 0x3b, 0x25, 0x10, 0xd8, 0x05, 0x5d, 0xec, 0x8b, 0xf1, 0x22, 0x0a, 0x75, 0xf0, + 0x65, 0xbd, 0x47, 0xe2, 0xcc, 0xb6, 0x03, 0x98, 0x84, 0x50, 0x23, 0x1b, 0xd3, 0x1c, + 0x15, 0x6f, 0xf2, 0xa7, 0x2a, 0xfd, 0x4a, 0x96, 0x0b, 0x6f, 0x6a, 0x78, 0x84, 0x65, + 0x13, 0x51, 0xe2, 0x4b, 0x47, 0x02, 0x87, 0xd5, 0x83, 0xba, 0x69, 0x71, 0x18, 0xec, + 0x07, 0xf6, 0x59, 0x2c, 0x4c, 0xd7, 0xcd, 0x6a, 0xc7, 0x7e, + ], + note_type: Some([ + 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, + 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, + 0x4f, 0x95, 0x22, 0xb2, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0xb6, 0x6c, 0x73, 0x33, 0x75, 0xda, 0xc6, 0xff, 0xcc, 0x98, 0xf5, 0x0f, 0x3a, 0xf0, + 0xb0, 0x76, 0x05, 0x53, 0xfe, 0x98, 0xed, 0x61, 0xff, 0xa4, 0x93, 0xea, 0xe6, 0x8d, + 0xf0, 0xb3, 0x33, 0x4e, 0xe8, 0xd4, 0x39, 0x37, 0xb7, 0xdb, 0x8e, 0xbb, 0xfe, 0xbd, + 0x54, 0x8a, 0x28, 0x02, 0x51, 0xea, 0x87, 0xaa, 0x5d, 0x8c, 0xa5, 0x36, 0x86, 0x1b, + 0x38, 0x4f, 0x20, 0x86, 0x9f, 0x8f, 0xe8, 0x01, + ], + ovk: [ + 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, 0x3f, 0x38, 0x0a, 0x4d, + 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, 0x3d, 0x73, 0x45, 0x9a, + 0xfe, 0x24, 0x1f, 0x72, + ], + default_d: [ + 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, + ], + default_pk_d: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, + ], + v: 16065731808124965111, + rseed: [ + 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, + 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, + 0x71, 0x8c, 0x29, 0xdd, + ], + memo: [ + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x54, 0xb6, 0x99, 0x64, 0x13, 0x6b, 0x63, 0xd1, 0x7d, 0x62, 0x44, 0x1a, 0x69, 0x37, + 0x13, 0x9d, 0x2c, 0xe1, 0x4b, 0xb5, 0x5c, 0x42, 0x07, 0xfe, 0x74, 0xd7, 0x70, 0x83, + 0x53, 0x51, 0x5b, 0xa8, + ], + rho: [ + 0x27, 0x3c, 0x68, 0xd1, 0x9c, 0xda, 0xa8, 0x62, 0x8b, 0xac, 0x37, 0xa2, 0xd4, 0x2c, + 0x51, 0x1c, 0x9b, 0xab, 0x65, 0xb6, 0xd8, 0xd5, 0xc5, 0xbd, 0x1e, 0x32, 0x77, 0x1a, + 0xb6, 0xf6, 0x4c, 0x26, + ], + cmx: [ + 0x40, 0x8f, 0x59, 0x4f, 0xdd, 0xc5, 0x0c, 0x67, 0xf5, 0x47, 0xe1, 0xeb, 0x3e, 0xa2, + 0x99, 0xa3, 0x1f, 0x69, 0xf5, 0x7f, 0xc9, 0x92, 0x03, 0x01, 0x42, 0x90, 0x35, 0xa6, + 0xc2, 0x49, 0x79, 0x1a, + ], + esk: [ + 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, 0xef, 0x08, 0xbd, 0xf6, + 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, 0xf5, 0x3b, 0x57, 0xc3, + 0x45, 0xa9, 0x87, 0x2f, + ], + ephemeral_key: [ + 0xa5, 0xc8, 0x0a, 0x29, 0xf2, 0xec, 0xdd, 0xd7, 0x01, 0x96, 0xef, 0x45, 0x9e, 0xd5, + 0x03, 0xc4, 0xb3, 0xc2, 0x22, 0x8d, 0x10, 0xcc, 0xbc, 0xad, 0x9a, 0x28, 0x23, 0x30, + 0x07, 0x7b, 0xca, 0x0c, + ], + shared_secret: [ + 0x37, 0x14, 0x15, 0xfc, 0x1e, 0x98, 0x42, 0xa1, 0x26, 0xa3, 0x7a, 0xa7, 0x7b, 0x8f, + 0x0f, 0x1a, 0xb6, 0x48, 0xa3, 0xf7, 0x43, 0x57, 0x34, 0x89, 0x6f, 0x07, 0x59, 0x52, + 0xe7, 0xd1, 0x60, 0x17, + ], + k_enc: [ + 0xd7, 0x36, 0xf0, 0x3c, 0x81, 0x2d, 0x9b, 0xf9, 0x54, 0xff, 0xd2, 0x41, 0x84, 0x07, + 0xf3, 0x36, 0xa5, 0xf9, 0x69, 0x8b, 0x62, 0x85, 0x23, 0x2f, 0x5c, 0x85, 0xf0, 0xd1, + 0x1d, 0x5e, 0x9d, 0x0a, + ], + p_enc: [ + 0x03, 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, 0xf7, 0x90, + 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, + 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, + 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, 0xdf, 0xfd, 0x79, 0xa9, + 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, + 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, + ], + c_enc: [ + 0xfc, 0x90, 0xcb, 0xe1, 0xcd, 0x9f, 0x59, 0x9a, 0x1a, 0x24, 0xc7, 0xa3, 0xea, 0xf6, + 0x07, 0xd9, 0x13, 0xbf, 0x48, 0xbd, 0xc1, 0xa4, 0x6d, 0xf7, 0xb1, 0x74, 0x7f, 0x12, + 0x60, 0x64, 0x49, 0x4b, 0xf5, 0x39, 0x61, 0xe9, 0xa5, 0xa2, 0xb9, 0x69, 0x80, 0x57, + 0x63, 0x44, 0x2e, 0x2c, 0x38, 0x8d, 0x21, 0x2d, 0x74, 0x84, 0x6e, 0x57, 0x27, 0x87, + 0x2d, 0x06, 0x3f, 0xc9, 0x94, 0xa4, 0x4f, 0x9e, 0xb6, 0x55, 0x25, 0xd6, 0x8f, 0x98, + 0x24, 0xa6, 0x03, 0x75, 0xfe, 0x43, 0xc0, 0x5f, 0x08, 0xfe, 0x45, 0x42, 0xa7, 0xe4, + 0x0c, 0x03, 0x8d, 0xe7, 0x10, 0x85, 0x01, 0x17, 0x95, 0x1b, 0x9a, 0x32, 0x1e, 0xea, + 0x4f, 0x8c, 0x91, 0xc0, 0x1d, 0x39, 0xdb, 0xb5, 0xd4, 0x12, 0x40, 0xf8, 0xb1, 0xb1, + 0xdb, 0xb3, 0x3f, 0x45, 0x87, 0x87, 0xdb, 0x8c, 0xda, 0x06, 0x9b, 0x64, 0x5a, 0x76, + 0x38, 0xc2, 0xec, 0xca, 0xd3, 0xd9, 0xa7, 0x39, 0xd6, 0x4c, 0x9a, 0xd5, 0xd5, 0xb3, + 0xa0, 0x24, 0x55, 0xa4, 0xec, 0xd6, 0x96, 0x7c, 0xf3, 0xb3, 0x3b, 0xf0, 0x4e, 0xf6, + 0xdd, 0x88, 0x10, 0xe1, 0x0c, 0x25, 0x86, 0xf7, 0x89, 0x32, 0x44, 0xea, 0x72, 0x80, + 0xd1, 0x34, 0xcf, 0x37, 0xb3, 0xdc, 0x0c, 0x32, 0x82, 0x3b, 0x1a, 0x29, 0xc5, 0x0c, + 0xa6, 0x48, 0x31, 0xd8, 0x4e, 0xbd, 0xf5, 0xe0, 0x1c, 0x14, 0xca, 0x36, 0x05, 0xbe, + 0x02, 0xf1, 0x5f, 0x31, 0x57, 0x90, 0xf7, 0x4e, 0x20, 0x57, 0x7f, 0x92, 0x39, 0x51, + 0x2f, 0xbd, 0xdd, 0x67, 0x63, 0x77, 0xae, 0x50, 0xc3, 0xfe, 0x71, 0xc9, 0x30, 0xa8, + 0x29, 0x57, 0xd1, 0x54, 0x70, 0xeb, 0x1b, 0x55, 0xb2, 0x0c, 0xe5, 0x02, 0x35, 0x64, + 0xfe, 0xa7, 0xe1, 0x81, 0xbe, 0x04, 0xa9, 0x33, 0xa7, 0xa3, 0xa1, 0x11, 0x89, 0x4d, + 0xec, 0xf7, 0x2a, 0x56, 0x54, 0xcb, 0x4e, 0xac, 0x32, 0xe1, 0xd5, 0x96, 0xad, 0x99, + 0x1a, 0x2f, 0x4c, 0x62, 0xe8, 0xe2, 0x82, 0x57, 0x13, 0x7b, 0xcb, 0xa5, 0x03, 0xdc, + 0x91, 0xed, 0x9e, 0x90, 0xb3, 0x08, 0xcd, 0xa5, 0xcc, 0xcc, 0xc9, 0xd1, 0x4e, 0xa6, + 0xd0, 0x3b, 0x3d, 0xec, 0xa1, 0x57, 0xd5, 0x30, 0xde, 0x63, 0x1e, 0x1e, 0x45, 0x8f, + 0x6a, 0x60, 0x8e, 0x1f, 0x9d, 0x57, 0x9b, 0x6e, 0xe6, 0x00, 0x5c, 0xd0, 0xa8, 0xc3, + 0xe2, 0xdf, 0x89, 0x46, 0x8a, 0xcf, 0xb4, 0x36, 0xcb, 0x59, 0x84, 0x56, 0xf0, 0x38, + 0x95, 0x5d, 0xc6, 0xb4, 0x07, 0xec, 0x33, 0x00, 0xa5, 0xcf, 0xcd, 0xc8, 0x45, 0x47, + 0xe3, 0xef, 0xe9, 0xfc, 0xa1, 0x7e, 0xd2, 0xc2, 0x74, 0xf0, 0x03, 0x0b, 0x63, 0xcc, + 0x42, 0xe2, 0x38, 0x94, 0xa5, 0xf2, 0x53, 0x66, 0xcb, 0xc3, 0xbf, 0xcb, 0x77, 0x2d, + 0x04, 0x17, 0xf6, 0x24, 0x4b, 0x2f, 0xd8, 0x17, 0xc4, 0xc6, 0x79, 0x06, 0xc3, 0x38, + 0x4d, 0x69, 0xd7, 0x93, 0xef, 0xca, 0x6e, 0x5d, 0x6a, 0xf2, 0x5e, 0x4e, 0xbc, 0x0f, + 0x53, 0x56, 0xeb, 0x74, 0x28, 0x85, 0x19, 0xe8, 0xf4, 0x49, 0x38, 0xeb, 0xf9, 0xb2, + 0x5b, 0xe5, 0x85, 0xe1, 0x35, 0x1f, 0x62, 0x59, 0x6c, 0x31, 0x79, 0xca, 0xe4, 0x5e, + 0x75, 0x49, 0xd7, 0xfb, 0xb5, 0x91, 0x3b, 0xe9, 0xc3, 0xba, 0xa5, 0x7c, 0xab, 0x7c, + 0xd4, 0xb5, 0x67, 0x12, 0x8d, 0x1b, 0xa5, 0x20, 0x31, 0xd7, 0xd5, 0xa5, 0xbd, 0x69, + 0xde, 0x61, 0x4a, 0xbb, 0x8c, 0xa3, 0x8a, 0x94, 0x51, 0xcd, 0x1b, 0xad, 0xd9, 0x71, + 0xb3, 0xf1, 0xb0, 0xb5, 0x0c, 0x7f, 0x21, 0xbf, 0xc4, 0x23, 0x04, 0xa4, 0xa5, 0x3e, + 0x0d, 0x55, 0x92, 0x0d, 0xa0, 0x53, 0x27, 0x14, 0x79, 0x13, 0x45, 0xfb, 0x07, 0x4c, + 0x66, 0xc4, 0xb7, 0xc9, 0x89, 0x28, 0x30, 0xf9, 0x62, 0x09, 0xb8, 0x1c, 0x26, 0xd1, + 0x74, 0xf8, 0xa9, 0x33, 0xc3, 0x77, 0x9d, 0x97, 0x88, 0x55, 0x3f, 0x6e, 0xeb, 0x21, + 0xf7, 0xdb, 0x57, 0x78, 0xf4, 0xf8, 0x17, 0x4c, 0xb4, 0x6f, 0x71, 0xfd, 0xdc, 0x4b, + 0xe4, 0xd8, 0x70, 0x3e, 0xbf, 0xbc, 0xd2, 0xa7, 0x72, 0x89, 0xee, 0xfa, 0x72, 0x76, + 0x56, 0x74, 0xdb, 0xf0, 0xe0, 0x65, 0xff, 0xcb, 0xf6, 0xbb, 0xa0, 0x18, 0x09, 0x1e, + 0x49, 0xaa, 0x90, 0xe6, 0x02, 0xc8, + ], + ock: [ + 0x59, 0xf9, 0xcc, 0x26, 0x38, 0x4c, 0x6f, 0x73, 0xce, 0xa9, 0xb9, 0xe0, 0x94, 0x40, + 0xf8, 0xf0, 0x4c, 0x40, 0x25, 0xb5, 0x59, 0x04, 0x42, 0x3c, 0x35, 0x39, 0xc6, 0x6c, + 0x75, 0x11, 0x31, 0x23, + ], + op: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, + 0xef, 0x08, 0xbd, 0xf6, 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, + 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, + ], + c_out: [ + 0x21, 0xe3, 0xf8, 0x97, 0xe1, 0xb1, 0x36, 0xe1, 0x74, 0xd7, 0xae, 0x88, 0xd7, 0x85, + 0xa0, 0x61, 0xe6, 0x71, 0xef, 0xf1, 0x81, 0x98, 0x0a, 0x6f, 0xf5, 0x19, 0xb3, 0xbb, + 0x6b, 0xbd, 0xaf, 0xea, 0x9d, 0xf9, 0x92, 0xbc, 0xaa, 0xc0, 0x2b, 0xdb, 0xcd, 0x4d, + 0xb1, 0xc1, 0xd3, 0xf3, 0x2d, 0xef, 0xcd, 0xf7, 0xf4, 0xad, 0x54, 0x1b, 0x6b, 0xee, + 0xe8, 0x27, 0xdd, 0x43, 0x89, 0xb8, 0x57, 0xd1, 0x6d, 0xb8, 0x24, 0xe7, 0x72, 0xba, + 0x5a, 0xb5, 0xe2, 0x8d, 0xd6, 0xe9, 0x80, 0x82, 0x6b, 0xed, + ], + note_type: Some([ + 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, + 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, + 0xfd, 0x7d, 0x05, 0x8a, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0x8c, 0x45, 0x43, 0xe1, 0x1f, 0x9f, 0x30, 0x7e, 0xc9, 0x04, 0x31, 0x61, 0x29, 0x46, + 0xfb, 0x01, 0x81, 0xb3, 0x6e, 0x1b, 0x52, 0xdb, 0x43, 0x1e, 0x6d, 0xf9, 0x38, 0x8c, + 0xac, 0xd3, 0x08, 0xe8, 0x99, 0xd9, 0x3f, 0x70, 0xad, 0x2a, 0xea, 0xec, 0x99, 0x5e, + 0xcc, 0xe1, 0x80, 0x1c, 0x61, 0x56, 0xe2, 0x3e, 0xc4, 0x1b, 0x1a, 0xe1, 0xcd, 0x2f, + 0xd6, 0xe3, 0x9b, 0x69, 0x98, 0x2f, 0x46, 0x33, + ], + ovk: [ + 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, 0xda, 0x57, 0x96, 0xfa, 0xae, + 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, 0x09, 0x3e, 0x2c, 0x1f, 0x3a, + 0xe8, 0x55, 0xf6, 0x5a, + ], + default_d: [ + 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, + ], + default_pk_d: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, + ], + v: 3775288302605163507, + rseed: [ + 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, + 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, + 0x3e, 0xcd, 0xd7, 0x99, + ], + memo: [ + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x10, 0xb2, 0x33, 0xd2, 0x49, 0x94, 0x68, 0xe0, 0xb0, 0xdf, 0x47, 0x3d, 0x5a, 0x21, + 0xb9, 0x3f, 0x7d, 0x2b, 0x5d, 0x5f, 0x09, 0x95, 0xa9, 0x55, 0xd0, 0x86, 0x8a, 0x27, + 0x45, 0x3f, 0x96, 0x82, + ], + rho: [ + 0xea, 0x1d, 0x9d, 0x26, 0x5e, 0xf4, 0x8a, 0x18, 0x97, 0x89, 0x70, 0xb1, 0x76, 0x7b, + 0xe0, 0xe8, 0x14, 0x11, 0x94, 0x7e, 0x9e, 0x69, 0xb7, 0x19, 0xfa, 0xb7, 0x41, 0x72, + 0x1d, 0x40, 0x9b, 0x33, + ], + cmx: [ + 0x9e, 0x3d, 0x61, 0x35, 0x6b, 0x0d, 0x88, 0x95, 0x9e, 0x3f, 0x0f, 0xcc, 0x4a, 0x93, + 0x2e, 0x93, 0x2e, 0xac, 0xbc, 0x80, 0x1d, 0x48, 0xc0, 0x19, 0x5b, 0x9c, 0x8b, 0xd1, + 0x05, 0x5a, 0x8e, 0x2e, + ], + esk: [ + 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, 0xa9, 0x19, 0xa2, 0x06, + 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, 0x25, 0xec, 0xff, 0x47, + 0x72, 0x16, 0x8c, 0x05, + ], + ephemeral_key: [ + 0xc1, 0xce, 0x25, 0xfb, 0x89, 0xe5, 0xca, 0x89, 0x97, 0xf9, 0xb4, 0xbb, 0x0e, 0x1e, + 0xfb, 0xcc, 0x1a, 0x8c, 0xbf, 0x44, 0xec, 0xfd, 0x33, 0x2c, 0x6c, 0x5c, 0x17, 0x3b, + 0xb1, 0x1f, 0xb5, 0x87, + ], + shared_secret: [ + 0x2e, 0xe5, 0x69, 0xce, 0xb3, 0xfd, 0xb8, 0x67, 0xa5, 0xd8, 0x4c, 0x92, 0x68, 0x24, + 0xef, 0x54, 0x9f, 0x2d, 0xd2, 0x8f, 0x8b, 0x04, 0x8d, 0x67, 0xd0, 0x28, 0x81, 0x7d, + 0xbf, 0xf5, 0xd2, 0xb1, + ], + k_enc: [ + 0x41, 0x4d, 0x80, 0x67, 0xc9, 0xfe, 0xbd, 0x5e, 0xbc, 0xd9, 0xae, 0x8c, 0x05, 0x99, + 0x4e, 0x3b, 0x06, 0x85, 0xc8, 0x86, 0x6f, 0x88, 0x95, 0x94, 0xc3, 0x74, 0xb3, 0x75, + 0xac, 0x2c, 0x6d, 0x24, + ], + p_enc: [ + 0x03, 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, 0xf3, 0xdb, + 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, + 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, + 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0xa6, 0x33, 0x05, 0x44, + 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, 0xf6, 0x2e, + 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, 0x42, 0x68, 0x3c, + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, + ], + c_enc: [ + 0xbc, 0x8a, 0x16, 0xfd, 0x57, 0xbc, 0x03, 0x60, 0x59, 0xe5, 0x4d, 0xc2, 0xbc, 0xfa, + 0xad, 0x9c, 0xc1, 0xfa, 0xe8, 0xcb, 0x2b, 0xe2, 0xa0, 0xc8, 0x5e, 0x81, 0x6c, 0x67, + 0xfd, 0xcd, 0x0b, 0x93, 0xe6, 0xa1, 0xed, 0xc8, 0x3b, 0xfa, 0xc4, 0x1e, 0xb4, 0x19, + 0x1c, 0x56, 0x4b, 0xac, 0x58, 0x01, 0x62, 0x92, 0x2d, 0x88, 0x25, 0x30, 0x28, 0xeb, + 0x88, 0xed, 0x46, 0xbf, 0x24, 0x2d, 0x82, 0x28, 0x6c, 0xb0, 0xa5, 0x66, 0xce, 0x01, + 0x18, 0x09, 0x4c, 0x90, 0x8f, 0xc2, 0x68, 0xb3, 0x2b, 0xcb, 0xdc, 0x4c, 0x22, 0x82, + 0xc5, 0x24, 0x2a, 0x65, 0x15, 0x48, 0x8b, 0x83, 0x3d, 0x29, 0x8e, 0x49, 0xda, 0x33, + 0x3a, 0xdd, 0x96, 0xc9, 0x9b, 0x98, 0xac, 0x06, 0x7f, 0x21, 0x41, 0x28, 0x9a, 0xcd, + 0x89, 0x49, 0x64, 0xfc, 0xf8, 0x94, 0xc9, 0x26, 0xf1, 0x81, 0xb1, 0x19, 0x85, 0x68, + 0xb1, 0xdd, 0x6f, 0x5e, 0xd1, 0x22, 0xdc, 0x70, 0x44, 0xad, 0x96, 0x76, 0xa7, 0xc5, + 0xae, 0x8e, 0xa9, 0x0f, 0x64, 0xbc, 0x59, 0x09, 0x36, 0xe0, 0xdf, 0x53, 0x1c, 0x1b, + 0x94, 0xb7, 0x35, 0xcd, 0x7b, 0x18, 0x73, 0xc8, 0x51, 0x6f, 0xea, 0x83, 0x64, 0x91, + 0x40, 0xbc, 0xbb, 0x9b, 0x42, 0xea, 0x6c, 0xb7, 0xaf, 0x67, 0xdc, 0x2d, 0xdb, 0xb4, + 0x7a, 0xb2, 0x25, 0xe7, 0x98, 0x29, 0xcd, 0xaf, 0x77, 0x04, 0xfb, 0x56, 0x5b, 0x43, + 0x91, 0x76, 0xf3, 0x35, 0xe4, 0x2b, 0x64, 0xc1, 0x6d, 0xdf, 0xe0, 0x88, 0x45, 0x38, + 0xbf, 0x43, 0x33, 0xe3, 0x2c, 0xa1, 0xe6, 0x27, 0x41, 0xc3, 0xe7, 0x4c, 0x8f, 0xaa, + 0xde, 0x0d, 0x89, 0xfa, 0x10, 0x30, 0xcd, 0x8e, 0xfd, 0x20, 0x22, 0x3e, 0x41, 0xc3, + 0xfc, 0xca, 0xaa, 0xe7, 0x76, 0xe6, 0x8e, 0xe8, 0x40, 0x56, 0x6f, 0x4d, 0x13, 0xc1, + 0xc9, 0xd5, 0xcb, 0xbe, 0xcf, 0xa7, 0x49, 0x9d, 0x43, 0x12, 0x7c, 0xe8, 0xfd, 0x83, + 0xdb, 0x6e, 0x89, 0x67, 0x90, 0x32, 0x25, 0x24, 0x87, 0x21, 0x40, 0x0d, 0x5e, 0x3e, + 0xc0, 0xc1, 0x8e, 0x10, 0xf5, 0xe6, 0x6e, 0x10, 0x17, 0x0c, 0xb3, 0x74, 0x48, 0x22, + 0x4a, 0xde, 0x39, 0x9f, 0x1d, 0x74, 0xa2, 0x16, 0x7d, 0x9f, 0xdb, 0xfe, 0x36, 0xe1, + 0x28, 0xe4, 0x8c, 0x01, 0x62, 0x61, 0x16, 0xc1, 0xa2, 0xdf, 0x3c, 0xb0, 0x23, 0xd8, + 0x0a, 0xed, 0x9b, 0xfc, 0x02, 0x71, 0xb8, 0x1f, 0xf9, 0x79, 0x81, 0x01, 0x6f, 0xff, + 0x19, 0x61, 0x08, 0x88, 0x8b, 0xcb, 0xca, 0x84, 0x5b, 0x5d, 0x97, 0x1b, 0xd5, 0x4f, + 0x49, 0x7d, 0x3f, 0x3a, 0x09, 0x29, 0x9e, 0x56, 0x50, 0xd3, 0x26, 0xd8, 0x9b, 0x9a, + 0x5e, 0xff, 0x3e, 0xbd, 0x27, 0x39, 0x34, 0xc4, 0x9f, 0x81, 0x46, 0x7e, 0xb8, 0x4f, + 0x56, 0x98, 0x90, 0xcf, 0x89, 0x05, 0xb7, 0x4c, 0xd3, 0xed, 0xa6, 0x3c, 0x53, 0x88, + 0xd5, 0x51, 0x5e, 0x3f, 0xd8, 0x1c, 0x70, 0xc1, 0x5e, 0x2a, 0x98, 0x2d, 0x59, 0x0e, + 0x87, 0xb8, 0x64, 0x45, 0x4b, 0xcd, 0xf5, 0xf8, 0x4d, 0x9f, 0x11, 0xcb, 0x9c, 0xf2, + 0xb5, 0xde, 0x3c, 0x5e, 0x0e, 0x2a, 0x6c, 0x48, 0x16, 0x61, 0x64, 0x96, 0x6f, 0xb9, + 0x0d, 0xac, 0xf8, 0x67, 0x4f, 0x9f, 0x1a, 0x34, 0xd2, 0xcd, 0xc7, 0xc9, 0x48, 0xab, + 0x99, 0xc3, 0x58, 0xa1, 0x95, 0x47, 0x0a, 0xdd, 0x06, 0x5e, 0xaf, 0x79, 0x24, 0xfa, + 0xed, 0x63, 0x27, 0xa6, 0x10, 0xf5, 0x2e, 0xd5, 0xd3, 0xa8, 0x7e, 0x11, 0xb5, 0x97, + 0x4f, 0xa0, 0x60, 0x45, 0xa4, 0x08, 0x95, 0xcd, 0xad, 0x60, 0x1c, 0xae, 0x01, 0xed, + 0xda, 0x17, 0x52, 0x81, 0x62, 0xd7, 0x21, 0x24, 0xf2, 0x05, 0x6b, 0x9a, 0xb8, 0xc0, + 0xc0, 0xf5, 0xc6, 0xdd, 0xaa, 0x0f, 0x5e, 0x33, 0xfb, 0x04, 0x23, 0x0b, 0x61, 0x1b, + 0xff, 0xd8, 0xbd, 0xdc, 0x63, 0x4c, 0x79, 0x60, 0xa3, 0xd4, 0xe6, 0x8f, 0x21, 0xe7, + 0x83, 0x04, 0xe4, 0xc4, 0xd2, 0xdc, 0xd6, 0xa1, 0x9c, 0xfc, 0x04, 0x57, 0x97, 0x09, + 0xf0, 0x33, 0xf1, 0x95, 0x78, 0xae, 0x7f, 0x0b, 0xc6, 0x46, 0x32, 0xa6, 0xd7, 0xda, + 0x40, 0xdc, 0x0c, 0x38, 0x3b, 0xca, 0xa8, 0x68, 0x6a, 0xc8, 0x49, 0x3b, 0x2c, 0xb8, + 0xf1, 0xd7, 0xd3, 0x95, 0x8a, 0x54, + ], + ock: [ + 0xdb, 0x1e, 0xf1, 0x9a, 0xf6, 0xdd, 0x1b, 0x7b, 0xf0, 0x64, 0x89, 0xe7, 0xdb, 0x86, + 0xca, 0xae, 0x27, 0xf6, 0x70, 0x1e, 0x09, 0x16, 0x8c, 0x6e, 0x0d, 0x2b, 0x89, 0x78, + 0xdf, 0x14, 0xe0, 0x96, + ], + op: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, + 0xa9, 0x19, 0xa2, 0x06, 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, + 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, + ], + c_out: [ + 0x55, 0xdd, 0xba, 0xc4, 0x35, 0x64, 0x19, 0x54, 0xbd, 0xb1, 0xc9, 0x43, 0x4c, 0x36, + 0x79, 0x32, 0x19, 0x18, 0xbc, 0x1f, 0x29, 0x90, 0x7a, 0xc4, 0x24, 0x43, 0x55, 0x2d, + 0xfb, 0xe7, 0x05, 0xab, 0x26, 0x19, 0x1b, 0x4e, 0x2b, 0xae, 0xa4, 0xaa, 0xe0, 0x6d, + 0xa9, 0xf1, 0x38, 0x4e, 0x23, 0x7b, 0xee, 0xab, 0xb1, 0xa2, 0xd8, 0x22, 0x99, 0x5e, + 0xe7, 0xb9, 0x41, 0x0d, 0x6b, 0xe7, 0x59, 0x2a, 0xed, 0xa9, 0xf5, 0x2d, 0x56, 0xd8, + 0xc9, 0xf9, 0x3a, 0x0b, 0xe3, 0x8c, 0xfc, 0x8d, 0xc2, 0x94, + ], + note_type: Some([ + 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, + 0x5a, 0x31, 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, + 0xb4, 0x42, 0x68, 0x3c, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0x47, 0x30, 0x68, 0xbf, 0x68, 0xe5, 0x0b, 0xe3, 0x85, 0x7d, 0xec, 0xb2, 0xef, 0xd5, + 0xde, 0x20, 0xea, 0xc8, 0x1b, 0x37, 0x5b, 0xd0, 0xbb, 0xe8, 0x36, 0x86, 0x6e, 0x99, + 0x36, 0x3b, 0x37, 0x50, 0x9d, 0x53, 0x8f, 0xcc, 0xa9, 0x33, 0x37, 0xad, 0xbc, 0x24, + 0x81, 0xe2, 0x70, 0x26, 0x18, 0x4c, 0x3f, 0x4f, 0x48, 0xcc, 0x5d, 0x5a, 0x0e, 0x4a, + 0x4c, 0xfa, 0x4d, 0x6a, 0x24, 0x7f, 0x2e, 0x39, + ], + ovk: [ + 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, 0x66, 0x46, 0x61, 0x9a, 0xf0, 0x24, 0x56, + 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, + 0xd3, 0x33, 0xe1, 0x84, + ], + default_d: [ + 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, + ], + default_pk_d: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, + ], + v: 15119422206032203650, + rseed: [ + 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, + 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, + 0x2d, 0x9b, 0x4c, 0x8f, + ], + memo: [ + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x7e, 0xfd, 0xf4, 0x17, 0xcf, 0xd6, 0x44, 0x7d, 0x96, 0x58, 0x1d, 0xd1, 0x7b, 0x82, + 0x12, 0xee, 0x53, 0x7b, 0x13, 0x4b, 0x05, 0xa5, 0x58, 0x67, 0x4a, 0x39, 0xe6, 0x66, + 0x97, 0xe6, 0x3a, 0x29, + ], + rho: [ + 0x9a, 0xd0, 0x7f, 0x1c, 0x28, 0x7b, 0xdd, 0x53, 0x4f, 0x6f, 0x7e, 0xae, 0x08, 0xf7, + 0x85, 0x72, 0xa3, 0x05, 0xfa, 0x3b, 0x70, 0x68, 0xa3, 0x78, 0x38, 0x27, 0xaf, 0xe2, + 0x14, 0x7a, 0x27, 0x10, + ], + cmx: [ + 0xf2, 0x04, 0x22, 0x51, 0xa0, 0x59, 0xa2, 0xf5, 0x8a, 0xb8, 0xe9, 0x0b, 0x52, 0x64, + 0xd0, 0xa4, 0x3f, 0x96, 0xd7, 0x7e, 0xdd, 0x54, 0xf8, 0x0f, 0xf4, 0x9d, 0x43, 0x86, + 0x81, 0x4d, 0x73, 0x2e, + ], + esk: [ + 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, 0x1d, 0xa4, 0xb1, 0x44, + 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, 0xaf, 0x2b, 0xd1, 0xa0, + 0x8c, 0x67, 0xd9, 0x3f, + ], + ephemeral_key: [ + 0x46, 0x73, 0x1f, 0xff, 0xc5, 0x9a, 0xf4, 0xc1, 0x28, 0x82, 0xbc, 0xca, 0xea, 0xa7, + 0xb8, 0xed, 0x39, 0x0b, 0x14, 0x66, 0x72, 0xe1, 0x36, 0x51, 0xc3, 0x2e, 0x57, 0x80, + 0x62, 0x68, 0x65, 0xa7, + ], + shared_secret: [ + 0x9d, 0x56, 0xbd, 0x96, 0x00, 0x39, 0x62, 0x5e, 0x11, 0x7d, 0x7b, 0xfe, 0xd4, 0x3a, + 0x57, 0x3b, 0x11, 0x51, 0x7f, 0xfa, 0x76, 0x14, 0xea, 0x2d, 0xa7, 0x7e, 0xdf, 0x62, + 0x7f, 0x6f, 0x13, 0xaa, + ], + k_enc: [ + 0x04, 0x2f, 0x92, 0x82, 0x13, 0x44, 0xde, 0x97, 0x7c, 0xee, 0x89, 0x9e, 0xd2, 0x1b, + 0xc8, 0x48, 0xf5, 0xc4, 0xfe, 0xdc, 0x39, 0xf2, 0xdf, 0xed, 0xad, 0x62, 0xcc, 0x7a, + 0x92, 0x7f, 0x74, 0xfd, + ], + p_enc: [ + 0x03, 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, 0x82, 0xcf, + 0xb3, 0xe7, 0x63, 0xfa, 0xd2, 0xd1, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, + 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, + 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0x61, 0x16, 0xcf, 0xec, + 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, + 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, + ], + c_enc: [ + 0x16, 0x76, 0x72, 0x3a, 0x18, 0xff, 0x58, 0x77, 0x70, 0x15, 0x8d, 0x6b, 0x85, 0x09, + 0x3c, 0x49, 0x20, 0x16, 0xf8, 0x7e, 0xc3, 0xfa, 0xe8, 0xb0, 0xb4, 0x7c, 0xd9, 0x29, + 0x8f, 0xa2, 0x07, 0xc4, 0xb6, 0x09, 0xc6, 0x92, 0xdd, 0xb9, 0x10, 0x19, 0x72, 0xc9, + 0x4c, 0x71, 0x87, 0x84, 0x85, 0x42, 0x1e, 0xfb, 0x70, 0x1c, 0xf5, 0x15, 0xa2, 0x3f, + 0xbf, 0x36, 0xfe, 0x93, 0x54, 0x0d, 0x82, 0xd6, 0x9a, 0x72, 0x62, 0x4e, 0x25, 0x4f, + 0xe3, 0xa0, 0x11, 0xc5, 0xdb, 0xdb, 0xd2, 0xbd, 0xff, 0xb8, 0x83, 0x8a, 0xf3, 0x7d, + 0x03, 0xce, 0x69, 0x12, 0x6b, 0x2f, 0x68, 0x21, 0x25, 0xb7, 0xa9, 0xb2, 0xa3, 0xee, + 0x11, 0x8a, 0xe5, 0xad, 0xb4, 0x60, 0xa4, 0x68, 0x7c, 0x24, 0x30, 0x18, 0x7b, 0xfd, + 0x0f, 0x6c, 0x2a, 0x3d, 0x5d, 0x74, 0x30, 0x1c, 0xbd, 0x8f, 0xd0, 0x26, 0xc8, 0x64, + 0x4f, 0xbf, 0xa2, 0x65, 0x69, 0x88, 0xe9, 0x58, 0x59, 0x0b, 0x81, 0x6a, 0x1e, 0x64, + 0x0e, 0x46, 0x71, 0x0e, 0x46, 0xfa, 0x15, 0x94, 0xff, 0x2a, 0x61, 0xd6, 0xf6, 0xe7, + 0xb4, 0xa9, 0xf6, 0xe0, 0xde, 0x68, 0x3d, 0x95, 0xe5, 0x9d, 0x43, 0x57, 0xf7, 0x9a, + 0xc4, 0x93, 0x86, 0x6d, 0xab, 0x06, 0x57, 0x76, 0xc0, 0xb1, 0x43, 0x6b, 0x8e, 0x04, + 0x47, 0x68, 0x43, 0xc2, 0x8b, 0x48, 0x45, 0xea, 0xff, 0x17, 0x83, 0xa8, 0x50, 0xc2, + 0x4a, 0x90, 0x65, 0xc3, 0x36, 0x51, 0xc4, 0xb3, 0xdd, 0x19, 0x92, 0xf4, 0xf2, 0x08, + 0xb8, 0x51, 0xbf, 0xff, 0xe9, 0xb7, 0xbb, 0x7a, 0xad, 0x76, 0x7c, 0x23, 0x60, 0xb0, + 0x5c, 0x11, 0x23, 0x09, 0x66, 0xda, 0x55, 0x7e, 0x31, 0x3a, 0xe6, 0x1c, 0x95, 0x42, + 0x97, 0x66, 0x10, 0x6b, 0x4b, 0x1b, 0x35, 0x47, 0x64, 0xe4, 0xe1, 0xe4, 0xdf, 0x90, + 0xc1, 0x2d, 0x24, 0x37, 0x9d, 0x67, 0xba, 0xc6, 0x66, 0x97, 0xaf, 0x23, 0x44, 0x97, + 0xf2, 0xd6, 0xf9, 0xa6, 0x12, 0x85, 0x0d, 0xd7, 0x1d, 0x1c, 0x98, 0xce, 0x65, 0xd8, + 0x50, 0x7f, 0xa3, 0x46, 0x35, 0x83, 0x12, 0x39, 0xe2, 0x10, 0xf7, 0xdb, 0xb3, 0x05, + 0x04, 0x2d, 0x47, 0x50, 0xd9, 0x5a, 0xdf, 0xff, 0xc9, 0x8d, 0xeb, 0x0f, 0x17, 0x13, + 0xbc, 0x01, 0xaf, 0x5d, 0xb5, 0x99, 0x29, 0x89, 0x76, 0xab, 0xba, 0xdb, 0x0f, 0x4d, + 0xed, 0x1a, 0x2f, 0xe4, 0xcf, 0x90, 0x60, 0x0e, 0x0d, 0x28, 0xd3, 0x07, 0xc6, 0x41, + 0xf7, 0x52, 0x3c, 0x16, 0x66, 0x40, 0x1d, 0x78, 0x6f, 0xd2, 0x4a, 0xe1, 0x68, 0x0f, + 0xe9, 0x26, 0x70, 0x4c, 0xb6, 0xe2, 0xaf, 0x80, 0x1a, 0x0d, 0x82, 0x75, 0x9d, 0xd8, + 0x7a, 0x8c, 0xd8, 0x7b, 0x85, 0xbb, 0x07, 0x51, 0xa7, 0x08, 0xc9, 0xf4, 0xa7, 0xd3, + 0x24, 0xe5, 0xc9, 0x3a, 0xd2, 0x2b, 0x86, 0x43, 0xdf, 0xfa, 0x5f, 0x50, 0x79, 0xfc, + 0x6f, 0x01, 0x6d, 0x94, 0x3c, 0x99, 0x09, 0x27, 0x5c, 0x96, 0xf5, 0xfe, 0x7b, 0x56, + 0x33, 0x3c, 0x24, 0x01, 0x99, 0x73, 0xd9, 0x4f, 0x06, 0xeb, 0xf6, 0xc0, 0xf6, 0xef, + 0xdd, 0x42, 0xea, 0xb0, 0x63, 0x49, 0xd5, 0xe8, 0xb9, 0x60, 0xba, 0x8c, 0x68, 0xee, + 0xfd, 0x44, 0x49, 0x99, 0xf6, 0xfa, 0x3d, 0x6a, 0x3a, 0xe3, 0x1a, 0xe8, 0x54, 0x6e, + 0xdc, 0x62, 0x78, 0x25, 0x63, 0x7e, 0x1e, 0x86, 0x39, 0x8d, 0x0e, 0xd3, 0xd8, 0x8b, + 0xfa, 0xea, 0x8b, 0x4b, 0x08, 0x50, 0xd8, 0xa8, 0x28, 0x6e, 0xa9, 0xf3, 0xd1, 0x3f, + 0xa8, 0xf4, 0x16, 0x53, 0x45, 0x1b, 0x97, 0xb3, 0x8b, 0x06, 0x3a, 0x5f, 0xc6, 0xdb, + 0xe4, 0xe9, 0x19, 0x94, 0x87, 0xc9, 0x73, 0xef, 0x8f, 0x2c, 0x26, 0x3f, 0x85, 0x05, + 0xf4, 0xc3, 0xbe, 0xc9, 0xd1, 0x79, 0xbb, 0xd6, 0x5d, 0x1e, 0xdc, 0x58, 0x95, 0xa1, + 0x6c, 0xc7, 0x98, 0x6b, 0xcf, 0xc4, 0xba, 0xe8, 0x7e, 0xc0, 0xb2, 0x9b, 0xf1, 0xb3, + 0x97, 0x61, 0x5c, 0x95, 0x13, 0xfa, 0x52, 0xeb, 0xe1, 0xe9, 0xfc, 0xfb, 0xf1, 0x92, + 0xed, 0x49, 0x26, 0x27, 0x27, 0xa0, 0x8a, 0xd3, 0xc2, 0x95, 0x5b, 0x3d, 0xf2, 0xee, + 0xad, 0x30, 0x24, 0x3e, 0x06, 0x66, 0xf2, 0x3c, 0x7f, 0x97, 0xe7, 0x84, 0xbe, 0x68, + 0xcc, 0x22, 0xca, 0x1d, 0x09, 0xd5, + ], + ock: [ + 0xcf, 0x22, 0xd2, 0x83, 0x95, 0x98, 0x5d, 0x31, 0x6a, 0xf9, 0x50, 0x19, 0x21, 0xba, + 0xc1, 0x52, 0x57, 0x11, 0xbb, 0x3f, 0x3c, 0xc3, 0xc3, 0xc2, 0x82, 0xa3, 0xd1, 0x8e, + 0x43, 0xd4, 0x78, 0x05, + ], + op: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, + 0x1d, 0xa4, 0xb1, 0x44, 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, + 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, + ], + c_out: [ + 0x7a, 0xe6, 0x91, 0xd9, 0xbc, 0xd5, 0x38, 0x42, 0x7b, 0x4f, 0x07, 0xe2, 0x38, 0x81, + 0x94, 0x18, 0xbb, 0xb8, 0x18, 0x31, 0x88, 0x89, 0x93, 0x08, 0xfd, 0x6a, 0xab, 0x2b, + 0xf4, 0xf0, 0x69, 0x9c, 0xc5, 0x61, 0x9c, 0x8d, 0x4f, 0xc9, 0x95, 0xc2, 0x11, 0x76, + 0xbf, 0xea, 0x13, 0xee, 0x04, 0x03, 0xc0, 0xce, 0x57, 0x4f, 0xc8, 0xfa, 0x16, 0x81, + 0xb3, 0x76, 0xcf, 0x33, 0xc9, 0xff, 0x27, 0xa5, 0xaa, 0x01, 0x58, 0x24, 0xe6, 0x78, + 0x6e, 0x16, 0xe3, 0x7b, 0x35, 0x5c, 0xf7, 0x54, 0x52, 0xdb, + ], + note_type: Some([ + 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, + 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, + 0x38, 0xe1, 0x73, 0x29, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0xfc, 0x8c, 0x64, 0x1c, 0x0b, 0x28, 0xbe, 0xbf, 0x85, 0x24, 0x25, 0xae, 0x95, 0x5f, + 0xe6, 0x40, 0x1c, 0xfd, 0x9e, 0x60, 0x63, 0xf2, 0x50, 0x11, 0x3d, 0xa0, 0xb5, 0x8b, + 0x2a, 0x0f, 0x49, 0xb9, 0x12, 0x0b, 0x89, 0x9f, 0x08, 0x10, 0x6b, 0x30, 0x86, 0xb2, + 0xf4, 0x11, 0x63, 0x6f, 0x50, 0xab, 0x48, 0x7c, 0xfb, 0x28, 0x81, 0x89, 0x77, 0x8f, + 0xe4, 0xe5, 0xa1, 0x91, 0x8b, 0x98, 0xd5, 0x0a, + ], + ovk: [ + 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, 0x17, 0xdb, 0xbc, + 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, 0x27, 0x00, 0x2c, + 0xe2, 0x1c, 0x02, 0x14, + ], + default_d: [ + 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, + ], + default_pk_d: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, + ], + v: 7555450289479839818, + rseed: [ + 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, + 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, + 0x03, 0xaa, 0xe0, 0x4b, + ], + memo: [ + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0xf5, 0xc1, 0xcf, 0xbc, 0xb9, 0x2d, 0x34, 0xe4, 0x66, 0x1d, 0x58, 0x25, 0x42, 0xf7, + 0x0d, 0x05, 0x99, 0x09, 0x15, 0x20, 0xfe, 0x2a, 0xfa, 0xd8, 0xe8, 0x75, 0xca, 0x3b, + 0xcc, 0x70, 0x8a, 0x11, + ], + rho: [ + 0x31, 0x70, 0x5e, 0xfb, 0xf8, 0x0c, 0x7a, 0x7a, 0xb7, 0x81, 0xdf, 0x53, 0x77, 0xf8, + 0x4d, 0x4b, 0x32, 0x36, 0xdb, 0x1f, 0x32, 0xac, 0xa7, 0x94, 0x5c, 0xf2, 0x6e, 0xc8, + 0xb9, 0xd0, 0xb7, 0x32, + ], + cmx: [ + 0xe1, 0xc7, 0x67, 0xf3, 0x30, 0x15, 0xb5, 0xe2, 0x4a, 0x9a, 0xa5, 0x8b, 0x64, 0x7b, + 0x6b, 0x61, 0x32, 0x3c, 0xd3, 0x47, 0xe7, 0x21, 0x4c, 0x29, 0x1d, 0x09, 0x95, 0xc0, + 0xf5, 0xa6, 0x93, 0x2f, + ], + esk: [ + 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, 0x58, 0x93, 0x20, 0x26, + 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, 0x44, 0x72, 0x83, 0xf9, + 0x4e, 0xd5, 0x95, 0x3d, + ], + ephemeral_key: [ + 0xce, 0x67, 0x94, 0x31, 0x5f, 0x46, 0x2d, 0xed, 0xf3, 0xc5, 0x77, 0x4a, 0xac, 0x7f, + 0x3c, 0x7b, 0x70, 0xba, 0x7d, 0x72, 0x43, 0xbb, 0x0c, 0xc3, 0xb0, 0x67, 0xdc, 0x28, + 0x38, 0xf1, 0x11, 0xa3, + ], + shared_secret: [ + 0xea, 0x22, 0x6b, 0x69, 0xec, 0x2d, 0x9f, 0xcf, 0x91, 0x9c, 0xe5, 0x70, 0x06, 0x09, + 0x89, 0x94, 0xf7, 0x14, 0xb3, 0x9c, 0x34, 0x61, 0x52, 0xbc, 0x11, 0x51, 0xa0, 0xc6, + 0x9e, 0xe0, 0x04, 0x06, + ], + k_enc: [ + 0xb4, 0x56, 0x1b, 0xdb, 0xe0, 0xea, 0x44, 0x20, 0x75, 0xe7, 0xe6, 0x6f, 0xb3, 0xc0, + 0xfa, 0xd3, 0xaf, 0xc2, 0x85, 0x6e, 0xf4, 0xf3, 0x61, 0xb4, 0xac, 0x33, 0xaa, 0xe0, + 0x15, 0x52, 0xfd, 0x49, + ], + p_enc: [ + 0x03, 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, 0x4a, 0x70, + 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, + 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, + 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, 0x03, 0xaa, 0xe0, 0x4b, 0x29, 0x8a, 0xc0, 0xaf, + 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, + 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, + ], + c_enc: [ + 0x59, 0x9a, 0x4d, 0x9f, 0x53, 0x3c, 0x46, 0xa9, 0x6f, 0x92, 0xaf, 0x8c, 0x08, 0xae, + 0x59, 0x71, 0x10, 0x23, 0x0e, 0xb8, 0x41, 0xc2, 0xf7, 0xc9, 0xd4, 0xf1, 0x45, 0x87, + 0x76, 0x36, 0xc8, 0x9d, 0xd8, 0xf3, 0x84, 0xa9, 0x40, 0xdc, 0x89, 0x72, 0x55, 0x53, + 0x57, 0xbc, 0x07, 0x48, 0x2a, 0x0a, 0x32, 0x3d, 0x87, 0xae, 0x10, 0xeb, 0x99, 0x82, + 0x5a, 0xe4, 0xe0, 0x06, 0x0e, 0x25, 0x6c, 0x3c, 0x3b, 0xeb, 0xa3, 0x2f, 0xa2, 0xb2, + 0xd2, 0x7f, 0x04, 0x6f, 0x7a, 0x93, 0x6d, 0xf8, 0xa9, 0x61, 0xc8, 0x18, 0x4e, 0xe3, + 0xc6, 0x8e, 0xbc, 0xe9, 0x80, 0x64, 0x45, 0xb4, 0x3e, 0x66, 0x67, 0x19, 0x95, 0xa2, + 0x43, 0x7a, 0x7f, 0x70, 0x91, 0x47, 0x14, 0x8a, 0x76, 0x03, 0x6d, 0x25, 0x5e, 0xba, + 0xc4, 0xd0, 0xd8, 0x34, 0x82, 0x93, 0x23, 0x9a, 0x78, 0x64, 0xe7, 0x9b, 0xef, 0xf7, + 0x6f, 0x61, 0x50, 0xe0, 0xc4, 0xf4, 0x7a, 0x85, 0x26, 0xe3, 0xed, 0x06, 0x75, 0xfa, + 0xc6, 0xac, 0xcc, 0x30, 0xa4, 0xd6, 0x73, 0xca, 0x80, 0x85, 0x95, 0x96, 0xfe, 0xc9, + 0xcd, 0x6a, 0x93, 0xfb, 0xa0, 0xe8, 0x9e, 0xf5, 0x3f, 0x3e, 0x26, 0x74, 0xd3, 0x2a, + 0x4b, 0x43, 0xf9, 0xa4, 0x38, 0x7d, 0xce, 0x33, 0xac, 0xa1, 0xe4, 0xff, 0xdc, 0x6d, + 0x2d, 0x31, 0x89, 0xc6, 0x23, 0xca, 0x56, 0x4d, 0x03, 0xac, 0x5b, 0x35, 0xb1, 0xa7, + 0x47, 0xff, 0x44, 0x6b, 0xc2, 0x5e, 0xd2, 0x2d, 0x09, 0x68, 0x2c, 0xef, 0x3a, 0x30, + 0xff, 0xa5, 0xc4, 0x0e, 0x27, 0x70, 0xf1, 0x84, 0x98, 0xb1, 0x2f, 0x86, 0x8b, 0xa9, + 0x2a, 0x13, 0xaa, 0x4f, 0xa2, 0x14, 0xb0, 0x62, 0xe3, 0x64, 0x9c, 0xf9, 0xc8, 0x5e, + 0x7a, 0x8a, 0x55, 0xf5, 0xf3, 0xdd, 0x68, 0x84, 0x2a, 0xea, 0x7c, 0x92, 0x79, 0x2a, + 0x52, 0x60, 0x0f, 0x86, 0x6c, 0x34, 0xa1, 0x0c, 0x51, 0x14, 0x13, 0x62, 0x02, 0x24, + 0xfb, 0x85, 0xaf, 0xc6, 0x06, 0xdd, 0x4f, 0x7b, 0x2f, 0x76, 0xbe, 0x76, 0x0c, 0xa1, + 0x94, 0xb6, 0xd4, 0x88, 0x2e, 0x5a, 0x4a, 0x76, 0x3d, 0x75, 0x0d, 0xb7, 0xe1, 0x68, + 0xa4, 0x18, 0x11, 0x92, 0x35, 0xda, 0xf9, 0xcb, 0x1b, 0xdb, 0x07, 0xff, 0x46, 0x83, + 0x3a, 0x87, 0xa3, 0x92, 0x6b, 0x14, 0xa5, 0x26, 0x4f, 0x10, 0x4f, 0x7f, 0x89, 0xf7, + 0x6f, 0x10, 0x10, 0x8f, 0x2b, 0x6e, 0xa5, 0x05, 0xd4, 0xf0, 0xd2, 0x6d, 0x58, 0x31, + 0x1c, 0xc7, 0x21, 0x9c, 0x6b, 0xc4, 0x38, 0xd0, 0xe1, 0xb3, 0x17, 0x60, 0x18, 0x73, + 0x9e, 0x6f, 0x75, 0xd0, 0x73, 0x59, 0xf5, 0xe8, 0x95, 0x7e, 0x12, 0xc3, 0x03, 0xaa, + 0x52, 0x9b, 0x11, 0xa1, 0x81, 0x66, 0x25, 0xa1, 0x20, 0xf3, 0x6d, 0xcd, 0xdd, 0xff, + 0x9c, 0x65, 0xbc, 0xac, 0x8f, 0x10, 0x67, 0xc7, 0xfe, 0x88, 0xf6, 0x44, 0x85, 0x94, + 0xcf, 0x1d, 0xff, 0x8e, 0x29, 0x00, 0xae, 0x84, 0xd2, 0xa7, 0xc8, 0x1b, 0x90, 0x6d, + 0xd0, 0xbc, 0x86, 0x96, 0xe3, 0x70, 0x98, 0x07, 0x4b, 0x75, 0xd8, 0x38, 0xd8, 0xab, + 0xdc, 0x90, 0x46, 0x08, 0x2b, 0xe4, 0xa6, 0x09, 0x95, 0xc4, 0xf4, 0xed, 0x80, 0xe2, + 0xd7, 0x87, 0x38, 0x25, 0x77, 0x3b, 0xa6, 0x3e, 0xe4, 0xcb, 0x97, 0x36, 0x9a, 0x50, + 0x70, 0xb5, 0x72, 0x5c, 0x5f, 0xeb, 0x32, 0x62, 0x45, 0x87, 0x80, 0x1e, 0x5a, 0xc0, + 0x30, 0xe6, 0x45, 0xbd, 0xf2, 0xe5, 0x86, 0xcf, 0x98, 0x66, 0xea, 0xfb, 0x76, 0xf5, + 0x59, 0x76, 0xa3, 0x3d, 0x62, 0xae, 0xdc, 0x76, 0x27, 0x78, 0x3b, 0x48, 0x48, 0x93, + 0x61, 0xf9, 0x9c, 0xae, 0xb1, 0xb1, 0x9c, 0x55, 0x22, 0x58, 0x9f, 0xd2, 0x1d, 0x51, + 0x45, 0x49, 0xd7, 0x4a, 0xb1, 0x92, 0x25, 0xed, 0x6e, 0x4c, 0x20, 0x3a, 0xdd, 0xfa, + 0x55, 0xfc, 0x9e, 0xc9, 0x89, 0xb6, 0x69, 0x02, 0x3c, 0xf3, 0x05, 0xb4, 0x2b, 0x33, + 0x0f, 0xc2, 0x30, 0x80, 0xab, 0xe4, 0x25, 0x01, 0xe5, 0x9c, 0x85, 0x1c, 0x54, 0xc7, + 0x49, 0x66, 0xf6, 0x0b, 0xe9, 0xdc, 0x56, 0x1a, 0x2d, 0x91, 0xf5, 0xd3, 0x2a, 0xdd, + 0x19, 0xb8, 0x9a, 0xca, 0x7a, 0x73, 0x85, 0x39, 0x59, 0x33, 0x48, 0x6f, 0xab, 0x00, + 0xcc, 0x53, 0x03, 0xc5, 0xf3, 0xf0, + ], + ock: [ + 0xe3, 0xf2, 0x74, 0x2e, 0xa1, 0x97, 0x55, 0xa7, 0x99, 0x73, 0x1a, 0xcf, 0xe9, 0x98, + 0x86, 0xfb, 0x9f, 0xbb, 0x80, 0x48, 0xb5, 0x3a, 0x77, 0x72, 0xa2, 0x80, 0xd8, 0x17, + 0x19, 0xff, 0xfd, 0x28, + ], + op: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, + 0x58, 0x93, 0x20, 0x26, 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, + 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, + ], + c_out: [ + 0x92, 0xe7, 0x7c, 0x9b, 0x69, 0x92, 0xee, 0x85, 0x06, 0x30, 0x6a, 0x96, 0xc8, 0xa5, + 0x1c, 0xc9, 0xa8, 0x96, 0x18, 0xc6, 0x36, 0x6f, 0xce, 0x78, 0xb2, 0x9a, 0xdb, 0x10, + 0x9b, 0x4a, 0x3b, 0x17, 0x48, 0x49, 0x13, 0x4f, 0x7a, 0xa2, 0x9c, 0x79, 0x1b, 0x91, + 0x5f, 0xd7, 0x5a, 0x6f, 0xfc, 0x57, 0x42, 0x78, 0xef, 0x50, 0x2b, 0x84, 0x02, 0x46, + 0x9a, 0xb5, 0xa7, 0xce, 0x77, 0x2b, 0x52, 0x2c, 0x4b, 0xaa, 0x12, 0x95, 0xd8, 0x8f, + 0x15, 0xdc, 0x75, 0x1d, 0xdf, 0x7d, 0x20, 0x8d, 0xd5, 0x17, + ], + note_type: Some([ + 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, + 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, + 0x82, 0x1a, 0x41, 0x84, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0x53, 0x3d, 0xc3, 0xd4, 0x93, 0xf2, 0xb8, 0x7a, 0x03, 0x3d, 0xf5, 0x07, 0x05, 0xf2, + 0x90, 0x54, 0x16, 0x38, 0xe9, 0x08, 0x7d, 0xcd, 0xbc, 0xfe, 0x52, 0x7e, 0x77, 0x5a, + 0xaf, 0x09, 0x30, 0x29, 0xac, 0xec, 0x74, 0xdd, 0xe6, 0x02, 0xfc, 0x7c, 0x73, 0xcb, + 0x38, 0x50, 0xbd, 0xfb, 0xf2, 0x61, 0x79, 0x4c, 0x9c, 0x29, 0x9d, 0x0b, 0x98, 0xee, + 0x0f, 0x20, 0x71, 0xd6, 0xd4, 0xe3, 0x7b, 0x05, + ], + ovk: [ + 0x32, 0x4d, 0xce, 0x2a, 0x1e, 0xa1, 0xe4, 0x30, 0x4f, 0x49, 0xe4, 0x3a, 0xe0, 0x65, + 0xe3, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, 0xd1, + 0x8d, 0xea, 0x5f, 0xb6, + ], + default_d: [ + 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, + ], + default_pk_d: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, + ], + v: 12711846894898776584, + rseed: [ + 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, + 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, + 0xad, 0xe8, 0x24, 0xf3, + ], + memo: [ + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x65, 0x73, 0x3c, 0x9d, 0x97, 0xea, 0x82, 0xf6, 0xde, 0xf3, 0xde, 0x1f, 0xe8, 0x7e, + 0x12, 0x37, 0x6a, 0x92, 0x49, 0xdc, 0x86, 0x14, 0x67, 0x2d, 0x5e, 0xda, 0x15, 0xf3, + 0xca, 0xf4, 0x5b, 0x8c, + ], + rho: [ + 0x56, 0xbc, 0x48, 0x21, 0xa5, 0x3d, 0x5e, 0x9e, 0x6d, 0x7a, 0x04, 0x44, 0x44, 0x45, + 0x4f, 0xfb, 0xc2, 0x36, 0x9c, 0xb1, 0x48, 0xeb, 0x76, 0xf1, 0xed, 0xf1, 0xb5, 0xc7, + 0x41, 0x84, 0x28, 0x2a, + ], + cmx: [ + 0xd7, 0x60, 0xac, 0xdb, 0xca, 0xda, 0xd1, 0x88, 0x08, 0x4f, 0xe4, 0x1a, 0x5c, 0x03, + 0xc2, 0xc8, 0xce, 0x34, 0xe1, 0x5f, 0x9d, 0xf4, 0x7b, 0x86, 0x9c, 0x44, 0xc7, 0x21, + 0x13, 0xa4, 0x0c, 0x3d, + ], + esk: [ + 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, 0xdf, 0x7c, 0xe2, 0xd2, + 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, 0x86, 0x48, 0x56, 0x2c, + 0xbd, 0x86, 0x3f, 0x09, + ], + ephemeral_key: [ + 0x5a, 0x48, 0x58, 0x15, 0xc4, 0xa7, 0x47, 0x06, 0xe9, 0xde, 0x87, 0xfa, 0x60, 0xa2, + 0x81, 0x6f, 0x89, 0x0b, 0xe3, 0xdb, 0x54, 0xeb, 0x3f, 0x4b, 0xaf, 0x37, 0xdb, 0xc9, + 0xbd, 0xe5, 0xfe, 0x9d, + ], + shared_secret: [ + 0x96, 0x8d, 0xf2, 0xe8, 0x5d, 0x7b, 0xd1, 0x08, 0xf5, 0x72, 0x12, 0x53, 0x93, 0x76, + 0xaf, 0x25, 0x83, 0x2e, 0xf4, 0xdb, 0xd6, 0x40, 0x2a, 0x41, 0x4d, 0x73, 0xc5, 0x6b, + 0xee, 0xe4, 0xf2, 0xa8, + ], + k_enc: [ + 0xf7, 0x73, 0x91, 0x24, 0x3f, 0xdb, 0x35, 0xb2, 0x26, 0x94, 0xdb, 0x91, 0xde, 0xbd, + 0x78, 0x55, 0x79, 0x3c, 0xa7, 0x1e, 0x82, 0xbd, 0xc2, 0xee, 0x74, 0xc9, 0xb7, 0xb6, + 0x97, 0xc0, 0x24, 0x71, + ], + p_enc: [ + 0x03, 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, 0x08, 0x0a, + 0x98, 0x91, 0x66, 0x8d, 0x69, 0xb0, 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, + 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, + 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0xf9, 0x78, 0x1e, 0xbe, + 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, + 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, + ], + c_enc: [ + 0xf9, 0x09, 0x97, 0x73, 0x8b, 0x14, 0xd8, 0xa8, 0x4e, 0x32, 0x74, 0xbb, 0x70, 0x76, + 0x31, 0x15, 0xb7, 0x2e, 0x0a, 0x3d, 0xde, 0x8e, 0xa4, 0x70, 0x91, 0x1f, 0xb4, 0x58, + 0x70, 0xb0, 0x14, 0x8e, 0x7d, 0x37, 0x2b, 0xf2, 0x26, 0x8b, 0x3e, 0xe8, 0xda, 0xe5, + 0xfd, 0xe5, 0xea, 0x9b, 0x61, 0x59, 0x8e, 0xf1, 0x1b, 0x73, 0x14, 0x4f, 0x75, 0x53, + 0xb2, 0x13, 0xa0, 0x4c, 0x85, 0xf2, 0x5c, 0x54, 0x6c, 0x8a, 0x38, 0xa6, 0x0e, 0x50, + 0x86, 0x08, 0xb9, 0xca, 0x59, 0x3b, 0x94, 0xd8, 0x68, 0x8d, 0x6e, 0xff, 0xa5, 0x36, + 0x04, 0xd4, 0xdb, 0xc0, 0xf3, 0x45, 0x03, 0xaa, 0xe4, 0x6f, 0x3c, 0x8a, 0x8d, 0x2e, + 0x46, 0xa8, 0x1f, 0x09, 0x12, 0x6c, 0x45, 0x36, 0xfd, 0x02, 0x58, 0xf5, 0x97, 0x40, + 0xad, 0x0d, 0xb8, 0x02, 0xcc, 0x02, 0x42, 0x53, 0x4d, 0xdf, 0x52, 0xa6, 0xbf, 0x6a, + 0x03, 0x4d, 0xe6, 0x26, 0xf0, 0x18, 0x84, 0x4a, 0xdc, 0xb2, 0x6d, 0xcd, 0xc2, 0x85, + 0x16, 0x37, 0x16, 0xdd, 0x54, 0x65, 0x1c, 0x88, 0x73, 0x53, 0xf1, 0xff, 0xef, 0xa0, + 0x37, 0x71, 0x2a, 0xc0, 0xdf, 0x3a, 0x92, 0x98, 0x19, 0x06, 0x87, 0x54, 0x9d, 0x79, + 0xc6, 0xa3, 0x60, 0x0c, 0xc1, 0xc7, 0x29, 0xa3, 0x93, 0xd4, 0x4f, 0xec, 0xe5, 0x7f, + 0xd4, 0xcb, 0x0c, 0x0f, 0xb0, 0xc7, 0x86, 0x1b, 0x92, 0x5b, 0x94, 0xcd, 0x6a, 0x26, + 0x90, 0xf0, 0x02, 0xc4, 0x3a, 0x16, 0x6e, 0x56, 0x77, 0x72, 0x9f, 0x35, 0x52, 0xae, + 0xe0, 0xf2, 0xc1, 0x95, 0xaa, 0x91, 0xb2, 0xdd, 0xe3, 0x65, 0xdd, 0x14, 0xf2, 0xf0, + 0x7b, 0x3c, 0x38, 0x34, 0x7f, 0x6c, 0x0d, 0xab, 0x82, 0x84, 0x1e, 0xba, 0xde, 0x1e, + 0xf8, 0x13, 0xf2, 0xcd, 0x88, 0x5b, 0x57, 0x84, 0x37, 0x44, 0x45, 0x24, 0x93, 0x6a, + 0x65, 0x46, 0xc4, 0x55, 0xd6, 0xc9, 0x2e, 0x6d, 0x3d, 0xc5, 0x38, 0xb6, 0xcd, 0x9f, + 0x6d, 0x4c, 0xc0, 0xd7, 0x4d, 0x7b, 0xc2, 0x46, 0x7e, 0x21, 0x5b, 0xe8, 0xc3, 0xd4, + 0xff, 0x91, 0x8a, 0x2d, 0x98, 0x71, 0x00, 0xff, 0x34, 0x02, 0x4c, 0x88, 0x62, 0x79, + 0xd6, 0x4c, 0xaf, 0xdf, 0xd9, 0x0f, 0x1c, 0x04, 0xc4, 0x6b, 0xc9, 0xd5, 0xe9, 0xe2, + 0xaf, 0xd0, 0x3a, 0xb7, 0x55, 0xe4, 0x0f, 0x08, 0x7e, 0xb5, 0x1e, 0xe3, 0xd1, 0x02, + 0xb6, 0xb0, 0x69, 0xb6, 0x50, 0xf5, 0xd8, 0x55, 0x03, 0x35, 0x47, 0x1b, 0x24, 0x46, + 0x5d, 0x93, 0x4d, 0x63, 0x34, 0x39, 0xb1, 0x08, 0xd9, 0x04, 0x2b, 0x37, 0xf9, 0xf7, + 0x2e, 0x74, 0xfd, 0x6b, 0xa0, 0x01, 0x58, 0x5b, 0x08, 0x62, 0xdb, 0x99, 0x4a, 0x5e, + 0xc1, 0x2d, 0xc9, 0x1e, 0x01, 0x48, 0x6a, 0x8d, 0xc6, 0x8a, 0xb9, 0xa3, 0x41, 0x93, + 0x52, 0x61, 0x73, 0xec, 0xc0, 0xd1, 0x55, 0xb5, 0xcd, 0xd6, 0xbc, 0x07, 0xe6, 0x3e, + 0x41, 0xaf, 0x9e, 0x52, 0x4c, 0xd3, 0xe6, 0x55, 0x5d, 0x38, 0xb4, 0x6d, 0xb2, 0xd9, + 0x9e, 0x5b, 0xa4, 0xa4, 0x95, 0xff, 0x30, 0xfe, 0xf2, 0x54, 0xc9, 0xfe, 0x7b, 0x79, + 0x0c, 0xe5, 0x6a, 0x40, 0xf4, 0x00, 0x27, 0xbb, 0x62, 0x05, 0x86, 0x38, 0xc4, 0x94, + 0x17, 0x7b, 0x7f, 0x5c, 0x8f, 0x29, 0x44, 0x9e, 0x9e, 0xc3, 0xbd, 0xb3, 0xab, 0x04, + 0x16, 0x0d, 0x96, 0xd0, 0xd4, 0x04, 0x79, 0x5d, 0x54, 0x28, 0x40, 0x82, 0xb6, 0x35, + 0x7d, 0x58, 0x1d, 0xc2, 0x64, 0x81, 0x13, 0x67, 0xbb, 0xb1, 0x31, 0x9a, 0x31, 0xf7, + 0x66, 0x4a, 0x4e, 0xca, 0x93, 0x2a, 0xbb, 0xd7, 0x33, 0xa7, 0x1a, 0x31, 0xaf, 0x23, + 0x11, 0xc4, 0x9a, 0xc9, 0xaf, 0x22, 0xf8, 0x16, 0x7b, 0x25, 0x51, 0xac, 0xf5, 0x73, + 0xd9, 0x1b, 0x40, 0x98, 0xc4, 0xde, 0xa8, 0xa9, 0x79, 0x9d, 0x9d, 0x54, 0x52, 0x0c, + 0xc6, 0x3e, 0x55, 0x71, 0x8a, 0x24, 0x85, 0xbf, 0x6f, 0x63, 0x16, 0x30, 0x7c, 0xea, + 0x21, 0x5e, 0x22, 0x22, 0x8d, 0x45, 0x34, 0x9a, 0x03, 0x50, 0x31, 0xa4, 0xcb, 0x67, + 0x7b, 0x52, 0x3a, 0x3a, 0x51, 0x25, 0x2c, 0x6c, 0x61, 0xd0, 0xe2, 0x43, 0x2b, 0x94, + 0xac, 0x9c, 0x0d, 0xb5, 0x40, 0xf3, 0x5b, 0x1d, 0xde, 0x91, 0xa3, 0xaf, 0x37, 0xa6, + 0x71, 0xb8, 0xaa, 0x9f, 0x69, 0xf0, + ], + ock: [ + 0x42, 0x46, 0x14, 0xa3, 0xb5, 0x79, 0x96, 0xef, 0xb1, 0x24, 0xb7, 0xf4, 0x50, 0xae, + 0x2a, 0xf7, 0xf6, 0xdc, 0x8c, 0x8c, 0xee, 0xa9, 0x4f, 0x17, 0x74, 0x77, 0x72, 0x1b, + 0x84, 0x61, 0x3b, 0x23, + ], + op: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, + 0xdf, 0x7c, 0xe2, 0xd2, 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, + 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, ], c_out: [ - 0xca, 0xb7, 0x8d, 0xd1, 0x83, 0xf3, 0xe1, 0x6a, 0xf7, 0x6e, 0x9a, 0x90, 0x3d, 0xd4, - 0x2a, 0x96, 0x67, 0xbf, 0xe7, 0x08, 0xce, 0x88, 0x79, 0xb8, 0x38, 0x6e, 0x62, 0xac, - 0x9f, 0x66, 0x74, 0xf4, 0x93, 0x59, 0x5d, 0xa5, 0x06, 0xe9, 0xef, 0x06, 0xbb, 0xa2, - 0x4a, 0x93, 0x80, 0x60, 0xe5, 0xd3, 0x82, 0xcc, 0x75, 0xdf, 0xab, 0x97, 0xe0, 0xf8, - 0x49, 0x4b, 0x47, 0x6a, 0xdf, 0x4f, 0xfd, 0x96, 0xff, 0x7f, 0x1b, 0x4f, 0x16, 0xf8, - 0x59, 0x4b, 0x7c, 0x5a, 0x21, 0x9c, 0x7a, 0x00, 0xad, 0x15, + 0x8b, 0x94, 0x8b, 0x33, 0xf5, 0x55, 0xcd, 0x45, 0x5f, 0xaa, 0x36, 0x51, 0x7b, 0x8e, + 0xab, 0x29, 0xe1, 0xa5, 0x1f, 0x6c, 0xec, 0x21, 0x79, 0xd9, 0xea, 0xe4, 0xea, 0xca, + 0x92, 0x50, 0xbb, 0x9b, 0x55, 0xe4, 0xb5, 0x49, 0x49, 0x15, 0xc1, 0xf0, 0x01, 0x65, + 0xf8, 0x9d, 0x7c, 0x02, 0xa0, 0x25, 0x45, 0xb9, 0xd5, 0x98, 0x08, 0x6e, 0xeb, 0x96, + 0x1e, 0x58, 0x7e, 0x43, 0xfd, 0xfc, 0x65, 0xfe, 0x52, 0xf1, 0xe0, 0xc6, 0xa0, 0x46, + 0x46, 0x48, 0xcd, 0x1f, 0xc8, 0x9e, 0x80, 0xbd, 0x78, 0x0f, + ], + note_type: Some([ + 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, + 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, + 0xe3, 0x81, 0x93, 0xbc, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0x77, 0x5c, 0x7f, 0x5c, 0xab, 0x43, 0x86, 0x88, 0x64, 0x3d, 0xdd, 0x15, 0x8d, 0xda, + 0xed, 0xf9, 0xa0, 0xea, 0xef, 0x61, 0x4b, 0x54, 0x90, 0x60, 0xf1, 0xe4, 0xd7, 0xcc, + 0x3e, 0x7e, 0x8b, 0x64, 0x49, 0x9a, 0x81, 0x8a, 0x6d, 0x0e, 0x33, 0x57, 0x68, 0x6e, + 0x65, 0xbc, 0x27, 0x4e, 0x3f, 0x7d, 0x45, 0x5b, 0x91, 0x1f, 0x13, 0x9f, 0x19, 0xf0, + 0x81, 0x61, 0x57, 0x51, 0x91, 0x3e, 0xb4, 0x12, ], + ovk: [ + 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, 0x0c, + 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, 0x64, 0xe8, + 0x4b, 0xac, 0x37, 0x92, + ], + default_d: [ + 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, + ], + default_pk_d: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, + ], + v: 10238534295395242511, + rseed: [ + 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, + 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, + 0xa5, 0xfa, 0x38, 0x5d, + ], + memo: [ + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x81, 0xa8, 0xbb, 0x76, 0xf2, 0x62, 0x73, 0x62, 0x8b, 0x9f, 0x9b, 0x66, 0x04, 0x94, + 0xb3, 0x45, 0xb7, 0x9d, 0x45, 0x16, 0x3c, 0x7b, 0x4c, 0xc5, 0x5a, 0x49, 0xff, 0x3f, + 0xc6, 0xb8, 0x1d, 0xaa, + ], + rho: [ + 0xd6, 0xff, 0xc4, 0x74, 0x88, 0xad, 0x05, 0x93, 0x89, 0x70, 0xc4, 0xb1, 0x56, 0xd0, + 0x53, 0xb9, 0x3b, 0xcb, 0xb4, 0x37, 0x57, 0x1c, 0x62, 0xf3, 0x75, 0x60, 0x7e, 0x90, + 0x4e, 0xb3, 0xa2, 0x08, + ], + cmx: [ + 0x8f, 0x56, 0xd1, 0x3f, 0xd9, 0xc8, 0x3e, 0xb7, 0x1b, 0x95, 0x87, 0x7a, 0x4f, 0x29, + 0x39, 0x64, 0xbf, 0x3f, 0x73, 0x1d, 0x8d, 0xf2, 0x04, 0x32, 0x2c, 0xed, 0xcb, 0x38, + 0x68, 0x21, 0x90, 0x3c, + ], + esk: [ + 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, 0x44, 0xb0, 0xb0, 0x4f, + 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, 0xa9, 0xec, 0x88, 0x17, + 0x18, 0x65, 0x40, 0x33, + ], + ephemeral_key: [ + 0x51, 0x66, 0x26, 0x31, 0x6e, 0xea, 0x63, 0xa6, 0x45, 0xae, 0x56, 0x23, 0x81, 0x5a, + 0x31, 0x74, 0xb3, 0xed, 0x36, 0x64, 0xc3, 0x3e, 0x6a, 0x51, 0x81, 0xa9, 0xf5, 0xb5, + 0x42, 0x76, 0x7a, 0x2d, + ], + shared_secret: [ + 0xf6, 0x04, 0x23, 0x98, 0x7f, 0x0e, 0x67, 0x6d, 0x1a, 0x3b, 0xb6, 0xef, 0xe0, 0x39, + 0x42, 0x1d, 0xbb, 0xc8, 0x24, 0xb6, 0x90, 0xc1, 0x94, 0xa4, 0x90, 0xe4, 0x17, 0x1d, + 0xde, 0x21, 0x58, 0x19, + ], + k_enc: [ + 0x20, 0x98, 0x25, 0x7e, 0x2b, 0x9b, 0x7f, 0xc0, 0x62, 0x82, 0x38, 0x03, 0x38, 0x59, + 0x7d, 0xcb, 0x62, 0x7d, 0xdf, 0x47, 0x3e, 0x83, 0xa7, 0x2e, 0x61, 0xb0, 0xf2, 0x2c, + 0xcf, 0xaf, 0xbe, 0x4e, + ], + p_enc: [ + 0x03, 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, 0x0f, 0x12, + 0xb0, 0x11, 0xb2, 0x94, 0x16, 0x8e, 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, + 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, + 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, 0xfa, 0x38, 0x5d, 0x76, 0xba, 0x24, 0x3f, + 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, + 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, + ], + c_enc: [ + 0xa4, 0x01, 0xab, 0x60, 0x1f, 0x8d, 0x69, 0xd9, 0x38, 0x0c, 0x3d, 0xef, 0x1f, 0x1a, + 0x34, 0xbe, 0x6c, 0xfa, 0x4d, 0x83, 0x8b, 0xf8, 0x7f, 0x00, 0xe3, 0x6b, 0xe6, 0xbe, + 0x68, 0x60, 0xbe, 0xa8, 0x3d, 0xab, 0xdd, 0x00, 0xab, 0xe7, 0xe0, 0xd1, 0x21, 0x90, + 0xfb, 0x54, 0xb0, 0xf2, 0xad, 0xcf, 0xef, 0x9e, 0xf4, 0x2b, 0xa2, 0x31, 0x77, 0x6a, + 0xd3, 0xee, 0x09, 0x86, 0xdb, 0x3f, 0x4f, 0xc0, 0xa8, 0xa1, 0xc6, 0xa7, 0xfe, 0x54, + 0xa6, 0x6b, 0xd7, 0x68, 0xa9, 0xde, 0xd2, 0x5b, 0xb1, 0x89, 0xd5, 0x87, 0x1c, 0xaf, + 0x4d, 0xf8, 0x95, 0x6c, 0x2f, 0x30, 0x70, 0x15, 0x89, 0xa4, 0xdc, 0xdb, 0x68, 0x11, + 0x6d, 0x0f, 0x50, 0x9b, 0x34, 0x1e, 0x8f, 0x25, 0x8e, 0x17, 0x38, 0xb5, 0x51, 0x9c, + 0x99, 0xf1, 0xdb, 0xd0, 0x86, 0x31, 0x56, 0x2f, 0x90, 0xd1, 0x5e, 0x72, 0x8a, 0x85, + 0x25, 0xa1, 0x1b, 0xfe, 0x53, 0x95, 0x24, 0x5d, 0x71, 0x79, 0xcf, 0x8e, 0x97, 0xa8, + 0x3f, 0xaa, 0x4c, 0xf3, 0xb2, 0xa8, 0xb5, 0xef, 0x62, 0x13, 0xe3, 0x30, 0x89, 0xb4, + 0xeb, 0x03, 0xe7, 0xc2, 0xf0, 0x12, 0x11, 0xfc, 0x53, 0xbc, 0x01, 0x16, 0x40, 0x05, + 0x01, 0x5d, 0xbf, 0x33, 0xc6, 0x50, 0xa3, 0xf8, 0x33, 0xba, 0x67, 0x77, 0xcf, 0xf1, + 0xd7, 0x38, 0xe2, 0x1c, 0x58, 0xdc, 0x05, 0xc3, 0xb4, 0xec, 0xb9, 0x7a, 0x6c, 0xe0, + 0xb0, 0xc5, 0xee, 0x94, 0x4c, 0x24, 0xb3, 0x3b, 0xb0, 0xce, 0x32, 0xbe, 0x02, 0x3e, + 0x21, 0x3f, 0xf7, 0xc9, 0xd4, 0x12, 0x4f, 0xc9, 0xdc, 0x4a, 0xa7, 0xca, 0x47, 0x13, + 0x86, 0x48, 0xe2, 0xbb, 0x80, 0x7c, 0xea, 0x7a, 0x58, 0xe7, 0x67, 0xd3, 0x27, 0x07, + 0x4a, 0xe5, 0xe3, 0x9c, 0x3c, 0x17, 0xb7, 0x7c, 0x09, 0x0a, 0xf9, 0x42, 0x5b, 0xc6, + 0x40, 0xd2, 0x1d, 0xd6, 0x81, 0xa6, 0x37, 0x45, 0xe9, 0x02, 0x59, 0xe2, 0xd1, 0x09, + 0x0c, 0x88, 0x48, 0x8e, 0x21, 0x48, 0xb9, 0xee, 0x24, 0x31, 0xc5, 0xae, 0xf5, 0x10, + 0x95, 0xb3, 0x5a, 0x37, 0x7c, 0xfa, 0x76, 0x5d, 0x82, 0x24, 0x98, 0x83, 0x00, 0x04, + 0x71, 0x79, 0xa5, 0x09, 0x40, 0x28, 0xbe, 0x52, 0x7d, 0x5d, 0xe1, 0xc2, 0x69, 0xff, + 0x45, 0x2c, 0x0a, 0xaf, 0x5a, 0x47, 0x7e, 0x93, 0x90, 0xa0, 0xf0, 0xa8, 0x68, 0x11, + 0x3c, 0x7c, 0xd1, 0x9e, 0x2e, 0xac, 0x54, 0x0d, 0xc6, 0x59, 0xda, 0x29, 0x60, 0x06, + 0x77, 0x6e, 0xda, 0x0d, 0xf9, 0x81, 0xc4, 0x11, 0xc1, 0x50, 0x01, 0xa9, 0x8b, 0x6a, + 0xd6, 0x58, 0xd9, 0xa6, 0x4c, 0x12, 0x6a, 0xbe, 0xfc, 0x73, 0x9a, 0xa1, 0xf4, 0x44, + 0xbb, 0x83, 0xf3, 0xf1, 0x4d, 0x11, 0x3d, 0x02, 0x8f, 0xae, 0x10, 0xe4, 0xc5, 0xdb, + 0xe7, 0x78, 0x51, 0x96, 0x83, 0xcd, 0xf4, 0xc2, 0xf4, 0x6c, 0x4a, 0x52, 0xae, 0x12, + 0x09, 0xe1, 0x12, 0x7f, 0x9d, 0xc4, 0xed, 0x86, 0x7d, 0x8e, 0xda, 0x02, 0x4a, 0x68, + 0x9f, 0x6b, 0x15, 0xb8, 0x05, 0x38, 0x03, 0x02, 0x44, 0x02, 0xa1, 0xce, 0x6f, 0x1c, + 0x63, 0x6f, 0x2e, 0xfc, 0xf9, 0xd0, 0x60, 0x51, 0x5c, 0xd6, 0x14, 0x71, 0x8d, 0x51, + 0x52, 0x7d, 0x26, 0x7a, 0xd8, 0x95, 0xfa, 0xd8, 0xec, 0xfb, 0x23, 0x51, 0xf8, 0x92, + 0x45, 0x0d, 0xc8, 0x74, 0xe8, 0x74, 0x39, 0x2c, 0x91, 0xed, 0x3a, 0xf1, 0x18, 0x38, + 0xc4, 0xb5, 0x48, 0x2e, 0x8c, 0x92, 0xeb, 0xc7, 0xa0, 0x08, 0x8e, 0x49, 0xd2, 0xb0, + 0xb4, 0xa1, 0xbd, 0x33, 0x3b, 0x38, 0x7f, 0x49, 0xe3, 0x0f, 0xd2, 0x1a, 0x6e, 0xdc, + 0x89, 0x94, 0x83, 0x4f, 0x28, 0xe9, 0xf2, 0x52, 0x9a, 0x7e, 0x27, 0x24, 0x21, 0x6d, + 0x9e, 0x1a, 0xe5, 0xb4, 0x6e, 0xb1, 0x9a, 0x53, 0xea, 0x2b, 0x97, 0x99, 0x65, 0xf7, + 0x5b, 0x83, 0xf6, 0x86, 0xed, 0xc0, 0x1d, 0x25, 0x7a, 0x06, 0x58, 0xd7, 0x4e, 0x25, + 0xc0, 0xe1, 0xa8, 0xb0, 0x65, 0x60, 0x43, 0x1f, 0x85, 0x10, 0x5c, 0xf9, 0x8a, 0x1f, + 0xfe, 0x28, 0x40, 0x8a, 0x64, 0xf4, 0xc0, 0x27, 0x8d, 0x36, 0xed, 0xea, 0x76, 0x40, + 0xa2, 0x18, 0x26, 0xc3, 0x5d, 0x13, 0x20, 0x25, 0x08, 0x07, 0x2b, 0x68, 0x82, 0xf4, + 0xd8, 0x2e, 0x93, 0x3c, 0x89, 0xe1, + ], + ock: [ + 0x71, 0x5c, 0x9a, 0x01, 0x87, 0xab, 0x90, 0xb2, 0x4d, 0x3c, 0xbb, 0xa3, 0xf1, 0xab, + 0x30, 0x67, 0xc5, 0x63, 0x06, 0x04, 0x48, 0xc0, 0x0e, 0xf2, 0x74, 0xb7, 0xea, 0x66, + 0x11, 0x13, 0x0d, 0x26, + ], + op: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, + 0x44, 0xb0, 0xb0, 0x4f, 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, + 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, + ], + c_out: [ + 0x22, 0xce, 0xb6, 0x94, 0x21, 0xab, 0x9e, 0xd0, 0x29, 0x97, 0x3f, 0xf2, 0x2e, 0xc9, + 0x5f, 0x23, 0x36, 0x56, 0xbe, 0x41, 0xd2, 0x25, 0x1a, 0x76, 0x77, 0xce, 0xb0, 0xd3, + 0x14, 0x22, 0x11, 0x6f, 0x8c, 0xa5, 0xf0, 0xae, 0x23, 0x12, 0xd4, 0xec, 0x60, 0x0c, + 0x5d, 0x7c, 0x56, 0x44, 0x5b, 0x6d, 0x8d, 0xc4, 0xb8, 0x0b, 0x47, 0x0b, 0xb1, 0xf6, + 0x51, 0xa5, 0x38, 0x28, 0x0d, 0xaa, 0x94, 0x20, 0x3a, 0xb5, 0x02, 0xa8, 0x15, 0x09, + 0xe4, 0x3a, 0x61, 0xa6, 0x98, 0x56, 0x57, 0xd9, 0xe8, 0x4e, + ], + note_type: Some([ + 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, + 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, + 0xf6, 0x99, 0x03, 0x18, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0x9c, 0xe9, 0x20, 0x37, 0x6a, 0x6a, 0x54, 0x1e, 0x6a, 0xad, 0x66, 0x0e, 0xfa, 0x09, + 0x8d, 0xc5, 0x4c, 0x18, 0xfc, 0xeb, 0x13, 0xd0, 0x99, 0x9f, 0xbc, 0xc7, 0xfd, 0x45, + 0xa5, 0x7c, 0xcc, 0x10, 0xb8, 0xaa, 0x86, 0xc4, 0x54, 0x0d, 0x0a, 0x9f, 0xc6, 0x6d, + 0xf8, 0x5d, 0xad, 0xd6, 0x21, 0x56, 0x36, 0x5e, 0x28, 0xa3, 0xe9, 0x80, 0xb9, 0x8d, + 0x13, 0x1b, 0x50, 0x3a, 0xa0, 0x6a, 0x6c, 0x19, + ], + ovk: [ + 0xf8, 0x1a, 0xd6, 0x17, 0xfa, 0x26, 0xf0, 0xdf, 0xb8, 0x36, 0x55, 0xb8, 0xa2, 0x9a, + 0x7f, 0x83, 0x42, 0x32, 0x42, 0x5e, 0x8c, 0x47, 0x45, 0x88, 0xf1, 0x8d, 0xd3, 0x26, + 0xaa, 0x39, 0x6c, 0x3e, + ], + default_d: [ + 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, + ], + default_pk_d: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, + ], + v: 2690686290017047047, + rseed: [ + 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, + 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, + 0xee, 0xba, 0xe6, 0xfa, + ], + memo: [ + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x40, 0x21, 0x95, 0x68, 0x0e, 0x02, 0x27, 0x30, 0x2c, 0x3a, 0x75, 0x6a, 0x34, 0xdf, + 0xdb, 0x13, 0x6b, 0xbd, 0x28, 0x7d, 0x7d, 0xc1, 0x25, 0x81, 0xd0, 0x8e, 0x2a, 0x63, + 0xb9, 0xc3, 0x92, 0x3e, + ], + rho: [ + 0x85, 0x2f, 0x5c, 0x39, 0xd3, 0xf3, 0x55, 0xa3, 0x85, 0xe2, 0xab, 0xd2, 0x54, 0x3a, + 0xa5, 0xed, 0x09, 0xc6, 0xee, 0x3b, 0x7f, 0x39, 0x34, 0x14, 0xe1, 0x1c, 0xd4, 0x20, + 0x4c, 0x3f, 0x8d, 0x26, + ], + cmx: [ + 0x69, 0x4b, 0x6f, 0x3a, 0xb8, 0x37, 0xa9, 0x26, 0xd6, 0x77, 0x3e, 0xc4, 0xa6, 0x76, + 0x5d, 0xef, 0x82, 0x89, 0x33, 0x74, 0x2d, 0x93, 0x29, 0xfc, 0x88, 0x67, 0x1c, 0xcd, + 0x81, 0x21, 0xa4, 0x23, + ], + esk: [ + 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, 0xa5, 0xd8, 0x9a, 0xa8, + 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, 0x6a, 0x72, 0xcb, 0x74, + 0xfb, 0x18, 0xd1, 0x17, + ], + ephemeral_key: [ + 0x3c, 0x04, 0xbe, 0x6e, 0x42, 0xa6, 0xca, 0x7f, 0x5d, 0xda, 0x0d, 0x82, 0xdf, 0x30, + 0x7b, 0xd9, 0x6b, 0xb7, 0xb1, 0xae, 0x8d, 0x62, 0x31, 0x87, 0xe3, 0x9c, 0x00, 0xa4, + 0x8c, 0x25, 0xaa, 0x9d, + ], + shared_secret: [ + 0x3a, 0x60, 0x2b, 0xaf, 0xb8, 0xa2, 0x66, 0x5a, 0x74, 0xdf, 0x34, 0xab, 0x6e, 0x3c, + 0x48, 0x8b, 0x09, 0xe2, 0x28, 0x4e, 0xa1, 0x7d, 0x56, 0x02, 0x62, 0xe2, 0x1f, 0x7f, + 0x3c, 0xba, 0xa3, 0x95, + ], + k_enc: [ + 0x1b, 0x6d, 0xd1, 0x03, 0x49, 0x63, 0x67, 0xc9, 0x2b, 0x36, 0x8f, 0xc2, 0xf1, 0xc6, + 0x2e, 0x56, 0xc8, 0xc9, 0xfb, 0xe3, 0x4a, 0x35, 0x84, 0x1f, 0xe1, 0xa3, 0x70, 0x96, + 0x43, 0xe1, 0x35, 0xe1, + ], + p_enc: [ + 0x03, 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, 0x07, 0xd2, + 0x7a, 0xc6, 0xec, 0x3c, 0x57, 0x25, 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, + 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, + 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, 0xee, 0xba, 0xe6, 0xfa, 0x64, 0xd0, 0x87, 0x40, + 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, 0xc3, 0x93, 0x11, 0x78, + 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, 0xe5, 0xf5, 0xd4, 0xbc, + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, + ], + c_enc: [ + 0xb4, 0x15, 0x88, 0x23, 0x1d, 0x6b, 0xa2, 0x9c, 0xc5, 0xb9, 0xaa, 0xf0, 0xc1, 0xf0, + 0xba, 0x44, 0x16, 0x6e, 0xdb, 0x8a, 0x27, 0x29, 0xca, 0xba, 0x53, 0x71, 0xe7, 0xac, + 0x36, 0x90, 0x0f, 0xaa, 0x64, 0xf5, 0x76, 0x0d, 0xce, 0x55, 0x20, 0xda, 0x82, 0x8d, + 0x5e, 0x25, 0xbd, 0x83, 0x51, 0x95, 0x11, 0x64, 0x12, 0x11, 0x80, 0x9d, 0xff, 0xd8, + 0xcf, 0xeb, 0xff, 0xf3, 0xcd, 0xdc, 0xd2, 0x75, 0x88, 0x1e, 0x39, 0xb6, 0x3d, 0xac, + 0x4d, 0x98, 0x6b, 0x10, 0xc0, 0xe4, 0xc5, 0x52, 0x63, 0xde, 0x3e, 0x02, 0x54, 0x94, + 0x81, 0x8a, 0x38, 0x08, 0xd9, 0xab, 0xc6, 0xec, 0x38, 0x8f, 0x95, 0x26, 0x73, 0x95, + 0x0a, 0xa2, 0xd0, 0xe4, 0xba, 0x00, 0x53, 0x75, 0xac, 0x60, 0x5d, 0xc8, 0x25, 0xde, + 0x4d, 0xd8, 0x93, 0x8b, 0x94, 0x7f, 0xf7, 0x19, 0x4c, 0xfe, 0x7c, 0x1d, 0x79, 0xa1, + 0x27, 0x15, 0x5d, 0x11, 0xcb, 0xe3, 0x43, 0xf3, 0x2f, 0xd1, 0x0c, 0x7d, 0xae, 0x39, + 0x1f, 0x00, 0xb4, 0x4f, 0xbe, 0x30, 0x1c, 0x63, 0xfd, 0x4b, 0xf1, 0xc0, 0xdf, 0xb6, + 0xc9, 0xec, 0xb4, 0xc3, 0xf3, 0xfe, 0xf5, 0x40, 0xb6, 0x7e, 0xb9, 0x23, 0x13, 0x71, + 0x9c, 0x5a, 0x30, 0x7a, 0xd3, 0x95, 0x6b, 0xb9, 0x4e, 0x29, 0x86, 0x85, 0x2a, 0x64, + 0x5a, 0x95, 0xd6, 0xdc, 0x75, 0xaa, 0x27, 0x4c, 0xcf, 0xd2, 0x71, 0xd0, 0xea, 0xe2, + 0x65, 0x81, 0xf5, 0xf5, 0x5d, 0x64, 0x74, 0xaa, 0xad, 0x37, 0x4c, 0x86, 0x45, 0x05, + 0xe6, 0x92, 0x37, 0xf6, 0x66, 0x99, 0xee, 0x39, 0xe9, 0xfc, 0xf5, 0xb1, 0xb7, 0x03, + 0x35, 0x1e, 0x71, 0xf6, 0x3b, 0x02, 0x33, 0x40, 0x82, 0xee, 0xbe, 0xd8, 0x68, 0xb5, + 0x61, 0x2a, 0x33, 0x95, 0x78, 0x5a, 0x33, 0x2a, 0x52, 0x43, 0xe4, 0x98, 0x6e, 0x1f, + 0xf5, 0xb4, 0x2d, 0x06, 0x69, 0xc1, 0x5c, 0x45, 0xff, 0x81, 0xe2, 0x2e, 0xea, 0xe4, + 0xde, 0x7d, 0x9a, 0x4f, 0x57, 0x24, 0xc8, 0x96, 0x03, 0x94, 0x92, 0x5b, 0xa1, 0xa1, + 0x90, 0x0f, 0xa2, 0xb5, 0x59, 0x3d, 0x55, 0x45, 0x5e, 0x0b, 0xe0, 0x31, 0x8c, 0x80, + 0x23, 0x81, 0xec, 0x9c, 0x0a, 0x83, 0xc2, 0xe5, 0xf9, 0x33, 0x9f, 0x02, 0x9c, 0x44, + 0x24, 0x72, 0x8f, 0x91, 0x9d, 0x18, 0x4f, 0x36, 0x16, 0x50, 0xba, 0x65, 0xd6, 0x98, + 0xa8, 0xd1, 0x67, 0xbe, 0xd9, 0xdd, 0x01, 0xfa, 0x70, 0x74, 0xe4, 0x6a, 0xf6, 0x57, + 0x16, 0xdd, 0xd9, 0x7e, 0x7b, 0xb6, 0x00, 0x13, 0x05, 0x96, 0x8c, 0xd5, 0xb4, 0x87, + 0x0d, 0xf2, 0x00, 0x42, 0xe7, 0x69, 0xe0, 0x2d, 0xf1, 0x8b, 0x9f, 0xde, 0x9f, 0xda, + 0xa7, 0x6b, 0x00, 0xca, 0x26, 0x45, 0x9d, 0x54, 0x37, 0x19, 0x19, 0x72, 0xd7, 0x08, + 0xde, 0xda, 0xbf, 0x1d, 0x61, 0x7f, 0x73, 0x3a, 0x60, 0xeb, 0xfe, 0xc6, 0xac, 0xf0, + 0x0b, 0xb1, 0xdf, 0xbf, 0x11, 0x2d, 0x3a, 0xaa, 0xc9, 0xfb, 0xd2, 0x30, 0xcc, 0xaa, + 0x9c, 0xf3, 0x58, 0x45, 0x93, 0x54, 0xac, 0x5b, 0x29, 0xbd, 0xb7, 0x3a, 0x45, 0x27, + 0x1b, 0x1f, 0x9e, 0xd0, 0x0e, 0x3e, 0x20, 0xb1, 0x2f, 0xed, 0x5c, 0xd5, 0x6a, 0xbb, + 0xb0, 0xb9, 0x4a, 0x9e, 0xee, 0x5f, 0xf8, 0xf9, 0x36, 0x1d, 0xfd, 0x6c, 0x94, 0x08, + 0x5d, 0x28, 0x98, 0xe5, 0x46, 0xeb, 0x92, 0xe6, 0xdb, 0xe9, 0xf0, 0x2e, 0xb5, 0xbf, + 0x7d, 0x12, 0x67, 0x5d, 0x3c, 0x6a, 0xc7, 0x18, 0x4b, 0x26, 0x01, 0xe4, 0xf4, 0x05, + 0x37, 0x3a, 0x4f, 0x1c, 0x5d, 0xf7, 0x6b, 0x3c, 0xb5, 0x29, 0x99, 0xd8, 0x0f, 0x59, + 0xb3, 0x94, 0xbc, 0xed, 0x9f, 0x66, 0xbc, 0xf7, 0xdc, 0x37, 0xc2, 0xb4, 0xc6, 0xf7, + 0x74, 0x5b, 0xc6, 0xf0, 0x37, 0x74, 0xfa, 0xc6, 0x24, 0x5d, 0x7c, 0x63, 0x6d, 0xfc, + 0x5f, 0x76, 0x58, 0xb2, 0xd2, 0xfd, 0x84, 0xac, 0xa9, 0xe0, 0xef, 0xcd, 0xe0, 0x09, + 0x3e, 0x62, 0x29, 0x38, 0xb7, 0x5d, 0xae, 0x66, 0xcf, 0x63, 0xf6, 0xd2, 0x35, 0x17, + 0x2e, 0x5a, 0x0b, 0xbe, 0xcd, 0x15, 0x56, 0x6c, 0x61, 0xfe, 0x5a, 0x58, 0x94, 0x7c, + 0x18, 0xb9, 0xb5, 0xa1, 0x21, 0x11, 0x25, 0x94, 0x3b, 0x09, 0x32, 0x24, 0x96, 0x7b, + 0x7e, 0x44, 0x16, 0x70, 0x64, 0xc9, + ], + ock: [ + 0xbc, 0x1b, 0xa7, 0xae, 0x73, 0xe7, 0x39, 0x7a, 0x64, 0xe0, 0xbd, 0x98, 0x63, 0xf1, + 0x33, 0x95, 0xdc, 0x0b, 0x15, 0xd4, 0x4e, 0x86, 0x70, 0xf1, 0x85, 0x5b, 0x68, 0xc2, + 0x9f, 0x97, 0x9a, 0xd2, + ], + op: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, + 0xa5, 0xd8, 0x9a, 0xa8, 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, + 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, + ], + c_out: [ + 0xe2, 0x76, 0x3c, 0x2c, 0xd3, 0x04, 0x29, 0x45, 0x25, 0xf6, 0x6d, 0x17, 0xcd, 0xb4, + 0x2a, 0x6d, 0xaf, 0xd7, 0x47, 0x38, 0x37, 0x71, 0x52, 0x35, 0x62, 0xb2, 0x71, 0xbb, + 0xf5, 0xb2, 0x88, 0x41, 0xb5, 0xca, 0x65, 0xfd, 0xd3, 0x42, 0xee, 0x80, 0x2f, 0xee, + 0x12, 0x12, 0x47, 0x22, 0xcf, 0xf5, 0xe1, 0x99, 0xd6, 0xd9, 0x5c, 0x2f, 0x88, 0xc4, + 0xe2, 0x31, 0x31, 0xf4, 0xe7, 0x6b, 0xa7, 0x6b, 0x9d, 0x64, 0x66, 0x78, 0xd8, 0x53, + 0xd1, 0xdc, 0xaf, 0x81, 0xb8, 0x0e, 0x2e, 0xfd, 0xf0, 0x60, + ], + note_type: Some([ + 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, + 0xc3, 0x93, 0x11, 0x78, 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, + 0xe5, 0xf5, 0xd4, 0xbc, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0xb4, 0x9e, 0x3c, 0x5b, 0xb9, 0x9e, 0x47, 0xc5, 0x3d, 0x6e, 0x5c, 0x34, 0x7c, 0x99, + 0x8f, 0x30, 0x2d, 0x3f, 0xf4, 0x75, 0x23, 0xe7, 0xc3, 0xd7, 0xb6, 0x4c, 0x82, 0x98, + 0xdc, 0x7b, 0x10, 0xe9, 0x54, 0xdf, 0x06, 0x00, 0x0b, 0xc0, 0xcc, 0x30, 0xec, 0xf6, + 0x75, 0x5d, 0x92, 0x7e, 0xee, 0xce, 0xe6, 0xec, 0x9e, 0x8e, 0x0c, 0xba, 0xa3, 0x1b, + 0x71, 0xe0, 0xa4, 0x33, 0x4a, 0xd6, 0x42, 0x1b, + ], + ovk: [ + 0x97, 0x9f, 0x06, 0x58, 0x66, 0x73, 0xbc, 0x6f, 0xf1, 0xc5, 0xd3, 0xb3, 0x20, 0xf3, + 0x49, 0xa5, 0xb3, 0xa8, 0xb3, 0x55, 0x59, 0x22, 0x96, 0xaa, 0xf6, 0x1c, 0x5b, 0x72, + 0x52, 0xf7, 0x3e, 0xc0, + ], + default_d: [ + 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, + ], + default_pk_d: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, + ], + v: 5531329397987978327, + rseed: [ + 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, + 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, + 0xd0, 0x11, 0x8b, 0xbd, + ], + memo: [ + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x50, 0xaf, 0x90, 0x31, 0xf4, 0xe0, 0x4b, 0x79, 0xd7, 0xda, 0xb5, 0xe8, 0x5b, 0x51, + 0xee, 0x9b, 0xea, 0x56, 0xf7, 0xc5, 0x6b, 0x52, 0x22, 0x73, 0xd2, 0x30, 0xaa, 0x51, + 0x2b, 0xa9, 0xe7, 0x06, + ], + rho: [ + 0x09, 0x1d, 0x83, 0x73, 0x3a, 0x9f, 0xfb, 0x18, 0xc1, 0x7a, 0xd1, 0x93, 0x8d, 0xd2, + 0x67, 0x93, 0xc3, 0xfe, 0xfa, 0xda, 0xee, 0xa8, 0xe2, 0x3c, 0x44, 0xd5, 0xe0, 0x18, + 0x4b, 0xc8, 0x45, 0x10, + ], + cmx: [ + 0x76, 0xf1, 0xbd, 0x50, 0xf9, 0xb9, 0x06, 0xcb, 0x9f, 0xf2, 0xdd, 0x91, 0x8a, 0x36, + 0x7e, 0x5f, 0xb1, 0xa2, 0xef, 0x39, 0xf1, 0x4f, 0x6c, 0xe9, 0x4f, 0xf9, 0xf0, 0x91, + 0x55, 0xf8, 0xc2, 0x11, + ], + esk: [ + 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, 0xa1, 0xe6, 0xfb, 0x57, + 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, 0xb9, 0x5f, 0xc8, 0x7e, + 0xa7, 0x37, 0x3e, 0x2f, + ], + ephemeral_key: [ + 0xda, 0x72, 0x84, 0xa0, 0xe0, 0xde, 0x52, 0x09, 0x3c, 0xc2, 0xe1, 0x9c, 0x0a, 0xf1, + 0x93, 0xbd, 0xb4, 0x2c, 0x80, 0xc9, 0xc7, 0xf9, 0xf2, 0x36, 0x00, 0xe6, 0x08, 0x01, + 0x72, 0xc5, 0xf5, 0x39, + ], + shared_secret: [ + 0x9b, 0xcf, 0xb9, 0x6f, 0x4c, 0xf1, 0x83, 0xc1, 0x7f, 0xb1, 0x99, 0xda, 0x16, 0x5f, + 0xbf, 0x8a, 0x47, 0x47, 0x7e, 0x00, 0x36, 0x6d, 0x1c, 0xb7, 0x3b, 0x32, 0xec, 0x0e, + 0x3a, 0xc1, 0x98, 0x0f, + ], + k_enc: [ + 0x21, 0xe0, 0x97, 0x87, 0x0a, 0xee, 0xc0, 0x19, 0x76, 0x86, 0xee, 0x37, 0x22, 0x78, + 0xfe, 0x4a, 0xa2, 0x23, 0x8d, 0x87, 0x65, 0x32, 0x63, 0x84, 0x8a, 0x2f, 0xf5, 0x27, + 0x9f, 0x2b, 0x1d, 0x9b, + ], + p_enc: [ + 0x03, 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, 0x57, 0xac, + 0xbf, 0xfe, 0xc7, 0x3a, 0xc3, 0x4c, 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, + 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, + 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, 0xd0, 0x11, 0x8b, 0xbd, 0xc3, 0xcc, 0x4f, 0x43, + 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, 0xe3, 0x7a, 0x83, 0xec, + 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, 0x29, 0x03, 0x35, 0xaa, + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, + ], + c_enc: [ + 0x13, 0xd7, 0xdf, 0xcd, 0x1d, 0x75, 0x4d, 0xcd, 0x16, 0x52, 0x32, 0x83, 0x8f, 0x14, + 0xdd, 0x80, 0x5e, 0x12, 0xcc, 0x7e, 0x75, 0x15, 0x43, 0xd2, 0xa6, 0x8e, 0x23, 0x7a, + 0x92, 0x3b, 0xce, 0xeb, 0xa3, 0x5a, 0x62, 0x43, 0xc6, 0xa4, 0xc5, 0xf0, 0xd2, 0xa4, + 0xc3, 0x86, 0x07, 0xa6, 0xf1, 0x1b, 0x17, 0xfd, 0xd6, 0xc6, 0x92, 0x66, 0xf2, 0xc9, + 0x6a, 0xdc, 0x44, 0x6f, 0x2e, 0x2d, 0x07, 0x3e, 0xe9, 0xea, 0xe2, 0x9a, 0x37, 0xef, + 0x5d, 0x03, 0xf6, 0x78, 0xf5, 0x56, 0x29, 0x45, 0xb2, 0x08, 0x27, 0x76, 0xce, 0x9f, + 0x39, 0x08, 0x87, 0x3a, 0x99, 0xa6, 0xa2, 0x8b, 0xae, 0xdc, 0x7f, 0x54, 0x89, 0xce, + 0x4b, 0x30, 0xd8, 0x43, 0x66, 0xc5, 0x46, 0xb4, 0x36, 0x67, 0x91, 0x44, 0xf9, 0x27, + 0xf7, 0x1c, 0x65, 0x09, 0x69, 0xda, 0x22, 0x42, 0x28, 0x5a, 0x86, 0x27, 0x96, 0x54, + 0x89, 0xb7, 0x0b, 0x35, 0x6c, 0xf7, 0x4e, 0x07, 0x8a, 0xa2, 0x7d, 0xa8, 0xf9, 0x2f, + 0xb3, 0x09, 0x57, 0x12, 0x62, 0xf2, 0xd4, 0xc3, 0x36, 0xf7, 0x12, 0x15, 0x9b, 0x3e, + 0x9b, 0x43, 0x24, 0x38, 0x5b, 0xb3, 0x26, 0x2a, 0xc5, 0xf3, 0x13, 0x57, 0xaf, 0x9e, + 0x1a, 0xaa, 0x75, 0xd0, 0x1c, 0x06, 0x31, 0xbf, 0xdd, 0x34, 0xc5, 0x9b, 0x27, 0xd5, + 0x3b, 0xeb, 0xf1, 0xaa, 0x54, 0xe9, 0xc4, 0xaa, 0x98, 0x0f, 0x24, 0x7b, 0xf4, 0x22, + 0xa0, 0xe6, 0xdb, 0xf5, 0x54, 0x6e, 0xdc, 0x10, 0x0f, 0xce, 0x6c, 0xce, 0xc8, 0x32, + 0x7e, 0xb4, 0x8a, 0x9a, 0x39, 0xe4, 0xc2, 0xa9, 0x12, 0xb2, 0x98, 0x85, 0xe0, 0xc3, + 0xe7, 0x33, 0x55, 0x58, 0xbd, 0x85, 0x84, 0x38, 0xd0, 0x35, 0xd2, 0xf2, 0xbe, 0x1d, + 0x35, 0x66, 0xe4, 0x22, 0xfe, 0x37, 0xc0, 0xcb, 0x2e, 0x05, 0x8d, 0xad, 0x8c, 0xc6, + 0x45, 0x62, 0xa5, 0x50, 0x1b, 0x54, 0xa4, 0x4f, 0x9a, 0x77, 0x77, 0xc6, 0xd2, 0x77, + 0x04, 0xa4, 0xce, 0xad, 0x26, 0xa1, 0xc2, 0x56, 0x01, 0x8d, 0xc1, 0xbb, 0xfa, 0x58, + 0x84, 0xa0, 0x6c, 0xc7, 0x25, 0x23, 0xaf, 0xfb, 0x43, 0xf5, 0xc5, 0xbc, 0x2f, 0x1d, + 0x36, 0x04, 0x0f, 0x85, 0xf7, 0xe8, 0xc0, 0x62, 0xc1, 0xf2, 0x26, 0x50, 0x9d, 0x20, + 0xf9, 0xa4, 0x88, 0x5e, 0x15, 0x70, 0x4f, 0x73, 0x01, 0xdf, 0x60, 0x3d, 0xa1, 0xfc, + 0x5b, 0xca, 0x84, 0xf8, 0x55, 0xc1, 0x17, 0xcb, 0x30, 0x55, 0xc5, 0x70, 0x83, 0x45, + 0x7e, 0x1d, 0x14, 0x85, 0x7c, 0x2b, 0xf9, 0x41, 0xe8, 0x20, 0x73, 0x5c, 0x58, 0x8a, + 0xae, 0x6f, 0x66, 0x45, 0xdc, 0x3f, 0xbd, 0x30, 0x65, 0xab, 0xa1, 0x7f, 0xd2, 0x48, + 0x2a, 0x1b, 0x37, 0xb2, 0xf3, 0x88, 0x07, 0x5e, 0x46, 0xbb, 0x9d, 0x37, 0x27, 0xcc, + 0x73, 0xdb, 0xae, 0x0e, 0x96, 0xa8, 0x44, 0x5f, 0xda, 0x8f, 0x87, 0x64, 0xf9, 0x68, + 0x0b, 0xf6, 0xc5, 0x91, 0xa8, 0x48, 0x10, 0xfa, 0x0c, 0x1b, 0x5a, 0x2f, 0x2a, 0xa9, + 0xad, 0xbb, 0x88, 0x64, 0x22, 0x31, 0x72, 0x1e, 0xd6, 0xea, 0x12, 0x16, 0xab, 0x9b, + 0xfa, 0x0e, 0x12, 0x4c, 0xe4, 0x74, 0x94, 0x44, 0x53, 0x4d, 0x68, 0x70, 0x19, 0x74, + 0x60, 0xf7, 0x49, 0xef, 0xb0, 0x28, 0x8f, 0x96, 0x28, 0x3f, 0xc9, 0x37, 0xef, 0xbb, + 0x14, 0x59, 0xaa, 0x73, 0xc2, 0x7b, 0x6b, 0x2b, 0x5c, 0x57, 0x7d, 0x46, 0x60, 0xf9, + 0x8e, 0x81, 0x8c, 0xaa, 0xad, 0xbe, 0x45, 0x4e, 0xcd, 0x16, 0xc1, 0xd8, 0xa9, 0x9b, + 0x77, 0x97, 0x8e, 0x93, 0xd6, 0x9d, 0xcb, 0x8b, 0xf0, 0xe8, 0x4a, 0x0a, 0x91, 0x3f, + 0x55, 0xcc, 0x16, 0x50, 0xc2, 0xb9, 0x2d, 0x4c, 0x9d, 0xcd, 0xb1, 0x2e, 0xe2, 0x36, + 0x7e, 0xd9, 0x79, 0xb9, 0x53, 0x5f, 0xe1, 0x5c, 0x87, 0xd1, 0x7f, 0x37, 0xa3, 0x24, + 0x84, 0x7f, 0x16, 0x45, 0x39, 0x75, 0x7d, 0x83, 0x00, 0x87, 0xf6, 0x39, 0xeb, 0x6c, + 0x3e, 0xfb, 0x8d, 0xa4, 0xff, 0xa5, 0xd7, 0xca, 0x58, 0x34, 0x4d, 0x65, 0x81, 0x76, + 0x64, 0xa7, 0x4e, 0xaf, 0xa1, 0xa4, 0x7f, 0x69, 0xf1, 0xc8, 0x10, 0x6b, 0x6f, 0x5f, + 0x96, 0x4f, 0x4c, 0x73, 0x68, 0xed, 0x11, 0x06, 0x29, 0x54, 0xd2, 0xe8, 0xd3, 0x0c, + 0xcc, 0xac, 0xba, 0xd9, 0xa2, 0xfa, + ], + ock: [ + 0xc7, 0x5b, 0x5b, 0xfa, 0x9f, 0x2e, 0xeb, 0xd9, 0x99, 0x80, 0x78, 0xf1, 0x8f, 0x0e, + 0x9b, 0x79, 0xf1, 0xe2, 0x13, 0xe8, 0x25, 0x61, 0x6f, 0xeb, 0x26, 0x08, 0xe9, 0xc7, + 0x81, 0xb5, 0x00, 0x95, + ], + op: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, + 0xa1, 0xe6, 0xfb, 0x57, 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, + 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, + ], + c_out: [ + 0xca, 0x4d, 0x6e, 0xb3, 0xea, 0x95, 0xc5, 0x5a, 0x91, 0x16, 0x85, 0x66, 0xe6, 0x67, + 0x63, 0xd1, 0x9e, 0x9c, 0x44, 0x33, 0x07, 0x3c, 0x08, 0x9a, 0x7d, 0xb9, 0x5b, 0x93, + 0xc8, 0xc4, 0x55, 0x0e, 0xb0, 0x8e, 0x28, 0xdd, 0xef, 0xba, 0x64, 0xe0, 0x58, 0xac, + 0x68, 0x44, 0xad, 0x77, 0x20, 0x67, 0xa1, 0x7c, 0x32, 0x53, 0xc3, 0x9a, 0x72, 0x4d, + 0xd8, 0x15, 0xf7, 0x29, 0x8c, 0x1d, 0x59, 0x09, 0x1f, 0x1b, 0x38, 0x7a, 0x26, 0x46, + 0xe7, 0xfe, 0x36, 0x3a, 0xde, 0x83, 0x63, 0xa9, 0x2a, 0xde, + ], + note_type: Some([ + 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, + 0xe3, 0x7a, 0x83, 0xec, 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, + 0x29, 0x03, 0x35, 0xaa, + ]), + }, + TestVector { + incoming_viewing_key: [ + 0xa6, 0x68, 0x13, 0x52, 0xa3, 0x52, 0x26, 0x91, 0x10, 0x0f, 0x53, 0xfc, 0x34, 0xab, + 0x73, 0x32, 0x8a, 0xf1, 0xb9, 0xf3, 0xa4, 0xa0, 0x6d, 0xbd, 0x3a, 0x14, 0x99, 0x67, + 0x09, 0xe6, 0xf2, 0x84, 0x31, 0xee, 0x72, 0xf2, 0x69, 0xae, 0xd7, 0x5d, 0x36, 0x34, + 0x89, 0x36, 0x90, 0x5e, 0xbb, 0x91, 0x80, 0x7d, 0x74, 0xd5, 0x0c, 0xb2, 0x7f, 0xcd, + 0x8b, 0x4f, 0xb6, 0xf4, 0x48, 0xc3, 0x62, 0x03, + ], + ovk: [ + 0x78, 0xf1, 0x45, 0xea, 0x29, 0xd2, 0x71, 0xb9, 0x40, 0xc6, 0x99, 0x41, 0xe4, 0xc3, + 0xfd, 0x2d, 0x71, 0xf3, 0xb1, 0x90, 0x69, 0x0e, 0xe1, 0x6f, 0x5d, 0x14, 0xac, 0x22, + 0x24, 0xe6, 0xfc, 0x89, + ], + default_d: [ + 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, + ], + default_pk_d: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, + ], + v: 15093716717054627455, + rseed: [ + 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, + 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, + 0x24, 0x57, 0x16, 0xa4, + ], + memo: [ + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ], + cv_net: [ + 0x72, 0xd8, 0x2a, 0xd6, 0x89, 0xd2, 0x9f, 0x9b, 0x18, 0x9d, 0x5b, 0x44, 0x78, 0x9f, + 0x55, 0xfe, 0x1e, 0x9b, 0xab, 0x78, 0x8f, 0xf8, 0x7e, 0xbe, 0x9f, 0xc8, 0x59, 0x50, + 0x4f, 0xb2, 0x3c, 0x8a, + ], + rho: [ + 0x57, 0x87, 0x18, 0x97, 0x6d, 0xa3, 0xdc, 0xb4, 0x30, 0x32, 0x71, 0x52, 0x20, 0x72, + 0xd0, 0x28, 0x44, 0x22, 0x13, 0x50, 0x86, 0x4e, 0xed, 0x56, 0x3d, 0xab, 0x30, 0x22, + 0x7f, 0x28, 0x4b, 0x2e, + ], + cmx: [ + 0x89, 0xe6, 0xa2, 0xb9, 0x70, 0x84, 0xe3, 0xd3, 0x34, 0x4f, 0xee, 0xb4, 0x64, 0x65, + 0x05, 0x72, 0x51, 0xb1, 0x9d, 0xa0, 0xce, 0xdf, 0x79, 0x71, 0x94, 0xc5, 0x97, 0xf9, + 0xf7, 0x7e, 0xf2, 0x1f, + ], + esk: [ + 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, 0x02, 0xf5, 0x10, 0xe9, + 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, 0xc4, 0x69, 0x2d, 0x0c, + 0x1b, 0x30, 0x33, 0x01, + ], + ephemeral_key: [ + 0x27, 0xcb, 0x40, 0x68, 0x0f, 0xb1, 0xd9, 0x19, 0x64, 0x6e, 0x74, 0x20, 0xe6, 0xa8, + 0xb5, 0x20, 0xe1, 0x9a, 0x17, 0x3f, 0x1e, 0x79, 0x4d, 0x2b, 0x49, 0x2b, 0xfa, 0xbb, + 0x83, 0xce, 0x6c, 0xa0, + ], + shared_secret: [ + 0x1c, 0xd0, 0x66, 0x91, 0x6c, 0x19, 0xfa, 0x33, 0x69, 0xaa, 0x3c, 0x6a, 0x53, 0x76, + 0x97, 0xf4, 0xb4, 0x26, 0x44, 0xda, 0x20, 0xca, 0x46, 0x79, 0x93, 0x2b, 0x7c, 0x90, + 0x5f, 0x2d, 0x69, 0x00, + ], + k_enc: [ + 0xce, 0x9d, 0x22, 0x0d, 0x3a, 0xfe, 0xc6, 0x23, 0x21, 0xdd, 0xf1, 0x97, 0xa6, 0x36, + 0xdc, 0xb3, 0x45, 0x58, 0x83, 0xb7, 0x35, 0x82, 0x8c, 0x65, 0xe7, 0x16, 0x6c, 0x15, + 0xd8, 0xcc, 0xfc, 0xf9, + ], + p_enc: [ + 0x03, 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, 0x7f, 0x8e, + 0x6a, 0x5c, 0x62, 0xa7, 0x77, 0xd1, 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, + 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, + 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, 0x24, 0x57, 0x16, 0xa4, 0x96, 0x86, 0xaa, 0x36, + 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, 0xab, 0xcf, 0xac, 0x88, + 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, 0x07, 0x2d, 0x2d, 0x18, + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, + ], + c_enc: [ + 0xb1, 0x69, 0x64, 0x77, 0xe6, 0x58, 0xb6, 0xf8, 0xe2, 0x4e, 0x02, 0x55, 0x52, 0xb4, + 0x8d, 0xd4, 0x84, 0x58, 0xf2, 0xcd, 0x75, 0x70, 0xc0, 0xe8, 0xce, 0xc4, 0xed, 0x4c, + 0xf7, 0x9b, 0xd5, 0xb6, 0x9e, 0xa8, 0x54, 0x12, 0x3b, 0x4e, 0xaf, 0x97, 0x8b, 0x14, + 0x2e, 0xb3, 0xef, 0x53, 0xaa, 0xfc, 0x78, 0x90, 0xdd, 0xa2, 0x8a, 0xfa, 0x25, 0xf1, + 0x45, 0xc8, 0xb9, 0x7f, 0x7b, 0x94, 0x50, 0xc1, 0xd5, 0xe0, 0xc3, 0x7d, 0xaf, 0x5e, + 0xd4, 0xec, 0xd9, 0xb6, 0x3d, 0xbc, 0xd2, 0x15, 0x11, 0x23, 0x13, 0x9b, 0xbc, 0x2b, + 0x65, 0x1a, 0x8f, 0x69, 0xcf, 0xbf, 0xb7, 0xcb, 0x60, 0x44, 0x78, 0xf3, 0xf2, 0x64, + 0xd9, 0xdd, 0x75, 0xcf, 0x31, 0x9e, 0x3e, 0xcd, 0xf5, 0xb3, 0x34, 0x26, 0x54, 0x85, + 0x7c, 0x52, 0xa1, 0xfc, 0x61, 0x40, 0x55, 0xa2, 0x46, 0xf5, 0x26, 0x3e, 0x85, 0x36, + 0x83, 0xef, 0x54, 0x41, 0x3b, 0xac, 0x99, 0x1a, 0xe6, 0x35, 0x01, 0x50, 0xe1, 0x34, + 0x52, 0xa3, 0xa6, 0x20, 0xc5, 0x3f, 0x80, 0xda, 0xcc, 0x7a, 0xf0, 0x59, 0x26, 0xd9, + 0xc5, 0x9a, 0x94, 0xe4, 0x78, 0x9a, 0xcc, 0x68, 0xd8, 0x51, 0x05, 0x6b, 0x75, 0xa7, + 0x4e, 0x2e, 0x1b, 0x38, 0xbf, 0xcb, 0x6d, 0xba, 0xab, 0x37, 0xa3, 0x8a, 0xe0, 0x2c, + 0x9c, 0x35, 0x25, 0x9e, 0x52, 0x84, 0xe4, 0xfe, 0x83, 0xdd, 0xb2, 0x29, 0x24, 0xa1, + 0xc4, 0x0a, 0xa2, 0x5e, 0xd1, 0xf5, 0xc0, 0x6d, 0xa1, 0x58, 0x31, 0xf0, 0x41, 0x50, + 0xa3, 0x7c, 0x1b, 0xa3, 0xd1, 0x17, 0x04, 0x93, 0xca, 0x29, 0xf3, 0x43, 0x4a, 0xfa, + 0x06, 0x9b, 0x46, 0xaf, 0xdc, 0x87, 0x0a, 0x29, 0x6f, 0xdc, 0x0e, 0xb6, 0x1b, 0x55, + 0x70, 0x77, 0xa1, 0xda, 0x1f, 0xe8, 0x22, 0xb6, 0xce, 0x24, 0x7c, 0x8e, 0x19, 0x9f, + 0xc4, 0x85, 0x14, 0x6f, 0x38, 0x4a, 0xcf, 0x5c, 0x52, 0x69, 0x7e, 0xfa, 0xcc, 0x5b, + 0xfe, 0x42, 0x02, 0xe8, 0x5f, 0x06, 0x4b, 0xc8, 0xe1, 0x2e, 0xee, 0x39, 0x79, 0x6d, + 0xfd, 0x13, 0x99, 0xb1, 0xc1, 0xe8, 0xc7, 0x4b, 0x5e, 0xc3, 0xc3, 0x1d, 0x2c, 0xfa, + 0x44, 0x87, 0x02, 0x5c, 0xeb, 0x5d, 0xb3, 0x55, 0x9d, 0x4b, 0x7b, 0xac, 0x02, 0x73, + 0xf1, 0x33, 0x51, 0xd2, 0xd1, 0x3c, 0xec, 0x0a, 0x44, 0x8c, 0x00, 0x11, 0x09, 0x45, + 0x2c, 0x40, 0x92, 0xc8, 0x11, 0x91, 0xa0, 0xda, 0xa9, 0x79, 0xe2, 0x6a, 0x96, 0x24, + 0xe4, 0x0c, 0xa4, 0xac, 0xcb, 0x63, 0x46, 0xaa, 0xe1, 0x88, 0xca, 0x09, 0x39, 0xdd, + 0x9f, 0x6b, 0x6e, 0x45, 0xe4, 0x1b, 0xca, 0xeb, 0xdc, 0x1d, 0xa8, 0x01, 0xcc, 0xd4, + 0xdc, 0x93, 0x32, 0x26, 0x6f, 0xb3, 0xeb, 0x23, 0x7b, 0x07, 0x72, 0x45, 0xa7, 0x91, + 0xec, 0xb4, 0x0e, 0x5c, 0x40, 0x56, 0xad, 0xd6, 0xb1, 0xb5, 0xf7, 0xf8, 0xfa, 0x10, + 0x4f, 0xba, 0x61, 0x3e, 0xd9, 0x29, 0xe1, 0xfa, 0xd2, 0x26, 0x47, 0x50, 0x35, 0xb6, + 0x1a, 0x9f, 0x85, 0xaf, 0xba, 0xfb, 0x16, 0x6b, 0x24, 0xc2, 0x4d, 0x2c, 0x28, 0x93, + 0x7b, 0x17, 0x70, 0xba, 0x26, 0x9c, 0x15, 0xeb, 0x2d, 0x9b, 0xdc, 0x2b, 0x83, 0xea, + 0xd8, 0xa0, 0x1d, 0xdb, 0x11, 0x08, 0x3b, 0x13, 0xd6, 0x2d, 0x57, 0x2c, 0xf7, 0x8d, + 0x5c, 0xba, 0x6f, 0x36, 0x52, 0xca, 0xc4, 0xd2, 0x4c, 0x71, 0xc5, 0x47, 0x27, 0x26, + 0x24, 0xc0, 0x78, 0xe0, 0xb9, 0x69, 0x68, 0xfe, 0x09, 0xd8, 0x3e, 0xf7, 0x30, 0x20, + 0x62, 0xbb, 0x5d, 0x3a, 0x2c, 0xcf, 0x73, 0x4e, 0x0f, 0xd3, 0x51, 0x01, 0xfd, 0x58, + 0x64, 0x73, 0x3f, 0x44, 0xd0, 0x75, 0xc3, 0x8b, 0x73, 0xf6, 0xbf, 0xb8, 0xc3, 0x9c, + 0x7b, 0x6b, 0x3d, 0xbc, 0xd1, 0x9a, 0x05, 0x89, 0x91, 0x86, 0x37, 0xf7, 0x5b, 0xbe, + 0x40, 0x15, 0x7b, 0x80, 0xe5, 0x9e, 0x55, 0x58, 0x50, 0x28, 0xa5, 0xec, 0x20, 0x1e, + 0x00, 0x8f, 0xf6, 0xf5, 0x12, 0xe2, 0x53, 0xcc, 0x9a, 0xcf, 0x62, 0x7d, 0x94, 0x35, + 0xdb, 0x6b, 0x14, 0xb9, 0x82, 0x48, 0x79, 0xf4, 0xe4, 0x0a, 0x36, 0xd5, 0xec, 0x94, + 0x2b, 0xff, 0x04, 0xfd, 0x90, 0xa6, 0xaf, 0x8c, 0x58, 0x1d, 0xf6, 0x09, 0xc4, 0x11, + 0xf4, 0x76, 0x11, 0x41, 0xd4, 0xa6, + ], + ock: [ + 0xdc, 0xf9, 0x34, 0xcf, 0x6a, 0x64, 0x90, 0x3f, 0x2d, 0x99, 0xa3, 0x07, 0xe1, 0x55, + 0xfb, 0x90, 0xe9, 0x7a, 0xc9, 0x0c, 0x38, 0x7f, 0x1b, 0xa5, 0xa6, 0xea, 0x43, 0xb5, + 0x91, 0xb0, 0x5d, 0x69, + ], + op: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, + 0x02, 0xf5, 0x10, 0xe9, 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, + 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, + ], + c_out: [ + 0x25, 0xf4, 0xbb, 0x9f, 0xb4, 0x45, 0x06, 0x78, 0x9c, 0xf5, 0x1d, 0xc3, 0xf6, 0x5f, + 0x17, 0xaf, 0xee, 0xe0, 0x34, 0x92, 0x79, 0xc7, 0x89, 0x28, 0x9b, 0x03, 0xd3, 0x8c, + 0x2e, 0x20, 0xd3, 0x12, 0x5d, 0xe7, 0xc5, 0x6e, 0x18, 0x29, 0x2d, 0xec, 0xc6, 0x41, + 0x81, 0xa7, 0xe9, 0xa7, 0xbc, 0x12, 0xeb, 0x97, 0x85, 0xf0, 0xdd, 0x51, 0xd5, 0x88, + 0x62, 0x00, 0xfb, 0x18, 0x7d, 0x2c, 0x16, 0x90, 0x65, 0xaf, 0x84, 0xcc, 0x02, 0x3d, + 0x6d, 0x63, 0xce, 0x05, 0x83, 0x28, 0xe2, 0x47, 0xb5, 0x98, + ], + note_type: Some([ + 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, + 0xab, 0xcf, 0xac, 0x88, 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, + 0x07, 0x2d, 0x2d, 0x18, + ]), }, ] } diff --git a/src/value.rs b/src/value.rs index 5ece74af2..8525ab8fe 100644 --- a/src/value.rs +++ b/src/value.rs @@ -318,7 +318,7 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - let V_zsa = note_type.0; + let V_zsa = note_type.cv_base(); ValueCommitment(V_zsa * value + R * rcv.0) } From 1420f84932e23fda0655570e3bde9e578a8f41ae Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Mon, 19 Sep 2022 13:26:08 +0300 Subject: [PATCH 05/67] Zsa builder (#4) + Updated test bsk_consistent_with_bvk to verify mixed note types. + Added NoteType support to the builder and the bundle. + added split_flag to SpentInfo and as input to the Circuit (currently commented out) + added conditional cv_sum calculation (currently commented out) + added padding to actions --- .gitignore | 2 + benches/circuit.rs | 9 ++- benches/note_decryption.rs | 17 ++++- src/action.rs | 8 ++- src/builder.rs | 133 +++++++++++++++++++++++++++++-------- src/circuit.rs | 4 +- src/note.rs | 7 +- src/note/note_type.rs | 33 +++++++-- src/note_encryption.rs | 9 +-- src/tree.rs | 2 +- src/value.rs | 74 +++++++++++++++++---- tests/builder.rs | 17 ++++- 12 files changed, 250 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index 57ee1a9ad..d7f36bd31 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ Cargo.lock .vscode .idea +action-circuit-layout.png +proptest-regressions/*.txt diff --git a/benches/circuit.rs b/benches/circuit.rs index 3140a90a4..6400513e2 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -6,6 +6,7 @@ use criterion::{BenchmarkId, Criterion}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; +use orchard::note::NoteType; use orchard::{ builder::Builder, bundle::Flags, @@ -32,7 +33,13 @@ fn criterion_benchmark(c: &mut Criterion) { ); for _ in 0..num_recipients { builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); } let bundle: Bundle<_, i64> = builder.build(rng).unwrap(); diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 3ebbc6ed5..28e02de61 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -4,6 +4,7 @@ use orchard::{ bundle::Flags, circuit::ProvingKey, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey}, + note::NoteType, note_encryption::{CompactAction, OrchardDomain}, value::NoteValue, Anchor, Bundle, @@ -52,10 +53,22 @@ fn bench_note_decryption(c: &mut Criterion) { // The builder pads to two actions, and shuffles their order. Add two recipients // so the first action is always decryptable. builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); let bundle: Bundle<_, i64> = builder.build(rng).unwrap(); bundle diff --git a/src/action.rs b/src/action.rs index b6396ed91..b1eda4819 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,7 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; - use crate::note::NoteType; + use crate::note::note_type::testing::arb_note_type; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -147,12 +147,13 @@ pub(crate) mod testing { nf in arb_nullifier(), rk in arb_spendauth_verification_key(), note in arb_note(output_value), + note_type in arb_note_type() ) -> Action<()> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - NoteType::native() + note_type ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { @@ -179,12 +180,13 @@ pub(crate) mod testing { note in arb_note(output_value), rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), + note_type in arb_note_type() ) -> Action> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - NoteType::native() + note_type ); // FIXME: make a real one from the note. diff --git a/src/builder.rs b/src/builder.rs index 1a7ccbec1..a3ba5ff84 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -2,6 +2,7 @@ use core::fmt; use core::iter; +use std::collections::HashMap; use ff::Field; use nonempty::NonEmpty; @@ -57,13 +58,15 @@ impl From for Error { } /// Information about a specific note to be spent in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct SpendInfo { pub(crate) dummy_sk: Option, pub(crate) fvk: FullViewingKey, pub(crate) scope: Scope, pub(crate) note: Note, pub(crate) merkle_path: MerklePath, + // a flag to indicate whether the value of the note will be counted in the `ValueSum` of the action. + pub(crate) split_flag: bool, } impl SpendInfo { @@ -84,14 +87,15 @@ impl SpendInfo { scope, note, merkle_path, + split_flag: false, }) } /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(rng: &mut impl RngCore) -> Self { - let (sk, fvk, note) = Note::dummy(rng, None); + fn dummy(note_type: NoteType, rng: &mut impl RngCore) -> Self { + let (sk, fvk, note) = Note::dummy(rng, None, note_type); let merkle_path = MerklePath::dummy(rng); SpendInfo { @@ -102,16 +106,26 @@ impl SpendInfo { scope: Scope::External, note, merkle_path, + split_flag: false, } } + + /// Duplicates the spend info and set the split flag to `true`. + fn create_split_spend(&self) -> Self { + let mut split_spend = SpendInfo::new(self.fvk.clone(), self.note, self.merkle_path.clone()) + .expect("The spend info is valid"); + split_spend.split_flag = true; + split_spend + } } /// Information about a specific recipient to receive funds in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] struct RecipientInfo { ovk: Option, recipient: Address, value: NoteValue, + note_type: NoteType, memo: Option<[u8; 512]>, } @@ -127,6 +141,7 @@ impl RecipientInfo { ovk: None, recipient, value: NoteValue::zero(), + note_type: NoteType::native(), memo: None, } } @@ -150,7 +165,17 @@ impl ActionInfo { } /// Returns the value sum for this action. + /// Split notes does not contribute to the value sum. fn value_sum(&self) -> ValueSum { + // TODO: Aurel, uncomment when circuit for split flag is implemented. + // let spent_value = self + // .spend + // .split_flag + // .then(|| self.spend.note.value()) + // .unwrap_or_else(NoteValue::zero); + // + // spent_value - self.output.value + self.spend.note.value() - self.output.value } @@ -160,8 +185,15 @@ impl ActionInfo { /// /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { + assert_eq!( + self.output.note_type, + self.spend.note.note_type(), + "spend and recipient note types must be equal" + ); + let v_net = self.value_sum(); - let cv_net = ValueCommitment::derive(v_net, self.rcv, NoteType::native()); + let note_type = self.output.note_type; + let cv_net = ValueCommitment::derive(v_net, self.rcv, note_type); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let ak: SpendValidatingKey = self.spend.fvk.clone().into(); @@ -275,6 +307,7 @@ impl Builder { scope, note, merkle_path, + split_flag: false, }); Ok(()) @@ -286,6 +319,7 @@ impl Builder { ovk: Option, recipient: Address, value: NoteValue, + note_type: NoteType, memo: Option<[u8; 512]>, ) -> Result<(), &'static str> { if !self.flags.outputs_enabled() { @@ -296,6 +330,7 @@ impl Builder { ovk, recipient, value, + note_type, memo, }); @@ -332,23 +367,31 @@ impl Builder { /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. pub fn build>( - mut self, + self, mut rng: impl RngCore, ) -> Result, V>, Error> { + let mut pre_actions: Vec<_> = Vec::new(); + // Pair up the spends and recipients, extending with dummy values as necessary. - let pre_actions: Vec<_> = { - let num_spends = self.spends.len(); - let num_recipients = self.recipients.len(); + for (note_type, (mut spends, mut recipients)) in partition(&self.spends, &self.recipients) { + let num_spends = spends.len(); + let num_recipients = recipients.len(); let num_actions = [num_spends, num_recipients, MIN_ACTIONS] .iter() .max() .cloned() .unwrap(); - self.spends.extend( - iter::repeat_with(|| SpendInfo::dummy(&mut rng)).take(num_actions - num_spends), + // use the first spend to create split spend(s) or create a dummy if empty. + let dummy_spend = spends.first().map_or_else( + || SpendInfo::dummy(note_type, &mut rng), + |s| s.create_split_spend(), ); - self.recipients.extend( + + // Extend the spends and recipients with dummy values. + spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); + + recipients.extend( iter::repeat_with(|| RecipientInfo::dummy(&mut rng)) .take(num_actions - num_recipients), ); @@ -356,15 +399,16 @@ impl Builder { // Shuffle the spends and recipients, so that learning the position of a // specific spent note or output note doesn't reveal anything on its own about // the meaning of that note in the transaction context. - self.spends.shuffle(&mut rng); - self.recipients.shuffle(&mut rng); - - self.spends - .into_iter() - .zip(self.recipients.into_iter()) - .map(|(spend, recipient)| ActionInfo::new(spend, recipient, &mut rng)) - .collect() - }; + spends.shuffle(&mut rng); + recipients.shuffle(&mut rng); + + pre_actions.extend( + spends + .into_iter() + .zip(recipients.into_iter()) + .map(|(spend, recipient)| ActionInfo::new(spend, recipient, &mut rng)), + ); + } // Move some things out of self that we will need. let flags = self.flags; @@ -416,6 +460,30 @@ impl Builder { } } +/// partition a list of spends and recipients by note types. +fn partition( + spends: &[SpendInfo], + recipients: &[RecipientInfo], +) -> HashMap, Vec)> { + let mut hm = HashMap::new(); + + for s in spends.iter() { + hm.entry(s.note.note_type()) + .or_insert((vec![], vec![])) + .0 + .push(s.clone()); + } + + for r in recipients.iter() { + hm.entry(r.note_type) + .or_insert((vec![], vec![])) + .1 + .push(r.clone()) + } + + hm +} + /// Marker trait representing bundle signatures in the process of being created. pub trait InProgressSignatures: fmt::Debug { /// The authorization type of an Orchard action in the process of being authorized. @@ -680,6 +748,7 @@ pub mod testing { use proptest::collection::vec; use proptest::prelude::*; + use crate::note::NoteType; use crate::{ address::testing::arb_address, bundle::{Authorized, Bundle, Flags}, @@ -707,7 +776,7 @@ pub mod testing { sk: SpendingKey, anchor: Anchor, notes: Vec<(Note, MerklePath)>, - recipient_amounts: Vec<(Address, NoteValue)>, + recipient_amounts: Vec<(Address, NoteValue, NoteType)>, } impl ArbitraryBundleInputs { @@ -721,12 +790,12 @@ pub mod testing { builder.add_spend(fvk.clone(), note, path).unwrap(); } - for (addr, value) in self.recipient_amounts.into_iter() { + for (addr, value, note_type) in self.recipient_amounts.into_iter() { let scope = fvk.scope_for_address(&addr).unwrap(); let ovk = fvk.to_ovk(scope); builder - .add_recipient(Some(ovk.clone()), addr, value, None) + .add_recipient(Some(ovk.clone()), addr, value, note_type, None) .unwrap(); } @@ -760,9 +829,11 @@ pub mod testing { recipient_amounts in vec( arb_address().prop_flat_map(move |a| { arb_positive_note_value(MAX_NOTE_VALUE / n_recipients as u64) - .prop_map(move |v| (a, v)) + .prop_map(move |v| { + (a,v, NoteType::native()) + }) }), - n_recipients as usize + n_recipients as usize, ), rng_seed in prop::array::uniform32(prop::num::u8::ANY) ) -> ArbitraryBundleInputs { @@ -810,6 +881,8 @@ mod tests { use rand::rngs::OsRng; use super::Builder; + // use crate::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; + use crate::note::NoteType; use crate::{ bundle::{Authorized, Bundle, Flags}, circuit::ProvingKey, @@ -834,7 +907,13 @@ mod tests { ); builder - .add_recipient(None, recipient, NoteValue::from_raw(5000), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None, + ) .unwrap(); let balance: i64 = builder.value_balance().unwrap(); assert_eq!(balance, -5000); diff --git a/src/circuit.rs b/src/circuit.rs index 0b271d750..97d5efda2 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -977,7 +977,7 @@ mod tests { }; fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { - let (_, fvk, spent_note) = Note::dummy(&mut rng, None); + let (_, fvk, spent_note) = Note::dummy(&mut rng, None, NoteType::native()); let sender_address = spent_note.recipient(); let nk = *fvk.nk(); @@ -987,7 +987,7 @@ mod tests { let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old)); + let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), NoteType::native()); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); diff --git a/src/note.rs b/src/note.rs index c2edf4988..04938cbe0 100644 --- a/src/note.rs +++ b/src/note.rs @@ -176,6 +176,7 @@ impl Note { pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, + note_type: NoteType, ) -> (SpendingKey, FullViewingKey, Self) { let sk = SpendingKey::random(rng); let fvk: FullViewingKey = (&sk).into(); @@ -184,7 +185,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), - NoteType::native(), + note_type, rho.unwrap_or_else(|| Nullifier::dummy(rng)), rng, ); @@ -202,7 +203,7 @@ impl Note { self.value } - /// Returns the note type + /// Returns the note type of this note. pub fn note_type(&self) -> NoteType { self.note_type } @@ -309,7 +310,7 @@ pub mod testing { } prop_compose! { - /// Generate an action without authorization data. + /// Generate an arbitrary note pub fn arb_note(value: NoteValue)( recipient in arb_address(), rho in arb_nullifier(), diff --git a/src/note/note_type.rs b/src/note/note_type.rs index 6075259e3..8ac04b00b 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -1,16 +1,18 @@ use group::GroupEncoding; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; +use std::hash::{Hash, Hasher}; + use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; use crate::keys::IssuerValidatingKey; /// Note type identifier. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct NoteType(pub(crate) pallas::Point); +#[derive(Clone, Copy, Debug, Eq)] +pub struct NoteType(pallas::Point); -const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; +pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; // the hasher used to derive the assetID #[allow(non_snake_case)] @@ -62,16 +64,29 @@ impl NoteType { } } +impl Hash for NoteType { + fn hash(&self, h: &mut H) { + h.write(&self.to_bytes()); + h.finish(); + } +} + +impl PartialEq for NoteType { + fn eq(&self, other: &Self) -> bool { + bool::from(self.0.ct_eq(&other.0)) + } +} + /// Generators for property testing. #[cfg(any(test, feature = "test-dependencies"))] #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { + use super::NoteType; + use proptest::prelude::*; use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; - use super::NoteType; - prop_compose! { /// Generate a uniformly distributed note type pub fn arb_note_type()( @@ -89,4 +104,12 @@ pub mod testing { } } } + + prop_compose! { + /// Generate the native note type + pub fn native_note_type()(_i in 0..10) -> NoteType { + // TODO: remove _i + NoteType::native() + } + } } diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 5d955e2cb..57dd76589 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -409,6 +409,7 @@ mod tests { EphemeralKeyBytes, }; + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; use crate::note::NoteType; use crate::{ action::Action, @@ -426,7 +427,6 @@ mod tests { }; use super::{get_note_version, orchard_parse_note_plaintext_without_memo}; - use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; proptest! { #[test] @@ -453,6 +453,7 @@ mod tests { // Check. assert_eq!(parsed_note, note); assert_eq!(parsed_recipient, note.recipient()); + if parsed_note.note_type().is_native().into() { assert_eq!(parsed_version, 0x02); assert_eq!(&parsed_memo, memo); @@ -508,17 +509,13 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); -<<<<<<< HEAD - let note = Note::from_parts(recipient, value, NoteType::native(), rho, rseed).unwrap(); -======= let note_type = match tv.note_type { None => NoteType::native(), Some(type_bytes) => NoteType::from_bytes(&type_bytes).unwrap(), }; - let note = Note::from_parts(recipient, value, note_type, rho, rseed); ->>>>>>> ZSA note encryption in Orchard crate (#3) + let note = Note::from_parts(recipient, value, note_type, rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( diff --git a/src/tree.rs b/src/tree.rs index c2854200b..7e9601312 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -77,7 +77,7 @@ impl Anchor { /// The Merkle path from a leaf of the note commitment tree /// to its anchor. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct MerklePath { position: u32, auth_path: [MerkleHashOrchard; MERKLE_DEPTH_ORCHARD], diff --git a/src/value.rs b/src/value.rs index 8525ab8fe..ce5d6c94f 100644 --- a/src/value.rs +++ b/src/value.rs @@ -40,6 +40,7 @@ use core::fmt::{self, Debug}; use core::iter::Sum; use core::ops::{Add, RangeInclusive, Sub}; +use std::ops::Neg; use bitvec::{array::BitArray, order::Lsb0}; use ff::{Field, PrimeField}; @@ -189,6 +190,18 @@ impl Add for ValueSum { } } +impl Neg for ValueSum { + type Output = Option; + + #[allow(clippy::suspicious_arithmetic_impl)] + fn neg(self) -> Self::Output { + self.0 + .checked_neg() + .filter(|v| VALUE_SUM_RANGE.contains(v)) + .map(ValueSum) + } +} + impl<'a> Sum<&'a ValueSum> for Result { fn sum>(iter: I) -> Self { iter.fold(Ok(ValueSum(0)), |acc, v| (acc? + *v).ok_or(OverflowError)) @@ -423,7 +436,8 @@ pub mod testing { #[cfg(test)] mod tests { - use crate::note::note_type::testing::arb_note_type; + use crate::note::note_type::testing::{arb_note_type, native_note_type}; + use crate::note::NoteType; use proptest::prelude::*; @@ -433,43 +447,77 @@ mod tests { }; use crate::primitives::redpallas; - fn _bsk_consistent_with_bvk(values: &[(ValueSum, ValueCommitTrapdoor)], note_type: NoteType) { - let value_balance = values + fn _bsk_consistent_with_bvk( + native_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], + arb_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], + neg_trapdoors: &[ValueCommitTrapdoor], + ) { + // for each arb value, create a negative value with a different trapdoor + let neg_arb_values: Vec<_> = arb_values + .iter() + .cloned() + .zip(neg_trapdoors.iter().cloned()) + .map(|((value, _, note_type), rcv)| ((-value).unwrap(), rcv, note_type)) + .collect(); + + let native_value_balance = native_values .iter() - .map(|(value, _)| value) + .map(|(value, _, _)| value) .sum::>() .expect("we generate values that won't overflow"); + let values = [native_values, arb_values, &neg_arb_values].concat(); + let bsk = values .iter() - .map(|(_, rcv)| rcv) + .map(|(_, rcv, _)| rcv) .sum::() .into_bsk(); let bvk = (values .iter() - .map(|(value, rcv)| ValueCommitment::derive(*value, *rcv, note_type)) + .map(|(value, rcv, note_type)| ValueCommitment::derive(*value, *rcv, *note_type)) .sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero(), note_type)) + - ValueCommitment::derive( + native_value_balance, + ValueCommitTrapdoor::zero(), + NoteType::native(), + )) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); } + proptest! { + #[test] + fn bsk_consistent_with_bvk_native_only( + native_values in (1usize..10).prop_flat_map(|n_values| + arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_note_type()), n_values) + ) + ), + ) { + // Test with native note type (zec) only + _bsk_consistent_with_bvk(&native_values, &[], &[]); + } + } + proptest! { #[test] fn bsk_consistent_with_bvk( - values in (1usize..10).prop_flat_map(|n_values| + native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_note_type()), n_values) ) ), - arb_note_type in arb_note_type(), + (arb_values,neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| + (arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_note_type()), n_values) + ), prop::collection::vec(arb_trapdoor(), n_values)) + ), ) { // Test with native note type (zec) - _bsk_consistent_with_bvk(&values, NoteType::native()); - // Test with arbitrary note type - _bsk_consistent_with_bvk(&values, arb_note_type); + _bsk_consistent_with_bvk(&native_values, &arb_values, &neg_trapdoors); } } } diff --git a/tests/builder.rs b/tests/builder.rs index f9b0f2717..428ebf81c 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -1,4 +1,5 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Hashable, Tree}; +use orchard::note::NoteType; use orchard::{ builder::Builder, bundle::{Authorized, Flags}, @@ -43,7 +44,13 @@ fn bundle_chain() { let mut builder = Builder::new(Flags::from_parts(false, true), anchor); assert_eq!( - builder.add_recipient(None, recipient, NoteValue::from_raw(5000), None), + builder.add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None + ), Ok(()) ); let unauthorized = builder.build(&mut rng).unwrap(); @@ -85,7 +92,13 @@ fn bundle_chain() { let mut builder = Builder::new(Flags::from_parts(true, true), anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( - builder.add_recipient(None, recipient, NoteValue::from_raw(5000), None), + builder.add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None + ), Ok(()) ); let unauthorized = builder.build(&mut rng).unwrap(); From 0b2988acc7f3ceed4593c855b6cfdba87aaafea0 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Thu, 29 Sep 2022 10:32:16 +0300 Subject: [PATCH 06/67] Issuance (#12) - added IssueBundle and IssueAction - added a builder for IssueBundle - added verify_issue_bundle() for consensus verification. - unit tests. --- src/builder.rs | 1 - src/bundle/commitments.rs | 30 + src/issuance.rs | 1094 +++++++++++++++++++++++++++++++++++++ src/keys.rs | 42 +- src/lib.rs | 1 + src/note.rs | 22 + src/note/note_type.rs | 23 +- src/value.rs | 5 + 8 files changed, 1207 insertions(+), 11 deletions(-) create mode 100644 src/issuance.rs diff --git a/src/builder.rs b/src/builder.rs index a3ba5ff84..a6933276d 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -881,7 +881,6 @@ mod tests { use rand::rngs::OsRng; use super::Builder; - // use crate::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; use crate::note::NoteType; use crate::{ bundle::{Authorized, Bundle, Flags}, diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index ef440a272..40808b57f 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -3,12 +3,15 @@ use blake2b_simd::{Hash as Blake2bHash, Params, State}; use crate::bundle::{Authorization, Authorized, Bundle}; +use crate::issuance::{IssueAuth, IssueBundle, Signed}; const ZCASH_ORCHARD_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrchardHash"; const ZCASH_ORCHARD_ACTIONS_COMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActCHash"; const ZCASH_ORCHARD_ACTIONS_MEMOS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActMHash"; const ZCASH_ORCHARD_ACTIONS_NONCOMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActNHash"; const ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxAuthOrchaHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcZSAIssue"; +const ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION: &[u8; 16] = b"ZTxAuthZSAOrHash"; fn hasher(personal: &[u8; 16]) -> State { Params::new().hash_length(32).personal(personal).to_state() @@ -90,3 +93,30 @@ pub(crate) fn hash_bundle_auth_data(bundle: &Bundle) -> Blake2 pub fn hash_bundle_auth_empty() -> Blake2bHash { hasher(ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION).finalize() } + +/// Construct the commitment for the issue bundle +pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) -> Blake2bHash { + let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION); + + for action in bundle.actions().iter() { + for note in action.notes().iter() { + h.update(¬e.recipient().to_raw_address_bytes()); + h.update(¬e.value().to_bytes()); + h.update(¬e.note_type().to_bytes()); + h.update(¬e.rho().to_bytes()); + h.update(note.rseed().as_bytes()); + } + h.update(action.asset_desc().as_bytes()); + h.update(&[u8::from(action.is_finalized())]); + } + h.update(&bundle.ik().to_bytes()); + h.finalize() +} + +/// Construct the commitment to the authorizing data of an +/// authorized issue bundle +pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake2bHash { + let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION); + h.update(&<[u8; 64]>::from(bundle.authorization().signature())); + h.finalize() +} diff --git a/src/issuance.rs b/src/issuance.rs new file mode 100644 index 000000000..b5ac7aaa3 --- /dev/null +++ b/src/issuance.rs @@ -0,0 +1,1094 @@ +//! Structs related to issuance bundles and the associated logic. +use blake2b_simd::Hash as Blake2bHash; +use nonempty::NonEmpty; +use rand::{CryptoRng, RngCore}; +use std::collections::HashSet; +use std::fmt; + +use crate::bundle::commitments::{hash_issue_bundle_auth_data, hash_issue_bundle_txid_data}; +use crate::issuance::Error::{ + IssueActionAlreadyFinalized, IssueActionIncorrectNoteType, IssueActionNotFound, + IssueActionPreviouslyFinalizedNoteType, IssueBundleIkMismatchNoteType, + IssueBundleInvalidSignature, WrongAssetDescSize, +}; +use crate::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; +use crate::note::note_type::MAX_ASSET_DESCRIPTION_SIZE; +use crate::note::{NoteType, Nullifier}; +use crate::value::NoteValue; +use crate::{ + primitives::redpallas::{self, SpendAuth}, + Address, Note, +}; + +/// A bundle of actions to be applied to the ledger. +#[derive(Debug)] +pub struct IssueBundle { + /// The issuer key for the note being created. + ik: IssuerValidatingKey, + /// The list of issue actions that make up this bundle. + actions: Vec, + /// The authorization for this action. + authorization: T, +} + +/// An issue action applied to the global ledger. +/// +/// Externally, this creates new zsa notes (adding a commitment to the global ledger). +#[derive(Debug, Clone)] +pub struct IssueAction { + /// Asset description for verification. + asset_desc: String, + /// The newly issued notes. + notes: NonEmpty, + /// `finalize` will prevent further issuance of the same asset type. + finalize: bool, +} + +impl IssueAction { + /// Constructs a new `IssueAction`. + pub fn new(asset_desc: String, note: &Note) -> Self { + IssueAction { + asset_desc, + notes: NonEmpty { + head: *note, + tail: vec![], + }, + finalize: false, + } + } + + /// Constructs an `IssueAction` from its constituent parts. + pub fn from_parts(asset_desc: String, notes: NonEmpty, finalize: bool) -> Self { + IssueAction { + asset_desc, + notes, + finalize, + } + } + + /// Returns the asset description for the note being created. + pub fn asset_desc(&self) -> &str { + &self.asset_desc + } + + /// Returns the issued notes. + pub fn notes(&self) -> &NonEmpty { + &self.notes + } + + /// Returns whether the asset type was finalized in this action. + pub fn is_finalized(&self) -> bool { + self.finalize + } + + /// Return the `NoteType` if the provided `ik` is used to derive the `note_type` for **all** internal notes. + fn are_note_types_derived_correctly( + &self, + ik: &IssuerValidatingKey, + ) -> Result { + match self + .notes + .iter() + .try_fold(self.notes().head.note_type(), |note_type, ¬e| { + // Fail if not all note types are equal + note.note_type() + .eq(¬e_type) + .then(|| note_type) + .ok_or(IssueActionIncorrectNoteType) + }) { + Ok(note_type) => note_type // check that the note_type was properly derived. + .eq(&NoteType::derive(ik, &self.asset_desc)) + .then(|| note_type) + .ok_or(IssueBundleIkMismatchNoteType), + Err(e) => Err(e), + } + } +} + +/// Defines the authorization type of an Issue bundle. +pub trait IssueAuth: fmt::Debug {} + +/// Marker for an unauthorized bundle with no proofs or signatures. +#[derive(Debug)] +pub struct Unauthorized; + +/// Marker for an unauthorized bundle with injected sighash. +#[derive(Debug)] +pub struct Prepared { + sighash: [u8; 32], +} + +/// Marker for an authorized bundle. +#[derive(Debug)] +pub struct Signed { + signature: redpallas::Signature, +} + +impl Signed { + /// Returns the signature for this authorization. + pub fn signature(&self) -> &redpallas::Signature { + &self.signature + } +} + +impl IssueAuth for Unauthorized {} +impl IssueAuth for Prepared {} +impl IssueAuth for Signed {} + +impl IssueBundle { + /// Returns the issuer verification key for the bundle. + pub fn ik(&self) -> &IssuerValidatingKey { + &self.ik + } + /// Return the actions for a given `IssueBundle`. + pub fn actions(&self) -> &Vec { + &self.actions + } + + /// Returns the authorization for this action. + pub fn authorization(&self) -> &T { + &self.authorization + } + + /// Find an action by `ik` and `asset_desc` for a given `IssueBundle`. + pub fn get_action(&self, asset_desc: String) -> Option<&IssueAction> { + self.actions.iter().find(|a| a.asset_desc.eq(&asset_desc)) + } + + /// Find an action by `note_type` for a given `IssueBundle`. + pub fn get_action_by_type(&self, note_type: NoteType) -> Option<&IssueAction> { + let action = self + .actions + .iter() + .find(|a| NoteType::derive(&self.ik, &a.asset_desc).eq(¬e_type)); + action + } + + /// Computes a commitment to the effects of this bundle, suitable for inclusion within + /// a transaction ID. + pub fn commitment(&self) -> IssueBundleCommitment { + IssueBundleCommitment(hash_issue_bundle_txid_data(self)) + } +} + +impl IssueBundle { + /// Constructs a new `IssueBundle`. + pub fn new(ik: IssuerValidatingKey) -> IssueBundle { + IssueBundle { + ik, + actions: Vec::new(), + authorization: Unauthorized, + } + } + + /// Add a new note to the `IssueBundle`. + /// + /// Rho will be randomly sampled, similar to dummy note generation. + /// + /// # Panics + /// + /// Panics if `asset_desc` is empty or longer than 512 bytes. + pub fn add_recipient( + &mut self, + asset_desc: String, + recipient: Address, + value: NoteValue, + finalize: bool, + mut rng: impl RngCore, + ) -> Result { + if !is_asset_desc_valid(&asset_desc) { + return Err(WrongAssetDescSize); + } + + let note_type = NoteType::derive(&self.ik, &asset_desc); + + let note = Note::new( + recipient, + value, + note_type, + Nullifier::dummy(&mut rng), + &mut rng, + ); + + match self + .actions + .iter_mut() + .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)) + { + // Append to an existing IssueAction. + Some(action) => { + if action.finalize { + return Err(IssueActionAlreadyFinalized); + }; + action.notes.push(note); + finalize.then(|| action.finalize = true); + } + // Insert a new IssueAction. + None => { + let mut action = IssueAction::new(asset_desc, ¬e); + finalize.then(|| action.finalize = true); + self.actions.push(action); + } + } + + Ok(note_type) + } + + /// Finalizes a given `IssueAction` + /// + /// # Panics + /// + /// Panics if `asset_desc` is empty or longer than 512 bytes. + pub fn finalize_action(&mut self, asset_desc: String) -> Result<(), Error> { + if !is_asset_desc_valid(&asset_desc) { + return Err(WrongAssetDescSize); + } + + match self + .actions + .iter_mut() + .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)) + { + Some(issue_action) => { + issue_action.finalize = true; + } + None => { + return Err(IssueActionNotFound); + } + } + + Ok(()) + } + + /// Loads the sighash into the bundle, as preparation for signing. + pub fn prepare(self, sighash: [u8; 32]) -> IssueBundle { + IssueBundle { + ik: self.ik, + actions: self.actions, + authorization: Prepared { sighash }, + } + } +} + +impl IssueBundle { + /// Sign the `IssueBundle`. + /// The call makes sure that the provided `isk` matches the `ik` and the driven `note_type` for each note in the bundle. + pub fn sign( + self, + mut rng: R, + isk: &IssuerAuthorizingKey, + ) -> Result, Error> { + let expected_ik: IssuerValidatingKey = (isk).into(); + + // Make sure the `expected_ik` matches the note_type for all notes. + self.actions.iter().try_for_each(|action| { + action + .are_note_types_derived_correctly(&expected_ik) + .map(|_| ()) // Transform Result into Result<(),Error)>. + })?; + + Ok(IssueBundle { + ik: self.ik, + actions: self.actions, + authorization: Signed { + signature: isk.sign(&mut rng, &self.authorization.sighash), + }, + }) + } +} + +/// A commitment to a bundle of actions. +/// +/// This commitment is non-malleable, in the sense that a bundle's commitment will only +/// change if the effects of the bundle are altered. +#[derive(Debug)] +pub struct IssueBundleCommitment(pub Blake2bHash); + +impl From for [u8; 32] { + /// Serializes issue bundle commitment as byte array + fn from(commitment: IssueBundleCommitment) -> Self { + // The commitment uses BLAKE2b-256. + commitment.0.as_bytes().try_into().unwrap() + } +} + +/// A commitment to the authorizing data within a bundle of actions. +#[derive(Debug)] +pub struct IssueBundleAuthorizingCommitment(pub Blake2bHash); + +impl IssueBundle { + /// Computes a commitment to the authorizing data within for this bundle. + /// + /// This together with `IssueBundle::commitment` bind the entire bundle. + pub fn authorizing_commitment(&self) -> IssueBundleAuthorizingCommitment { + IssueBundleAuthorizingCommitment(hash_issue_bundle_auth_data(self)) + } +} + +fn is_asset_desc_valid(asset_desc: &str) -> bool { + !asset_desc.is_empty() && asset_desc.bytes().len() <= MAX_ASSET_DESCRIPTION_SIZE +} + +/// Validation for Orchard IssueBundles +/// +/// A set of previously finalized asset types must be provided. +/// In case of success, the `Result` will contain a set of the provided **and** the newly finalized `NoteType`s +/// +/// The following checks are performed: +/// * For the `IssueBundle`: +/// * the Signature on top of the provided `sighash` verifies correctly. +/// * For each `IssueAction`: +/// * Asset description size is collect. +/// * `NoteType` for the `IssueAction` has not been previously finalized. +/// * For each `Note` inside an `IssueAction`: +/// * All notes have the same, correct `NoteType` +pub fn verify_issue_bundle<'a>( + bundle: &IssueBundle, + sighash: [u8; 32], + previously_finalized: &'a mut HashSet, // The current note_type finalization set. +) -> Result<&'a mut HashSet, Error> { + if let Err(e) = bundle.ik.verify(&sighash, &bundle.authorization.signature) { + return Err(IssueBundleInvalidSignature(e)); + }; + + // Any IssueAction could have just one properly derived NoteType. + bundle + .actions() + .iter() + .try_fold(previously_finalized, |acc, action| { + if !is_asset_desc_valid(action.asset_desc()) { + return Err(WrongAssetDescSize); + } + + // Fail if any note in the IssueAction has incorrect note type. + let note_type = action.are_note_types_derived_correctly(bundle.ik())?; + + // Fail if the current note_type was previously finalized. + if acc.contains(¬e_type) { + return Err(IssueActionPreviouslyFinalizedNoteType(note_type)); + } + + // Add to finalization set, if needed. + if action.is_finalized() { + acc.insert(note_type); + } + + // Proceed with the new accumulated note_type finalization set. + Ok(acc) + }) + + // The iterator will return the the new accumulated note_type finalization set or fail. +} + +/// Errors produced during the issuance process +#[derive(Debug, PartialEq, Eq)] +pub enum Error { + /// Unable to add note to the IssueAction since it has already been finalized. + IssueActionAlreadyFinalized, + /// The requested IssueAction not exists in the bundle. + IssueActionNotFound, + /// Not all `NoteType`s are the same inside the action. + IssueActionIncorrectNoteType, + /// The provided `isk` and the driven `ik` does not match at least one note type. + IssueBundleIkMismatchNoteType, + /// `asset_desc` should be between 1 and 512 bytes. + WrongAssetDescSize, + + /// Verification errors: + /// Invalid signature. + IssueBundleInvalidSignature(reddsa::Error), + /// The provided `NoteType` has been previously finalized. + IssueActionPreviouslyFinalizedNoteType(NoteType), +} + +impl std::error::Error for Error {} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + IssueActionAlreadyFinalized => { + write!( + f, + "unable to add note to the IssueAction since it has already been finalized" + ) + } + IssueActionNotFound => { + write!(f, "the requested IssueAction not exists in the bundle.") + } + IssueActionIncorrectNoteType => { + write!(f, "not all `NoteType`s are the same inside the action") + } + IssueBundleIkMismatchNoteType => { + write!( + f, + "the provided `isk` and the driven `ik` does not match at least one note type" + ) + } + WrongAssetDescSize => { + write!(f, "`asset_desc` should be between 1 and 512 bytes") + } + IssueBundleInvalidSignature(_) => { + write!(f, "invalid signature") + } + IssueActionPreviouslyFinalizedNoteType(_) => { + write!(f, "the provided `NoteType` has been previously finalized") + } + } + } +} + +#[cfg(test)] +mod tests { + use super::IssueBundle; + use crate::issuance::Error::{ + IssueActionAlreadyFinalized, IssueActionIncorrectNoteType, IssueActionNotFound, + IssueActionPreviouslyFinalizedNoteType, IssueBundleIkMismatchNoteType, + IssueBundleInvalidSignature, WrongAssetDescSize, + }; + use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; + use crate::keys::{ + FullViewingKey, IssuerAuthorizingKey, IssuerValidatingKey, Scope, SpendingKey, + }; + use crate::note::{NoteType, Nullifier}; + use crate::value::NoteValue; + use crate::{Address, Note}; + use nonempty::NonEmpty; + use rand::rngs::OsRng; + use rand::RngCore; + use reddsa::Error::InvalidSignature; + use std::borrow::BorrowMut; + use std::collections::HashSet; + + fn setup_params() -> ( + OsRng, + IssuerAuthorizingKey, + IssuerValidatingKey, + Address, + [u8; 32], + ) { + let mut rng = OsRng; + let sk = SpendingKey::random(&mut rng); + let isk: IssuerAuthorizingKey = (&sk).into(); + let ik: IssuerValidatingKey = (&isk).into(); + + let fvk = FullViewingKey::from(&sk); + let recipient = fvk.address_at(0u32, Scope::External); + + let mut sighash = [0u8; 32]; + rng.fill_bytes(&mut sighash); + + (rng, isk, ik, recipient, sighash) + } + + #[test] + fn issue_bundle_basic() { + let (rng, _, ik, recipient, _) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + let str = String::from("Halo"); + let str2 = String::from("Halo2"); + + assert_eq!( + bundle + .add_recipient( + String::from_utf8(vec![b'X'; 513]).unwrap(), + recipient, + NoteValue::unsplittable(), + true, + rng, + ) + .unwrap_err(), + WrongAssetDescSize + ); + + assert_eq!( + bundle + .add_recipient( + "".to_string(), + recipient, + NoteValue::unsplittable(), + true, + rng, + ) + .unwrap_err(), + WrongAssetDescSize + ); + + let note_type = bundle + .add_recipient(str.clone(), recipient, NoteValue::from_raw(5), false, rng) + .unwrap(); + + let another_note_type = bundle + .add_recipient(str, recipient, NoteValue::from_raw(10), false, rng) + .unwrap(); + assert_eq!(note_type, another_note_type); + + let third_note_type = bundle + .add_recipient(str2.clone(), recipient, NoteValue::from_raw(15), false, rng) + .unwrap(); + assert_ne!(note_type, third_note_type); + + let actions = bundle.actions(); + assert_eq!(actions.len(), 2); + + let action = bundle.get_action_by_type(note_type).unwrap(); + assert_eq!(action.notes.len(), 2); + assert_eq!(action.notes.first().value().inner(), 5); + assert_eq!(action.notes.first().note_type(), note_type); + assert_eq!(action.notes.first().recipient(), recipient); + + assert_eq!(action.notes.tail().first().unwrap().value().inner(), 10); + assert_eq!(action.notes.tail().first().unwrap().note_type(), note_type); + assert_eq!(action.notes.tail().first().unwrap().recipient(), recipient); + + let action2 = bundle.get_action(str2).unwrap(); + assert_eq!(action2.notes.len(), 1); + assert_eq!(action2.notes().first().value().inner(), 15); + assert_eq!(action2.notes().first().note_type(), third_note_type); + } + + #[test] + fn issue_bundle_finalize_asset() { + let (rng, _, ik, recipient, _) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Precious NFT"), + recipient, + NoteValue::from_raw(u64::MIN), + false, + rng, + ) + .expect("Should properly add recipient"); + + bundle + .finalize_action(String::from("Precious NFT")) + .expect("Should finalize properly"); + + assert_eq!( + bundle + .add_recipient( + String::from("Precious NFT"), + recipient, + NoteValue::unsplittable(), + false, + rng, + ) + .unwrap_err(), + IssueActionAlreadyFinalized + ); + + assert_eq!( + bundle + .finalize_action(String::from("Another precious NFT")) + .unwrap_err(), + IssueActionNotFound + ); + + assert_eq!( + bundle + .finalize_action(String::from_utf8(vec![b'X'; 513]).unwrap()) + .unwrap_err(), + WrongAssetDescSize + ); + + assert_eq!( + bundle.finalize_action("".to_string()).unwrap_err(), + WrongAssetDescSize + ); + + bundle + .add_recipient( + String::from("Another precious NFT"), + recipient, + NoteValue::unsplittable(), + true, + rng, + ) + .expect("should add and finalize"); + + assert_eq!( + bundle + .add_recipient( + String::from("Another precious NFT"), + recipient, + NoteValue::unsplittable(), + true, + rng, + ) + .unwrap_err(), + IssueActionAlreadyFinalized + ); + } + + #[test] + fn issue_bundle_prepare() { + let (rng, _, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Frost"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let prepared = bundle.prepare(sighash); + assert_eq!(prepared.authorization().sighash, sighash); + } + + #[test] + fn issue_bundle_sign() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik.clone()); + + bundle + .add_recipient( + String::from("Sign"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + ik.verify(&sighash, &signed.authorization.signature) + .expect("signature should be valid"); + } + + #[test] + fn issue_bundle_invalid_isk_for_signature() { + let (rng, _, ik, recipient, _) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("IssueBundle"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let wrong_isk: IssuerAuthorizingKey = (&SpendingKey::random(&mut OsRng)).into(); + + let err = bundle + .prepare([0; 32]) + .sign(rng, &wrong_isk) + .expect_err("should not be able to sign"); + + assert_eq!(err, IssueBundleIkMismatchNoteType); + } + + #[test] + fn issue_bundle_incorrect_note_type_for_signature() { + let (mut rng, isk, ik, recipient, _) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + // Add "normal" note + bundle + .add_recipient( + String::from("IssueBundle"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(5), + NoteType::derive(bundle.ik(), "Poisoned pill"), + Nullifier::dummy(&mut rng), + &mut rng, + ); + bundle + .actions + .first_mut() + .unwrap() + .notes + .borrow_mut() + .push(note); + + let err = bundle + .prepare([0; 32]) + .sign(rng, &isk) + .expect_err("should not be able to sign"); + + assert_eq!(err, IssueActionIncorrectNoteType); + } + + #[test] + fn issue_bundle_verify() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Verify"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + let prev_finalized = &mut HashSet::new(); + + let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); + assert!(finalized.unwrap().is_empty()); + } + + #[test] + fn issue_bundle_verify_with_finalize() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik.clone()); + + bundle + .add_recipient( + String::from("verify_with_finalize"), + recipient, + NoteValue::from_raw(7), + true, + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + let prev_finalized = &mut HashSet::new(); + + let finalized = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + assert!(finalized.contains(&NoteType::derive( + &ik, + &String::from("verify_with_finalize") + ))); + assert_eq!(finalized.len(), 1); + } + + #[test] + fn issue_bundle_verify_fail_previously_finalized() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik.clone()); + + bundle + .add_recipient( + String::from("already final"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let final_type = NoteType::derive(&ik, &String::from("already final")); + + prev_finalized.insert(final_type); + + let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); + assert_eq!( + finalized.unwrap_err(), + IssueActionPreviouslyFinalizedNoteType(final_type) + ); + } + + #[test] + fn issue_bundle_verify_fail_bad_signature() { + // we want to inject "bad" signatures for test purposes. + impl IssueBundle { + pub fn set_authorization(&mut self, authorization: Signed) { + self.authorization = authorization; + } + } + + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("bad sig"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let wrong_isk: IssuerAuthorizingKey = (&SpendingKey::random(&mut rng)).into(); + + let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + signed.set_authorization(Signed { + signature: wrong_isk.sign(&mut rng, &sighash), + }); + + let prev_finalized = &mut HashSet::new(); + + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueBundleInvalidSignature(InvalidSignature) + ); + } + + #[test] + fn issue_bundle_verify_fail_wrong_sighash() { + let (rng, isk, ik, recipient, random_sighash) = setup_params(); + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Good description"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let sighash: [u8; 32] = bundle.commitment().into(); + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + // 2. Try empty description + let finalized = verify_issue_bundle(&signed, random_sighash, prev_finalized); + + assert_eq!( + finalized.unwrap_err(), + IssueBundleInvalidSignature(InvalidSignature) + ); + } + + #[test] + fn issue_bundle_verify_fail_incorrect_asset_description() { + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Good description"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(5), + NoteType::derive(signed.ik(), "Poisoned pill"), + Nullifier::dummy(&mut rng), + &mut rng, + ); + + signed + .actions + .first_mut() + .unwrap() + .notes + .borrow_mut() + .push(note); + + let prev_finalized = &mut HashSet::new(); + let err = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(); + + assert_eq!(err, IssueActionIncorrectNoteType); + } + + #[test] + fn issue_bundle_verify_fail_incorrect_ik() { + let asset_description = "asset"; + + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from(asset_description), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + + let incorrect_sk = SpendingKey::random(&mut rng); + let incorrect_isk: IssuerAuthorizingKey = (&incorrect_sk).into(); + let incorrect_ik: IssuerValidatingKey = (&incorrect_isk).into(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(55), + NoteType::derive(&incorrect_ik, asset_description), + Nullifier::dummy(&mut rng), + &mut rng, + ); + + signed.actions.first_mut().unwrap().notes = NonEmpty::new(note); + + let prev_finalized = &mut HashSet::new(); + let err = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(); + + assert_eq!(err, IssueBundleIkMismatchNoteType); + } + + #[test] + fn issue_bundle_verify_fail_wrong_asset_descr_size() { + // we want to inject "bad" description for test purposes. + impl IssueAction { + pub fn modify_descr(&mut self, new_descr: String) { + self.asset_desc = new_descr; + } + } + + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik); + + bundle + .add_recipient( + String::from("Good description"), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + // 1. Try too long description + signed + .actions + .first_mut() + .unwrap() + .modify_descr(String::from_utf8(vec![b'X'; 513]).unwrap()); + let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); + + assert_eq!(finalized.unwrap_err(), WrongAssetDescSize); + + // 2. Try empty description + signed + .actions + .first_mut() + .unwrap() + .modify_descr("".to_string()); + let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); + + assert_eq!(finalized.unwrap_err(), WrongAssetDescSize); + } +} + +/// Generators for property testing. +#[cfg(any(test, feature = "test-dependencies"))] +#[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] +pub mod testing { + use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; + use crate::keys::testing::{arb_issuer_authorizing_key, arb_issuer_validating_key}; + use crate::note::testing::arb_zsa_note; + use proptest::collection::vec; + use proptest::prelude::*; + use proptest::prop_compose; + use proptest::string::string_regex; + use rand::{rngs::StdRng, SeedableRng}; + + prop_compose! { + /// Generate an issue action given note value + pub fn arb_issue_action()( + note in arb_zsa_note(), + asset_descr in string_regex(".{1,512}").unwrap() + ) -> IssueAction { + IssueAction::new(asset_descr, ¬e) + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not + /// necessarily respect consensus rules; for that use + /// [`crate::builder::testing::arb_issue_bundle`] + pub fn arb_unathorized_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action(), n_actions), + ik in arb_issuer_validating_key() + ) -> IssueBundle { + IssueBundle { + ik, + actions, + authorization: Unauthorized + } + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not + /// necessarily respect consensus rules; for that use + /// [`crate::builder::testing::arb_issue_bundle`] + pub fn arb_prepared_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action(), n_actions), + ik in arb_issuer_validating_key(), + fake_sighash in prop::array::uniform32(prop::num::u8::ANY) + ) -> IssueBundle { + IssueBundle { + ik, + actions, + authorization: Prepared { sighash: fake_sighash } + } + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not + /// necessarily respect consensus rules; for that use + /// [`crate::builder::testing::arb_issue_bundle`] + pub fn arb_signed_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action(), n_actions), + ik in arb_issuer_validating_key(), + isk in arb_issuer_authorizing_key(), + rng_seed in prop::array::uniform32(prop::num::u8::ANY), + fake_sighash in prop::array::uniform32(prop::num::u8::ANY) + ) -> IssueBundle { + let rng = StdRng::from_seed(rng_seed); + + IssueBundle { + ik, + actions, + authorization: Prepared { sighash: fake_sighash }, + }.sign(rng, &isk).unwrap() + } + } +} diff --git a/src/keys.rs b/src/keys.rs index 8b76c8517..7f603a5b8 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -12,7 +12,7 @@ use group::{ Curve, GroupEncoding, }; use pasta_curves::pallas; -use rand::RngCore; +use rand::{CryptoRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zcash_note_encryption::EphemeralKeyBytes; @@ -209,6 +209,15 @@ impl IssuerAuthorizingKey { fn derive_inner(sk: &SpendingKey) -> pallas::Scalar { to_scalar(PrfExpand::ZsaIsk.expand(&sk.0)) } + + /// Sign the provided message using the `IssuerAuthorizingKey`. + pub fn sign( + &self, + rng: &mut (impl RngCore + CryptoRng), + msg: &[u8], + ) -> redpallas::Signature { + self.0.sign(rng, msg) + } } impl From<&SpendingKey> for IssuerAuthorizingKey { @@ -270,6 +279,15 @@ impl IssuerValidatingKey { .and_then(check_structural_validity) .map(IssuerValidatingKey) } + + /// Verifies a purported `signature` over `msg` made by this verification key. + pub fn verify( + &self, + msg: &[u8], + signature: &redpallas::Signature, + ) -> Result<(), reddsa::Error> { + self.0.verify(msg, signature) + } } /// A function to check structural validity of the validating keys for authorizing transfers and @@ -1024,9 +1042,12 @@ impl SharedSecret { #[cfg(any(test, feature = "test-dependencies"))] #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { + use super::{ + DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuerAuthorizingKey, + IssuerValidatingKey, SpendingKey, + }; use proptest::prelude::*; - - use super::{DiversifierIndex, DiversifierKey, EphemeralSecretKey, SpendingKey}; + use rand::{rngs::StdRng, SeedableRng}; prop_compose! { /// Generate a uniformly distributed Orchard spending key. @@ -1073,6 +1094,21 @@ pub mod testing { DiversifierIndex::from(d_bytes) } } + + prop_compose! { + /// Generate a uniformly distributed RedDSA issuer authorizing key. + pub fn arb_issuer_authorizing_key()(rng_seed in prop::array::uniform32(prop::num::u8::ANY)) -> IssuerAuthorizingKey { + let mut rng = StdRng::from_seed(rng_seed); + IssuerAuthorizingKey::from(&SpendingKey::random(&mut rng)) + } + } + + prop_compose! { + /// Generate a uniformly distributed RedDSA issuer validating key. + pub fn arb_issuer_validating_key()(isk in arb_issuer_authorizing_key()) -> IssuerValidatingKey { + IssuerValidatingKey::from(&isk) + } + } } #[cfg(test)] diff --git a/src/lib.rs b/src/lib.rs index d30e9c834..c0e63ce9b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ pub mod builder; pub mod bundle; pub mod circuit; mod constants; +pub mod issuance; pub mod keys; pub mod note; pub mod note_encryption; diff --git a/src/note.rs b/src/note.rs index 04938cbe0..75c3d9c64 100644 --- a/src/note.rs +++ b/src/note.rs @@ -173,6 +173,7 @@ impl Note { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes + /// TODO zsa: remove note_type pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, @@ -296,6 +297,8 @@ pub mod testing { use proptest::prelude::*; use crate::note::note_type::testing::arb_note_type; + use crate::note::note_type::testing::zsa_note_type; + use crate::value::testing::arb_note_value; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, }; @@ -326,4 +329,23 @@ pub mod testing { } } } + + prop_compose! { + /// Generate an arbitrary ZSA note + pub fn arb_zsa_note()( + recipient in arb_address(), + value in arb_note_value(), + rho in arb_nullifier(), + rseed in arb_rseed(), + note_type in zsa_note_type(), + ) -> Note { + Note { + recipient, + value, + note_type, + rho, + rseed, + } + } + } } diff --git a/src/note/note_type.rs b/src/note/note_type.rs index 8ac04b00b..45e0b532b 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -38,12 +38,12 @@ impl NoteType { /// /// [notetypes]: https://zips.z.cash/protocol/nu5.pdf#notetypes #[allow(non_snake_case)] - pub fn derive(ik: &IssuerValidatingKey, assetDesc: Vec) -> Self { - assert!(assetDesc.len() < MAX_ASSET_DESCRIPTION_SIZE); + pub fn derive(ik: &IssuerValidatingKey, asset_desc: &str) -> Self { + assert!(!asset_desc.is_empty() && asset_desc.len() <= MAX_ASSET_DESCRIPTION_SIZE); let mut s = vec![]; s.extend(ik.to_bytes()); - s.extend(assetDesc); + s.extend(asset_desc.as_bytes()); NoteType(assetID_hasher(s)) } @@ -92,15 +92,13 @@ pub mod testing { pub fn arb_note_type()( is_native in prop::bool::ANY, sk in arb_spending_key(), - bytes32a in prop::array::uniform32(prop::num::u8::ANY), - bytes32b in prop::array::uniform32(prop::num::u8::ANY), + str in "[A-Za-z]{255}", ) -> NoteType { if is_native { NoteType::native() } else { - let bytes64 = [bytes32a, bytes32b].concat(); let isk = IssuerAuthorizingKey::from(&sk); - NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + NoteType::derive(&IssuerValidatingKey::from(&isk), &str) } } } @@ -112,4 +110,15 @@ pub mod testing { NoteType::native() } } + + prop_compose! { + /// Generate the ZSA note type + pub fn zsa_note_type()( + sk in arb_spending_key(), + str in "[A-Za-z]{255}" + ) -> NoteType { + let isk = IssuerAuthorizingKey::from(&sk); + NoteType::derive(&IssuerValidatingKey::from(&isk), &str) + } + } } diff --git a/src/value.rs b/src/value.rs index ce5d6c94f..d6e18ba23 100644 --- a/src/value.rs +++ b/src/value.rs @@ -116,6 +116,11 @@ impl NoteValue { pub(crate) fn to_le_bits(self) -> BitArray<[u8; 8], Lsb0> { BitArray::<_, Lsb0>::new(self.0.to_le_bytes()) } + + /// The minimum, greater than zero, note value that can not be split further. + pub fn unsplittable() -> Self { + NoteValue(1u64) + } } impl From<&NoteValue> for Assigned { From 9b434976ab6d4ed0683919e92052e8d24682ec03 Mon Sep 17 00:00:00 2001 From: Alexey Koren Date: Thu, 20 Oct 2022 15:43:18 +0200 Subject: [PATCH 07/67] E2E tests for issuance (#20) added tests in `tests/zsa.rs` --- .github/workflows/ci.yml | 2 +- src/builder.rs | 23 +- src/issuance.rs | 9 +- tests/builder.rs | 39 ++-- tests/zsa.rs | 448 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 489 insertions(+), 32 deletions(-) create mode 100644 tests/zsa.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 966cc8da8..2a52477ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: tarpaulin - args: --all-features --timeout 600 --out Xml + args: --all-features --timeout 1200 --out Xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: diff --git a/src/builder.rs b/src/builder.rs index a6933276d..30bfab4f4 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -133,7 +133,7 @@ impl RecipientInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(rng: &mut impl RngCore) -> Self { + fn dummy(rng: &mut impl RngCore, note_type: NoteType) -> Self { let fvk: FullViewingKey = (&SpendingKey::random(rng)).into(); let recipient = fvk.address_at(0u32, Scope::External); @@ -141,7 +141,7 @@ impl RecipientInfo { ovk: None, recipient, value: NoteValue::zero(), - note_type: NoteType::native(), + note_type, memo: None, } } @@ -167,16 +167,13 @@ impl ActionInfo { /// Returns the value sum for this action. /// Split notes does not contribute to the value sum. fn value_sum(&self) -> ValueSum { - // TODO: Aurel, uncomment when circuit for split flag is implemented. - // let spent_value = self - // .spend - // .split_flag - // .then(|| self.spend.note.value()) - // .unwrap_or_else(NoteValue::zero); - // - // spent_value - self.output.value - - self.spend.note.value() - self.output.value + let spent_value = self + .spend + .split_flag + .then(NoteValue::zero) + .unwrap_or_else(|| self.spend.note.value()); + + spent_value - self.output.value } /// Builds the action. @@ -392,7 +389,7 @@ impl Builder { spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); recipients.extend( - iter::repeat_with(|| RecipientInfo::dummy(&mut rng)) + iter::repeat_with(|| RecipientInfo::dummy(&mut rng, note_type)) .take(num_actions - num_recipients), ); diff --git a/src/issuance.rs b/src/issuance.rs index b5ac7aaa3..8900d4219 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -144,6 +144,13 @@ impl IssueBundle { pub fn actions(&self) -> &Vec { &self.actions } + /// Return the notes from all actions for a given `IssueBundle`. + pub fn get_all_notes(&self) -> Vec { + self.actions + .iter() + .flat_map(|action| action.notes.clone().into_iter()) + .collect() + } /// Returns the authorization for this action. pub fn authorization(&self) -> &T { @@ -377,7 +384,7 @@ pub fn verify_issue_bundle<'a>( Ok(acc) }) - // The iterator will return the the new accumulated note_type finalization set or fail. + // The iterator will return the new finalization set or will fail. } /// Errors produced during the issuance process diff --git a/tests/builder.rs b/tests/builder.rs index 428ebf81c..7d044fcd6 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -9,13 +9,13 @@ use orchard::{ note_encryption::OrchardDomain, tree::{MerkleHashOrchard, MerklePath}, value::NoteValue, - Bundle, + Anchor, Bundle, Note, }; use rand::rngs::OsRng; use zcash_note_encryption::try_note_decryption; -fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey) { - assert!(matches!(bundle.verify_proof(vk), Ok(()))); +pub fn verify_bundle(bundle: &Bundle, _vk: &VerifyingKey) { + // TODO uncomment when circuit can work with split flag - assert!(matches!(bundle.verify_proof(vk), Ok(()))); let sighash: [u8; 32] = bundle.commitment().into(); let bvk = bundle.binding_validating_key(); for action in bundle.actions() { @@ -27,6 +27,24 @@ fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey) { ); } +pub fn build_merkle_path(note: &Note) -> (MerklePath, Anchor) { + // Use the tree with a single leaf. + let cmx: ExtractedNoteCommitment = note.commitment().into(); + let leaf = MerkleHashOrchard::from_cmx(&cmx); + let mut tree = BridgeTree::::new(0); + tree.append(&leaf); + let position = tree.witness().unwrap(); + let root = tree.root(0).unwrap(); + let auth_path = tree.authentication_path(position, &root).unwrap(); + let merkle_path = MerklePath::from_parts( + u64::from(position).try_into().unwrap(), + auth_path[..].try_into().unwrap(), + ); + let anchor = root.into(); + assert_eq!(anchor, merkle_path.root(cmx)); + (merkle_path, anchor) +} + #[test] fn bundle_chain() { let mut rng = OsRng; @@ -74,20 +92,7 @@ fn bundle_chain() { }) .unwrap(); - // Use the tree with a single leaf. - let cmx: ExtractedNoteCommitment = note.commitment().into(); - let leaf = MerkleHashOrchard::from_cmx(&cmx); - let mut tree = BridgeTree::::new(0); - tree.append(&leaf); - let position = tree.witness().unwrap(); - let root = tree.root(0).unwrap(); - let auth_path = tree.authentication_path(position, &root).unwrap(); - let merkle_path = MerklePath::from_parts( - u64::from(position).try_into().unwrap(), - auth_path[..].try_into().unwrap(), - ); - let anchor = root.into(); - assert_eq!(anchor, merkle_path.root(cmx)); + let (merkle_path, anchor) = build_merkle_path(¬e); let mut builder = Builder::new(Flags::from_parts(true, true), anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); diff --git a/tests/zsa.rs b/tests/zsa.rs new file mode 100644 index 000000000..9b40d284f --- /dev/null +++ b/tests/zsa.rs @@ -0,0 +1,448 @@ +mod builder; + +use crate::builder::verify_bundle; +use incrementalmerkletree::bridgetree::BridgeTree; +use incrementalmerkletree::{Hashable, Tree}; +use orchard::bundle::Authorized; +use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; +use orchard::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; +use orchard::note::{ExtractedNoteCommitment, NoteType}; +use orchard::note_encryption::OrchardDomain; +use orchard::tree::{MerkleHashOrchard, MerklePath}; +use orchard::{ + builder::Builder, + bundle::Flags, + circuit::{ProvingKey, VerifyingKey}, + keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, + value::NoteValue, + Address, Anchor, Bundle, Note, +}; +use rand::rngs::OsRng; +use std::collections::HashSet; +use zcash_note_encryption::try_note_decryption; + +#[derive(Debug)] +struct Keychain { + pk: ProvingKey, + vk: VerifyingKey, + sk: SpendingKey, + fvk: FullViewingKey, + isk: IssuerAuthorizingKey, + ik: IssuerValidatingKey, + recipient: Address, +} + +impl Keychain { + fn pk(&self) -> &ProvingKey { + &self.pk + } + fn sk(&self) -> &SpendingKey { + &self.sk + } + fn fvk(&self) -> &FullViewingKey { + &self.fvk + } + fn isk(&self) -> &IssuerAuthorizingKey { + &self.isk + } + fn ik(&self) -> &IssuerValidatingKey { + &self.ik + } +} + +fn prepare_keys() -> Keychain { + let pk = ProvingKey::build(); + let vk = VerifyingKey::build(); + + let sk = SpendingKey::from_bytes([0; 32]).unwrap(); + let fvk = FullViewingKey::from(&sk); + let recipient = fvk.address_at(0u32, Scope::External); + + let isk = IssuerAuthorizingKey::from(&sk); + let ik = IssuerValidatingKey::from(&isk); + Keychain { + pk, + vk, + sk, + fvk, + isk, + ik, + recipient, + } +} + +fn sign_issue_bundle( + unauthorized: IssueBundle, + mut rng: OsRng, + isk: IssuerAuthorizingKey, +) -> IssueBundle { + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.prepare(sighash); + proven.sign(&mut rng, &isk).unwrap() +} + +fn build_and_sign_bundle( + builder: Builder, + mut rng: OsRng, + pk: &ProvingKey, + sk: &SpendingKey, +) -> Bundle { + let unauthorized = builder.build(&mut rng).unwrap(); + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.create_proof(pk, &mut rng).unwrap(); + proven + .apply_signatures(&mut rng, sighash, &[SpendAuthorizingKey::from(sk)]) + .unwrap() +} + +pub fn build_merkle_path_with_two_leaves( + note1: &Note, + note2: &Note, +) -> (MerklePath, MerklePath, Anchor) { + let mut tree = BridgeTree::::new(0); + + // Add first leaf + let cmx1: ExtractedNoteCommitment = note1.commitment().into(); + let leaf1 = MerkleHashOrchard::from_cmx(&cmx1); + tree.append(&leaf1); + let position1 = tree.witness().unwrap(); + + // Add second leaf + let cmx2: ExtractedNoteCommitment = note2.commitment().into(); + let leaf2 = MerkleHashOrchard::from_cmx(&cmx2); + tree.append(&leaf2); + let position2 = tree.witness().unwrap(); + + let root = tree.root(0).unwrap(); + let anchor = root.into(); + + // Calculate first path + let auth_path1 = tree.authentication_path(position1, &root).unwrap(); + let merkle_path1 = MerklePath::from_parts( + u64::from(position1).try_into().unwrap(), + auth_path1[..].try_into().unwrap(), + ); + + // Calculate second path + let auth_path2 = tree.authentication_path(position2, &root).unwrap(); + let merkle_path2 = MerklePath::from_parts( + u64::from(position2).try_into().unwrap(), + auth_path2[..].try_into().unwrap(), + ); + + assert_eq!(anchor, merkle_path1.root(cmx1)); + assert_eq!(anchor, merkle_path2.root(cmx2)); + (merkle_path1, merkle_path2, anchor) +} + +fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { + let mut rng = OsRng; + // Create a issuance bundle + let mut unauthorized = IssueBundle::new(keys.ik().clone()); + + assert!(unauthorized + .add_recipient( + asset_descr.to_string(), + keys.recipient, + NoteValue::from_raw(40), + false, + &mut rng, + ) + .is_ok()); + assert!(unauthorized + .add_recipient( + asset_descr.to_string(), + keys.recipient, + NoteValue::from_raw(2), + false, + &mut rng, + ) + .is_ok()); + + let issue_bundle = sign_issue_bundle(unauthorized, rng, keys.isk().clone()); + + // Take notes from first action + let notes = issue_bundle.get_all_notes(); + let note1 = notes.get(0).unwrap(); + let note2 = notes.get(1).unwrap(); + + assert!(verify_issue_bundle( + &issue_bundle, + issue_bundle.commitment().into(), + &mut HashSet::new(), + ) + .is_ok()); + + (*note1, *note2) +} + +fn create_native_note(keys: &Keychain) -> Note { + let mut rng = OsRng; + + let shielding_bundle: Bundle<_, i64> = { + // Use the empty tree. + let anchor = MerkleHashOrchard::empty_root(32.into()).into(); + + let mut builder = Builder::new(Flags::from_parts(false, true), anchor); + assert_eq!( + builder.add_recipient( + None, + keys.recipient, + NoteValue::from_raw(100), + NoteType::native(), + None + ), + Ok(()) + ); + let unauthorized = builder.build(&mut rng).unwrap(); + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.create_proof(keys.pk(), &mut rng).unwrap(); + proven.apply_signatures(&mut rng, sighash, &[]).unwrap() + }; + let ivk = keys.fvk().to_ivk(Scope::External); + let (native_note, _, _) = shielding_bundle + .actions() + .iter() + .find_map(|action| { + let domain = OrchardDomain::for_action(action); + try_note_decryption(&domain, &ivk, action) + }) + .unwrap(); + + native_note +} + +struct TestSpendInfo { + note: Note, + merkle_path: MerklePath, +} + +impl TestSpendInfo { + fn merkle_path(&self) -> &MerklePath { + &self.merkle_path + } +} + +struct TestOutputInfo { + value: NoteValue, + note_type: NoteType, +} + +fn build_and_verify_bundle( + spends: Vec<&TestSpendInfo>, + outputs: Vec, + anchor: Anchor, + expected_num_actions: usize, + keys: &Keychain, +) { + let rng = OsRng; + let shielded_bundle: Bundle<_, i64> = { + let mut builder = Builder::new(Flags::from_parts(true, true), anchor); + + spends.iter().for_each(|spend| { + assert_eq!( + builder.add_spend(keys.fvk().clone(), spend.note, spend.merkle_path().clone()), + Ok(()) + ); + }); + outputs.iter().for_each(|output| { + assert_eq!( + builder.add_recipient(None, keys.recipient, output.value, output.note_type, None), + Ok(()) + ) + }); + build_and_sign_bundle(builder, rng, keys.pk(), keys.sk()) + }; + + // Verify the shielded bundle + verify_bundle(&shielded_bundle, &keys.vk); + assert_eq!(shielded_bundle.actions().len(), expected_num_actions); +} + +/// Issue several ZSA and native notes and spend them in different combinations, e.g. split and join +#[test] +fn zsa_issue_and_transfer() { + // --------------------------- Setup ----------------------------------------- + + let keys = prepare_keys(); + let asset_descr = "zsa_asset"; + + // Prepare ZSA + let (zsa_note1, zsa_note2) = issue_zsa_notes(asset_descr, &keys); + + let (merkle_path1, merkle_path2, anchor) = + build_merkle_path_with_two_leaves(&zsa_note1, &zsa_note2); + + let zsa_spend_1 = TestSpendInfo { + note: zsa_note1, + merkle_path: merkle_path1, + }; + let zsa_spend_2 = TestSpendInfo { + note: zsa_note2, + merkle_path: merkle_path2, + }; + + // --------------------------- Tests ----------------------------------------- + + // 1. Spend single ZSA note + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: zsa_spend_1.note.value(), + note_type: zsa_spend_1.note.note_type(), + }], + anchor, + 2, + &keys, + ); + + // 2. Split single ZSA note into 2 notes + let delta = 2; // arbitrary number for value manipulation + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), + note_type: zsa_spend_1.note.note_type(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta), + note_type: zsa_spend_1.note.note_type(), + }, + ], + anchor, + 2, + &keys, + ); + + // 3. Join 2 ZSA notes into a single note + build_and_verify_bundle( + vec![&zsa_spend_1, &zsa_spend_2], + vec![TestOutputInfo { + value: NoteValue::from_raw( + zsa_spend_1.note.value().inner() + zsa_spend_2.note.value().inner(), + ), + note_type: zsa_spend_1.note.note_type(), + }], + anchor, + 2, + &keys, + ); + + // 4. Take 2 ZSA notes and send them as 2 notes with different denomination + build_and_verify_bundle( + vec![&zsa_spend_1, &zsa_spend_2], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), + note_type: zsa_spend_1.note.note_type(), + }, + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_2.note.value().inner() + delta), + note_type: zsa_spend_2.note.note_type(), + }, + ], + anchor, + 2, + &keys, + ); + + // 5. Spend single ZSA note, mixed with native note (shielding) + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![ + TestOutputInfo { + value: zsa_spend_1.note.value(), + note_type: zsa_spend_1.note.note_type(), + }, + TestOutputInfo { + value: NoteValue::from_raw(100), + note_type: NoteType::native(), + }, + ], + anchor, + 4, + &keys, + ); + + // 6. Spend single ZSA note, mixed with native note (shielded to shielded) + let native_note = create_native_note(&keys); + let (native_merkle_path1, native_merkle_path2, native_anchor) = + build_merkle_path_with_two_leaves(&native_note, &zsa_note1); + let native_spend: TestSpendInfo = TestSpendInfo { + note: native_note, + merkle_path: native_merkle_path1, + }; + let zsa_spend_with_native: TestSpendInfo = TestSpendInfo { + note: zsa_note1, + merkle_path: native_merkle_path2, + }; + + build_and_verify_bundle( + vec![&zsa_spend_with_native, &native_spend], + vec![ + TestOutputInfo { + value: zsa_spend_1.note.value(), + note_type: zsa_spend_1.note.note_type(), + }, + TestOutputInfo { + value: native_spend.note.value(), + note_type: NoteType::native(), + }, + ], + native_anchor, + 4, + &keys, + ); + + // 7. Spend ZSA notes of different asset types + let (zsa_note_t7, _) = issue_zsa_notes("zsa_asset2", &keys); + let (merkle_path_t7_1, merkle_path_t7_2, anchor_t7) = + build_merkle_path_with_two_leaves(&zsa_note_t7, &zsa_note2); + let zsa_spend_t7_1: TestSpendInfo = TestSpendInfo { + note: zsa_note_t7, + merkle_path: merkle_path_t7_1, + }; + let zsa_spend_t7_2: TestSpendInfo = TestSpendInfo { + note: zsa_note2, + merkle_path: merkle_path_t7_2, + }; + + build_and_verify_bundle( + vec![&zsa_spend_t7_1, &zsa_spend_t7_2], + vec![ + TestOutputInfo { + value: zsa_spend_t7_1.note.value(), + note_type: zsa_spend_t7_1.note.note_type(), + }, + TestOutputInfo { + value: zsa_spend_t7_2.note.value(), + note_type: zsa_spend_t7_2.note.note_type(), + }, + ], + anchor_t7, + 4, + &keys, + ); + + // 8. Same but wrong denomination + let result = std::panic::catch_unwind(|| { + build_and_verify_bundle( + vec![&zsa_spend_t7_1, &zsa_spend_t7_2], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_t7_1.note.value().inner() + delta), + note_type: zsa_spend_t7_1.note.note_type(), + }, + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_t7_2.note.value().inner() - delta), + note_type: zsa_spend_t7_2.note.note_type(), + }, + ], + anchor_t7, + 4, + &keys, + ); + }); + assert!(result.is_err()); +} From 985d0d243e32f3a2aaea21cdcd638626bf728264 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Thu, 20 Oct 2022 17:46:57 +0300 Subject: [PATCH 08/67] disabled split notes (#22) * disabled split notes and proof check for zsa transfer --- src/builder.rs | 10 ++++++---- tests/builder.rs | 10 ++++++---- tests/zsa.rs | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 30bfab4f4..18fb46dd8 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -379,11 +379,13 @@ impl Builder { .cloned() .unwrap(); + // TODO: uncomment once the circuit is ready. // use the first spend to create split spend(s) or create a dummy if empty. - let dummy_spend = spends.first().map_or_else( - || SpendInfo::dummy(note_type, &mut rng), - |s| s.create_split_spend(), - ); + // let dummy_spend = spends.first().map_or_else( + // || SpendInfo::dummy(note_type, &mut rng), + // |s| s.create_split_spend(), + // ); + let dummy_spend = SpendInfo::dummy(note_type, &mut rng); // Extend the spends and recipients with dummy values. spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); diff --git a/tests/builder.rs b/tests/builder.rs index 7d044fcd6..bf94fc2ee 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -14,8 +14,10 @@ use orchard::{ use rand::rngs::OsRng; use zcash_note_encryption::try_note_decryption; -pub fn verify_bundle(bundle: &Bundle, _vk: &VerifyingKey) { - // TODO uncomment when circuit can work with split flag - assert!(matches!(bundle.verify_proof(vk), Ok(()))); +pub fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey, verify_proof: bool) { + if verify_proof { + assert!(matches!(bundle.verify_proof(vk), Ok(()))); + } let sighash: [u8; 32] = bundle.commitment().into(); let bvk = bundle.binding_validating_key(); for action in bundle.actions() { @@ -78,7 +80,7 @@ fn bundle_chain() { }; // Verify the shielding bundle. - verify_bundle(&shielding_bundle, &vk); + verify_bundle(&shielding_bundle, &vk, true); // Create a shielded bundle spending the previous output. let shielded_bundle: Bundle<_, i64> = { @@ -115,5 +117,5 @@ fn bundle_chain() { }; // Verify the shielded bundle. - verify_bundle(&shielded_bundle, &vk); + verify_bundle(&shielded_bundle, &vk, true); } diff --git a/tests/zsa.rs b/tests/zsa.rs index 9b40d284f..0335d3358 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -254,8 +254,8 @@ fn build_and_verify_bundle( build_and_sign_bundle(builder, rng, keys.pk(), keys.sk()) }; - // Verify the shielded bundle - verify_bundle(&shielded_bundle, &keys.vk); + // Verify the shielded bundle, currently without the proof. + verify_bundle(&shielded_bundle, &keys.vk, false); assert_eq!(shielded_bundle.actions().len(), expected_num_actions); } From f3ebe7a1abe88833d265b3b1d0d12a49333ab468 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Wed, 26 Oct 2022 21:11:37 +0300 Subject: [PATCH 09/67] Review fixes (#23) * fixes and suggestions * changed "issuer" to "issuance" as per https://github.com/zcash/orchard/pull/356#discussion_r967668241 * terminology fixes * updated naming --- src/builder.rs | 10 +++-- src/constants/fixed_bases.rs | 1 - src/issuance.rs | 42 ++++++++++---------- src/keys.rs | 76 ++++++++++++++++++------------------ src/note/note_type.rs | 31 ++++++++------- tests/zsa.rs | 16 ++++---- 6 files changed, 90 insertions(+), 86 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 18fb46dd8..526fe471e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -370,7 +370,9 @@ impl Builder { let mut pre_actions: Vec<_> = Vec::new(); // Pair up the spends and recipients, extending with dummy values as necessary. - for (note_type, (mut spends, mut recipients)) in partition(&self.spends, &self.recipients) { + for (note_type, (mut spends, mut recipients)) in + partition_by_asset(&self.spends, &self.recipients) + { let num_spends = spends.len(); let num_recipients = recipients.len(); let num_actions = [num_spends, num_recipients, MIN_ACTIONS] @@ -460,20 +462,20 @@ impl Builder { } /// partition a list of spends and recipients by note types. -fn partition( +fn partition_by_asset( spends: &[SpendInfo], recipients: &[RecipientInfo], ) -> HashMap, Vec)> { let mut hm = HashMap::new(); - for s in spends.iter() { + for s in spends { hm.entry(s.note.note_type()) .or_insert((vec![], vec![])) .0 .push(s.clone()); } - for r in recipients.iter() { + for r in recipients { hm.entry(r.note_type) .or_insert((vec![], vec![])) .1 diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index bd58a90c2..d9c92edd3 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -19,7 +19,6 @@ pub mod value_commit_v; pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; /// SWU hash-to-curve personalization for the value commitment generator -/// TODO: should we change to "NOTE_TYPE_PERSONALIZATION"? pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; /// SWU hash-to-curve personalization for the note type generator diff --git a/src/issuance.rs b/src/issuance.rs index 8900d4219..e8027e67f 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -11,7 +11,7 @@ use crate::issuance::Error::{ IssueActionPreviouslyFinalizedNoteType, IssueBundleIkMismatchNoteType, IssueBundleInvalidSignature, WrongAssetDescSize, }; -use crate::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; +use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use crate::note::note_type::MAX_ASSET_DESCRIPTION_SIZE; use crate::note::{NoteType, Nullifier}; use crate::value::NoteValue; @@ -24,7 +24,7 @@ use crate::{ #[derive(Debug)] pub struct IssueBundle { /// The issuer key for the note being created. - ik: IssuerValidatingKey, + ik: IssuanceValidatingKey, /// The list of issue actions that make up this bundle. actions: Vec, /// The authorization for this action. @@ -84,7 +84,7 @@ impl IssueAction { /// Return the `NoteType` if the provided `ik` is used to derive the `note_type` for **all** internal notes. fn are_note_types_derived_correctly( &self, - ik: &IssuerValidatingKey, + ik: &IssuanceValidatingKey, ) -> Result { match self .notes @@ -137,7 +137,7 @@ impl IssueAuth for Signed {} impl IssueBundle { /// Returns the issuer verification key for the bundle. - pub fn ik(&self) -> &IssuerValidatingKey { + pub fn ik(&self) -> &IssuanceValidatingKey { &self.ik } /// Return the actions for a given `IssueBundle`. @@ -180,7 +180,7 @@ impl IssueBundle { impl IssueBundle { /// Constructs a new `IssueBundle`. - pub fn new(ik: IssuerValidatingKey) -> IssueBundle { + pub fn new(ik: IssuanceValidatingKey) -> IssueBundle { IssueBundle { ik, actions: Vec::new(), @@ -283,9 +283,9 @@ impl IssueBundle { pub fn sign( self, mut rng: R, - isk: &IssuerAuthorizingKey, + isk: &IssuanceAuthorizingKey, ) -> Result, Error> { - let expected_ik: IssuerValidatingKey = (isk).into(); + let expected_ik: IssuanceValidatingKey = (isk).into(); // Make sure the `expected_ik` matches the note_type for all notes. self.actions.iter().try_for_each(|action| { @@ -454,7 +454,7 @@ mod tests { }; use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; use crate::keys::{ - FullViewingKey, IssuerAuthorizingKey, IssuerValidatingKey, Scope, SpendingKey, + FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; use crate::note::{NoteType, Nullifier}; use crate::value::NoteValue; @@ -468,15 +468,15 @@ mod tests { fn setup_params() -> ( OsRng, - IssuerAuthorizingKey, - IssuerValidatingKey, + IssuanceAuthorizingKey, + IssuanceValidatingKey, Address, [u8; 32], ) { let mut rng = OsRng; let sk = SpendingKey::random(&mut rng); - let isk: IssuerAuthorizingKey = (&sk).into(); - let ik: IssuerValidatingKey = (&isk).into(); + let isk: IssuanceAuthorizingKey = (&sk).into(); + let ik: IssuanceValidatingKey = (&isk).into(); let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); @@ -689,7 +689,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuerAuthorizingKey = (&SpendingKey::random(&mut OsRng)).into(); + let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut OsRng)).into(); let err = bundle .prepare([0; 32]) @@ -845,7 +845,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuerAuthorizingKey = (&SpendingKey::random(&mut rng)).into(); + let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut rng)).into(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -951,8 +951,8 @@ mod tests { let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let incorrect_sk = SpendingKey::random(&mut rng); - let incorrect_isk: IssuerAuthorizingKey = (&incorrect_sk).into(); - let incorrect_ik: IssuerValidatingKey = (&incorrect_isk).into(); + let incorrect_isk: IssuanceAuthorizingKey = (&incorrect_sk).into(); + let incorrect_ik: IssuanceValidatingKey = (&incorrect_isk).into(); // Add "bad" note let note = Note::new( @@ -1024,7 +1024,7 @@ mod tests { #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; - use crate::keys::testing::{arb_issuer_authorizing_key, arb_issuer_validating_key}; + use crate::keys::testing::{arb_issuance_authorizing_key, arb_issuance_validating_key}; use crate::note::testing::arb_zsa_note; use proptest::collection::vec; use proptest::prelude::*; @@ -1049,7 +1049,7 @@ pub mod testing { pub fn arb_unathorized_issue_bundle(n_actions: usize) ( actions in vec(arb_issue_action(), n_actions), - ik in arb_issuer_validating_key() + ik in arb_issuance_validating_key() ) -> IssueBundle { IssueBundle { ik, @@ -1066,7 +1066,7 @@ pub mod testing { pub fn arb_prepared_issue_bundle(n_actions: usize) ( actions in vec(arb_issue_action(), n_actions), - ik in arb_issuer_validating_key(), + ik in arb_issuance_validating_key(), fake_sighash in prop::array::uniform32(prop::num::u8::ANY) ) -> IssueBundle { IssueBundle { @@ -1084,8 +1084,8 @@ pub mod testing { pub fn arb_signed_issue_bundle(n_actions: usize) ( actions in vec(arb_issue_action(), n_actions), - ik in arb_issuer_validating_key(), - isk in arb_issuer_authorizing_key(), + ik in arb_issuance_validating_key(), + isk in arb_issuance_authorizing_key(), rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_sighash in prop::array::uniform32(prop::num::u8::ANY) ) -> IssueBundle { diff --git a/src/keys.rs b/src/keys.rs index 7f603a5b8..d10e6e24e 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -178,7 +178,7 @@ impl SpendValidatingKey { self.0.randomize(randomizer) } - /// Converts this spend validating key to its serialized form, + /// Converts this issuance validating key to its serialized form, /// I2LEOSP_256(ak). pub(crate) fn to_bytes(&self) -> [u8; 32] { // This is correct because the wrapped point must have ỹ = 0, and @@ -194,23 +194,23 @@ impl SpendValidatingKey { } } -/// An issuer authorizing key, used to create issuer authorization signatures. +/// An issuance authorizing key, used to create issuance authorization signatures. /// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. /// /// $\mathsf{isk}$ as defined in -/// [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// [Issuance of Zcash Shielded Assets ZIP-0227 § Asset Identifier Generation (DRAFT ZIP)][IssuanceZSA]. /// -/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +/// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation #[derive(Clone, Debug)] -pub struct IssuerAuthorizingKey(redpallas::SigningKey); +pub struct IssuanceAuthorizingKey(redpallas::SigningKey); -impl IssuerAuthorizingKey { +impl IssuanceAuthorizingKey { /// Derives isk from sk. Internal use only, does not enforce all constraints. fn derive_inner(sk: &SpendingKey) -> pallas::Scalar { to_scalar(PrfExpand::ZsaIsk.expand(&sk.0)) } - /// Sign the provided message using the `IssuerAuthorizingKey`. + /// Sign the provided message using the `IssuanceAuthorizingKey`. pub fn sign( &self, rng: &mut (impl RngCore + CryptoRng), @@ -220,51 +220,51 @@ impl IssuerAuthorizingKey { } } -impl From<&SpendingKey> for IssuerAuthorizingKey { +impl From<&SpendingKey> for IssuanceAuthorizingKey { fn from(sk: &SpendingKey) -> Self { let isk = Self::derive_inner(sk); - // IssuerSigningKey cannot be constructed such that this assertion would fail. + // IssuanceSigningKey cannot be constructed such that this assertion would fail. assert!(!bool::from(isk.is_zero())); - let ret = IssuerAuthorizingKey(isk.to_repr().try_into().unwrap()); + let ret = IssuanceAuthorizingKey(isk.to_repr().try_into().unwrap()); // If the last bit of repr_P(ik) is 1, negate isk. - if (<[u8; 32]>::from(IssuerValidatingKey::from(&ret).0)[31] >> 7) == 1 { - IssuerAuthorizingKey((-isk).to_repr().try_into().unwrap()) + if (<[u8; 32]>::from(IssuanceValidatingKey::from(&ret).0)[31] >> 7) == 1 { + IssuanceAuthorizingKey((-isk).to_repr().try_into().unwrap()) } else { ret } } } -/// A key used to validate issuer authorization signatures. +/// A key used to validate issuance authorization signatures. /// -/// Defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// Defined in [Issuance of Zcash Shielded Assets ZIP-0227 § Asset Identifier Generation (DRAFT PR)][IssuanceZSA]. /// Note that this is $\mathsf{ik}^\mathbb{P}$, which by construction is equivalent to /// $\mathsf{ik}$ but stored here as a RedPallas verification key. /// -/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +/// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation #[derive(Debug, Clone, PartialOrd, Ord)] -pub struct IssuerValidatingKey(redpallas::VerificationKey); -impl From<&IssuerAuthorizingKey> for IssuerValidatingKey { - fn from(isk: &IssuerAuthorizingKey) -> Self { - IssuerValidatingKey((&isk.0).into()) +pub struct IssuanceValidatingKey(redpallas::VerificationKey); +impl From<&IssuanceAuthorizingKey> for IssuanceValidatingKey { + fn from(isk: &IssuanceAuthorizingKey) -> Self { + IssuanceValidatingKey((&isk.0).into()) } } -impl From<&IssuerValidatingKey> for pallas::Point { - fn from(issuer_validating_key: &IssuerValidatingKey) -> pallas::Point { - pallas::Point::from_bytes(&(&issuer_validating_key.0).into()).unwrap() +impl From<&IssuanceValidatingKey> for pallas::Point { + fn from(issuance_validating_key: &IssuanceValidatingKey) -> pallas::Point { + pallas::Point::from_bytes(&(&issuance_validating_key.0).into()).unwrap() } } -impl PartialEq for IssuerValidatingKey { +impl PartialEq for IssuanceValidatingKey { fn eq(&self, other: &Self) -> bool { <[u8; 32]>::from(&self.0).eq(&<[u8; 32]>::from(&other.0)) } } -impl Eq for IssuerValidatingKey {} +impl Eq for IssuanceValidatingKey {} -impl IssuerValidatingKey { +impl IssuanceValidatingKey { /// Converts this spend validating key to its serialized form, /// I2LEOSP_256(ik). pub(crate) fn to_bytes(&self) -> [u8; 32] { @@ -277,7 +277,7 @@ impl IssuerValidatingKey { <[u8; 32]>::try_from(bytes) .ok() .and_then(check_structural_validity) - .map(IssuerValidatingKey) + .map(IssuanceValidatingKey) } /// Verifies a purported `signature` over `msg` made by this verification key. @@ -292,9 +292,9 @@ impl IssuerValidatingKey { /// A function to check structural validity of the validating keys for authorizing transfers and /// issuing assets -/// Structural validity checks for ik_P: +/// Structural validity checks for ak_P or ik_P: /// - The point must not be the identity (which for Pallas is canonically encoded as all-zeroes). -/// - The sign of the y-coordinate must be positive. +/// - The compressed y-coordinate bit must be 0. fn check_structural_validity( verification_key_bytes: [u8; 32], ) -> Option> { @@ -1043,8 +1043,8 @@ impl SharedSecret { #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { use super::{ - DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuerAuthorizingKey, - IssuerValidatingKey, SpendingKey, + DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, + IssuanceValidatingKey, SpendingKey, }; use proptest::prelude::*; use rand::{rngs::StdRng, SeedableRng}; @@ -1096,17 +1096,17 @@ pub mod testing { } prop_compose! { - /// Generate a uniformly distributed RedDSA issuer authorizing key. - pub fn arb_issuer_authorizing_key()(rng_seed in prop::array::uniform32(prop::num::u8::ANY)) -> IssuerAuthorizingKey { + /// Generate a uniformly distributed RedDSA issuance authorizing key. + pub fn arb_issuance_authorizing_key()(rng_seed in prop::array::uniform32(prop::num::u8::ANY)) -> IssuanceAuthorizingKey { let mut rng = StdRng::from_seed(rng_seed); - IssuerAuthorizingKey::from(&SpendingKey::random(&mut rng)) + IssuanceAuthorizingKey::from(&SpendingKey::random(&mut rng)) } } prop_compose! { - /// Generate a uniformly distributed RedDSA issuer validating key. - pub fn arb_issuer_validating_key()(isk in arb_issuer_authorizing_key()) -> IssuerValidatingKey { - IssuerValidatingKey::from(&isk) + /// Generate a uniformly distributed RedDSA issuance validating key. + pub fn arb_issuance_validating_key()(isk in arb_issuance_authorizing_key()) -> IssuanceValidatingKey { + IssuanceValidatingKey::from(&isk) } } } @@ -1180,13 +1180,13 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); - let isk: IssuerAuthorizingKey = (&sk).into(); + let isk: IssuanceAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&isk.0), tv.isk); let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); - let ik: IssuerValidatingKey = (&isk).into(); + let ik: IssuanceValidatingKey = (&isk).into(); assert_eq!(<[u8; 32]>::from(ik.0), tv.ik); let nk: NullifierDerivingKey = (&sk).into(); diff --git a/src/note/note_type.rs b/src/note/note_type.rs index 45e0b532b..cd69f16ea 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -6,7 +6,7 @@ use std::hash::{Hash, Hasher}; use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; -use crate::keys::IssuerValidatingKey; +use crate::keys::IssuanceValidatingKey; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] @@ -15,8 +15,7 @@ pub struct NoteType(pallas::Point); pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; // the hasher used to derive the assetID -#[allow(non_snake_case)] -fn assetID_hasher(msg: Vec) -> pallas::Point { +fn asset_id_hasher(msg: Vec) -> pallas::Point { // TODO(zsa) replace personalization pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) } @@ -32,25 +31,29 @@ impl NoteType { self.0.to_bytes() } - /// $DeriveNoteType$. + /// Note type derivation$. /// - /// Defined in [Zcash Protocol Spec § TBD: Note Types][notetypes]. + /// Defined in [Transfer and Burn of Zcash Shielded Assets][notetypes]. /// - /// [notetypes]: https://zips.z.cash/protocol/nu5.pdf#notetypes + /// [notetypes]: https://qed-it.github.io/zips/draft-ZIP-0226.html#asset-types + /// + /// # Panics + /// + /// Panics if `asset_desc` is empty or greater than `MAX_ASSET_DESCRIPTION_SIZE`. #[allow(non_snake_case)] - pub fn derive(ik: &IssuerValidatingKey, asset_desc: &str) -> Self { + pub fn derive(ik: &IssuanceValidatingKey, asset_desc: &str) -> Self { assert!(!asset_desc.is_empty() && asset_desc.len() <= MAX_ASSET_DESCRIPTION_SIZE); let mut s = vec![]; s.extend(ik.to_bytes()); s.extend(asset_desc.as_bytes()); - NoteType(assetID_hasher(s)) + NoteType(asset_id_hasher(s)) } /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. pub fn native() -> Self { - NoteType(assetID_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) + NoteType(asset_id_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) } /// The base point used in value commitments. @@ -85,7 +88,7 @@ pub mod testing { use proptest::prelude::*; - use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; + use crate::keys::{testing::arb_spending_key, IssuanceAuthorizingKey, IssuanceValidatingKey}; prop_compose! { /// Generate a uniformly distributed note type @@ -97,8 +100,8 @@ pub mod testing { if is_native { NoteType::native() } else { - let isk = IssuerAuthorizingKey::from(&sk); - NoteType::derive(&IssuerValidatingKey::from(&isk), &str) + let isk = IssuanceAuthorizingKey::from(&sk); + NoteType::derive(&IssuanceValidatingKey::from(&isk), &str) } } } @@ -117,8 +120,8 @@ pub mod testing { sk in arb_spending_key(), str in "[A-Za-z]{255}" ) -> NoteType { - let isk = IssuerAuthorizingKey::from(&sk); - NoteType::derive(&IssuerValidatingKey::from(&isk), &str) + let isk = IssuanceAuthorizingKey::from(&sk); + NoteType::derive(&IssuanceValidatingKey::from(&isk), &str) } } } diff --git a/tests/zsa.rs b/tests/zsa.rs index 0335d3358..6dfff6dc0 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -5,7 +5,7 @@ use incrementalmerkletree::bridgetree::BridgeTree; use incrementalmerkletree::{Hashable, Tree}; use orchard::bundle::Authorized; use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; -use orchard::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; +use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use orchard::note::{ExtractedNoteCommitment, NoteType}; use orchard::note_encryption::OrchardDomain; use orchard::tree::{MerkleHashOrchard, MerklePath}; @@ -27,8 +27,8 @@ struct Keychain { vk: VerifyingKey, sk: SpendingKey, fvk: FullViewingKey, - isk: IssuerAuthorizingKey, - ik: IssuerValidatingKey, + isk: IssuanceAuthorizingKey, + ik: IssuanceValidatingKey, recipient: Address, } @@ -42,10 +42,10 @@ impl Keychain { fn fvk(&self) -> &FullViewingKey { &self.fvk } - fn isk(&self) -> &IssuerAuthorizingKey { + fn isk(&self) -> &IssuanceAuthorizingKey { &self.isk } - fn ik(&self) -> &IssuerValidatingKey { + fn ik(&self) -> &IssuanceValidatingKey { &self.ik } } @@ -58,8 +58,8 @@ fn prepare_keys() -> Keychain { let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); - let isk = IssuerAuthorizingKey::from(&sk); - let ik = IssuerValidatingKey::from(&isk); + let isk = IssuanceAuthorizingKey::from(&sk); + let ik = IssuanceValidatingKey::from(&isk); Keychain { pk, vk, @@ -74,7 +74,7 @@ fn prepare_keys() -> Keychain { fn sign_issue_bundle( unauthorized: IssueBundle, mut rng: OsRng, - isk: IssuerAuthorizingKey, + isk: IssuanceAuthorizingKey, ) -> IssueBundle { let sighash = unauthorized.commitment().into(); let proven = unauthorized.prepare(sighash); From 355b5691ea5faf70c7a4a07de0cafa5474a14c30 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Thu, 27 Oct 2022 19:23:15 +0300 Subject: [PATCH 10/67] Review fixes2 (#24) * rename 2 note_type -> asset as per https://github.com/zcash/orchard/pull/356#discussion_r967636009 * added a dedicated type for "IssuanceAuth" * disabled codecov github action due to bad behavior. * extracted "is_asset_desc_of_valid_size()" into asset_id.rs --- .github/workflows/ci.yml | 51 +++++----- benches/circuit.rs | 4 +- benches/note_decryption.rs | 6 +- src/action.rs | 10 +- src/builder.rs | 75 +++++++------- src/bundle.rs | 4 +- src/bundle/commitments.rs | 2 +- src/circuit.rs | 8 +- src/constants/fixed_bases.rs | 2 +- src/issuance.rs | 136 ++++++++++++------------- src/keys.rs | 18 ++-- src/note.rs | 39 ++++--- src/note/{note_type.rs => asset_id.rs} | 45 ++++---- src/note/commitment.rs | 8 +- src/note_encryption.rs | 42 ++++---- src/test_vectors/note_encryption.rs | 42 ++++---- src/value.rs | 26 ++--- tests/builder.rs | 6 +- tests/zsa.rs | 40 ++++---- 19 files changed, 288 insertions(+), 276 deletions(-) rename src/note/{note_type.rs => asset_id.rs} (73%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a52477ab..e7b900029 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,31 +55,32 @@ jobs: - name: Test Orchard book run: mdbook test book/ - codecov: - name: Code coverage - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - # Use stable for this to ensure that cargo-tarpaulin can be built. - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - name: Install cargo-tarpaulin - uses: actions-rs/cargo@v1 - with: - command: install - args: cargo-tarpaulin - - name: Generate coverage report - uses: actions-rs/cargo@v1 - with: - command: tarpaulin - args: --all-features --timeout 1200 --out Xml - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - token: ${{secrets.CODECOV_TOKEN}} +# disabled due to performance issues: +# codecov: +# name: Code coverage +# runs-on: ubuntu-latest +# +# steps: +# - uses: actions/checkout@v2 +# # Use stable for this to ensure that cargo-tarpaulin can be built. +# - uses: actions-rs/toolchain@v1 +# with: +# toolchain: stable +# override: true +# - name: Install cargo-tarpaulin +# uses: actions-rs/cargo@v1 +# with: +# command: install +# args: cargo-tarpaulin +# - name: Generate coverage report +# uses: actions-rs/cargo@v1 +# with: +# command: tarpaulin +# args: --all-features --timeout 1200 --out Xml +# - name: Upload coverage to Codecov +# uses: codecov/codecov-action@v1 +# with: +# token: ${{secrets.CODECOV_TOKEN}} doc-links: name: Intra-doc links diff --git a/benches/circuit.rs b/benches/circuit.rs index 6400513e2..e9bab616c 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -6,7 +6,7 @@ use criterion::{BenchmarkId, Criterion}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; -use orchard::note::NoteType; +use orchard::note::AssetId; use orchard::{ builder::Builder, bundle::Flags, @@ -37,7 +37,7 @@ fn criterion_benchmark(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - NoteType::native(), + AssetId::native(), None, ) .unwrap(); diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 28e02de61..1417a2b6c 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -4,7 +4,7 @@ use orchard::{ bundle::Flags, circuit::ProvingKey, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey}, - note::NoteType, + note::AssetId, note_encryption::{CompactAction, OrchardDomain}, value::NoteValue, Anchor, Bundle, @@ -57,7 +57,7 @@ fn bench_note_decryption(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - NoteType::native(), + AssetId::native(), None, ) .unwrap(); @@ -66,7 +66,7 @@ fn bench_note_decryption(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - NoteType::native(), + AssetId::native(), None, ) .unwrap(); diff --git a/src/action.rs b/src/action.rs index b1eda4819..94fe4f3f4 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,7 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; - use crate::note::note_type::testing::arb_note_type; + use crate::note::asset_id::testing::arb_asset_id; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -147,13 +147,13 @@ pub(crate) mod testing { nf in arb_nullifier(), rk in arb_spendauth_verification_key(), note in arb_note(output_value), - note_type in arb_note_type() + asset in arb_asset_id() ) -> Action<()> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - note_type + asset ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { @@ -180,13 +180,13 @@ pub(crate) mod testing { note in arb_note(output_value), rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), - note_type in arb_note_type() + asset in arb_asset_id() ) -> Action> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - note_type + asset ); // FIXME: make a real one from the note. diff --git a/src/builder.rs b/src/builder.rs index 526fe471e..5c6147022 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -9,7 +9,7 @@ use nonempty::NonEmpty; use pasta_curves::pallas; use rand::{prelude::SliceRandom, CryptoRng, RngCore}; -use crate::note::NoteType; +use crate::note::AssetId; use crate::{ action::Action, address::Address, @@ -94,8 +94,8 @@ impl SpendInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(note_type: NoteType, rng: &mut impl RngCore) -> Self { - let (sk, fvk, note) = Note::dummy(rng, None, note_type); + fn dummy(asset: AssetId, rng: &mut impl RngCore) -> Self { + let (sk, fvk, note) = Note::dummy(rng, None, asset); let merkle_path = MerklePath::dummy(rng); SpendInfo { @@ -110,7 +110,7 @@ impl SpendInfo { } } - /// Duplicates the spend info and set the split flag to `true`. + /// Return a copy of this note with the split flag set to `true`. fn create_split_spend(&self) -> Self { let mut split_spend = SpendInfo::new(self.fvk.clone(), self.note, self.merkle_path.clone()) .expect("The spend info is valid"); @@ -125,7 +125,7 @@ struct RecipientInfo { ovk: Option, recipient: Address, value: NoteValue, - note_type: NoteType, + asset: AssetId, memo: Option<[u8; 512]>, } @@ -133,7 +133,7 @@ impl RecipientInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(rng: &mut impl RngCore, note_type: NoteType) -> Self { + fn dummy(rng: &mut impl RngCore, asset: AssetId) -> Self { let fvk: FullViewingKey = (&SpendingKey::random(rng)).into(); let recipient = fvk.address_at(0u32, Scope::External); @@ -141,7 +141,7 @@ impl RecipientInfo { ovk: None, recipient, value: NoteValue::zero(), - note_type, + asset, memo: None, } } @@ -165,13 +165,13 @@ impl ActionInfo { } /// Returns the value sum for this action. - /// Split notes does not contribute to the value sum. + /// Split notes do not contribute to the value sum. fn value_sum(&self) -> ValueSum { - let spent_value = self - .spend - .split_flag - .then(NoteValue::zero) - .unwrap_or_else(|| self.spend.note.value()); + let spent_value = if self.spend.split_flag { + NoteValue::zero() + } else { + self.spend.note.value() + }; spent_value - self.output.value } @@ -181,27 +181,30 @@ impl ActionInfo { /// Defined in [Zcash Protocol Spec § 4.7.3: Sending Notes (Orchard)][orchardsend]. /// /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend + /// + /// # Panics + /// + /// Panics if the asset types of the spent and output notes do not match. fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { assert_eq!( - self.output.note_type, - self.spend.note.note_type(), + self.spend.note.asset(), + self.output.asset, "spend and recipient note types must be equal" ); let v_net = self.value_sum(); - let note_type = self.output.note_type; - let cv_net = ValueCommitment::derive(v_net, self.rcv, note_type); + let asset = self.output.asset; + let cv_net = ValueCommitment::derive(v_net, self.rcv, asset); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let ak: SpendValidatingKey = self.spend.fvk.clone().into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let note_type = self.spend.note.note_type(); let note = Note::new( self.output.recipient, self.output.value, - note_type, + self.output.asset, nf_old, &mut rng, ); @@ -316,7 +319,7 @@ impl Builder { ovk: Option, recipient: Address, value: NoteValue, - note_type: NoteType, + asset: AssetId, memo: Option<[u8; 512]>, ) -> Result<(), &'static str> { if !self.flags.outputs_enabled() { @@ -327,7 +330,7 @@ impl Builder { ovk, recipient, value, - note_type, + asset, memo, }); @@ -370,7 +373,7 @@ impl Builder { let mut pre_actions: Vec<_> = Vec::new(); // Pair up the spends and recipients, extending with dummy values as necessary. - for (note_type, (mut spends, mut recipients)) in + for (asset, (mut spends, mut recipients)) in partition_by_asset(&self.spends, &self.recipients) { let num_spends = spends.len(); @@ -384,16 +387,16 @@ impl Builder { // TODO: uncomment once the circuit is ready. // use the first spend to create split spend(s) or create a dummy if empty. // let dummy_spend = spends.first().map_or_else( - // || SpendInfo::dummy(note_type, &mut rng), + // || SpendInfo::dummy(asset, &mut rng), // |s| s.create_split_spend(), // ); - let dummy_spend = SpendInfo::dummy(note_type, &mut rng); + let dummy_spend = SpendInfo::dummy(asset, &mut rng); // Extend the spends and recipients with dummy values. spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); recipients.extend( - iter::repeat_with(|| RecipientInfo::dummy(&mut rng, note_type)) + iter::repeat_with(|| RecipientInfo::dummy(&mut rng, asset)) .take(num_actions - num_recipients), ); @@ -443,7 +446,7 @@ impl Builder { - ValueCommitment::derive( value_balance, ValueCommitTrapdoor::zero(), - NoteType::native(), + AssetId::native(), )) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); @@ -465,18 +468,18 @@ impl Builder { fn partition_by_asset( spends: &[SpendInfo], recipients: &[RecipientInfo], -) -> HashMap, Vec)> { +) -> HashMap, Vec)> { let mut hm = HashMap::new(); for s in spends { - hm.entry(s.note.note_type()) + hm.entry(s.note.asset()) .or_insert((vec![], vec![])) .0 .push(s.clone()); } for r in recipients { - hm.entry(r.note_type) + hm.entry(r.asset) .or_insert((vec![], vec![])) .1 .push(r.clone()) @@ -749,7 +752,7 @@ pub mod testing { use proptest::collection::vec; use proptest::prelude::*; - use crate::note::NoteType; + use crate::note::AssetId; use crate::{ address::testing::arb_address, bundle::{Authorized, Bundle, Flags}, @@ -777,7 +780,7 @@ pub mod testing { sk: SpendingKey, anchor: Anchor, notes: Vec<(Note, MerklePath)>, - recipient_amounts: Vec<(Address, NoteValue, NoteType)>, + recipient_amounts: Vec<(Address, NoteValue, AssetId)>, } impl ArbitraryBundleInputs { @@ -791,12 +794,12 @@ pub mod testing { builder.add_spend(fvk.clone(), note, path).unwrap(); } - for (addr, value, note_type) in self.recipient_amounts.into_iter() { + for (addr, value, asset) in self.recipient_amounts.into_iter() { let scope = fvk.scope_for_address(&addr).unwrap(); let ovk = fvk.to_ovk(scope); builder - .add_recipient(Some(ovk.clone()), addr, value, note_type, None) + .add_recipient(Some(ovk.clone()), addr, value, asset, None) .unwrap(); } @@ -831,7 +834,7 @@ pub mod testing { arb_address().prop_flat_map(move |a| { arb_positive_note_value(MAX_NOTE_VALUE / n_recipients as u64) .prop_map(move |v| { - (a,v, NoteType::native()) + (a,v, AssetId::native()) }) }), n_recipients as usize, @@ -882,7 +885,7 @@ mod tests { use rand::rngs::OsRng; use super::Builder; - use crate::note::NoteType; + use crate::note::AssetId; use crate::{ bundle::{Authorized, Bundle, Flags}, circuit::ProvingKey, @@ -911,7 +914,7 @@ mod tests { None, recipient, NoteValue::from_raw(5000), - NoteType::native(), + AssetId::native(), None, ) .unwrap(); diff --git a/src/bundle.rs b/src/bundle.rs index 4f4e1cb3f..6f7e0bce9 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -12,7 +12,7 @@ use memuse::DynamicUsage; use nonempty::NonEmpty; use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; -use crate::note::NoteType; +use crate::note::AssetId; use crate::{ action::Action, address::Address, @@ -385,7 +385,7 @@ impl> Bundle { - ValueCommitment::derive( ValueSum::from_raw(self.value_balance.into()), ValueCommitTrapdoor::zero(), - NoteType::native(), + AssetId::native(), )) .into_bvk() } diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index 40808b57f..285ba31f7 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -102,7 +102,7 @@ pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) for note in action.notes().iter() { h.update(¬e.recipient().to_raw_address_bytes()); h.update(¬e.value().to_bytes()); - h.update(¬e.note_type().to_bytes()); + h.update(¬e.asset().to_bytes()); h.update(¬e.rho().to_bytes()); h.update(note.rseed().as_bytes()); } diff --git a/src/circuit.rs b/src/circuit.rs index 97d5efda2..7797f563e 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -968,7 +968,7 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; - use crate::note::NoteType; + use crate::note::AssetId; use crate::{ keys::SpendValidatingKey, note::Note, @@ -977,7 +977,7 @@ mod tests { }; fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { - let (_, fvk, spent_note) = Note::dummy(&mut rng, None, NoteType::native()); + let (_, fvk, spent_note) = Note::dummy(&mut rng, None, AssetId::native()); let sender_address = spent_note.recipient(); let nk = *fvk.nk(); @@ -987,12 +987,12 @@ mod tests { let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), NoteType::native()); + let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), AssetId::native()); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); let rcv = ValueCommitTrapdoor::random(&mut rng); - let cv_net = ValueCommitment::derive(value, rcv, NoteType::native()); + let cv_net = ValueCommitment::derive(value, rcv, AssetId::native()); let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index d9c92edd3..4b5d1518e 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -22,7 +22,7 @@ pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; /// SWU hash-to-curve personalization for the note type generator -// pub const NOTE_TYPE_PERSONALIZATION: &str = "z.cash:Orchard-NoteType"; +// pub const ASSET_ID_PERSONALIZATION: &str = "z.cash:Orchard-NoteType"; /// SWU hash-to-curve value for the value commitment generator pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v"; diff --git a/src/issuance.rs b/src/issuance.rs index e8027e67f..4fbcd8421 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -12,8 +12,8 @@ use crate::issuance::Error::{ IssueBundleInvalidSignature, WrongAssetDescSize, }; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; -use crate::note::note_type::MAX_ASSET_DESCRIPTION_SIZE; -use crate::note::{NoteType, Nullifier}; +use crate::note::asset_id::is_asset_desc_of_valid_size; +use crate::note::{AssetId, Nullifier}; use crate::value::NoteValue; use crate::{ primitives::redpallas::{self, SpendAuth}, @@ -81,24 +81,24 @@ impl IssueAction { self.finalize } - /// Return the `NoteType` if the provided `ik` is used to derive the `note_type` for **all** internal notes. - fn are_note_types_derived_correctly( + /// Return the `AssetId` if the provided `ik` is used to derive the `asset_id` for **all** internal notes. + fn are_note_asset_ids_derived_correctly( &self, ik: &IssuanceValidatingKey, - ) -> Result { + ) -> Result { match self .notes .iter() - .try_fold(self.notes().head.note_type(), |note_type, ¬e| { + .try_fold(self.notes().head.asset(), |asset, ¬e| { // Fail if not all note types are equal - note.note_type() - .eq(¬e_type) - .then(|| note_type) + note.asset() + .eq(&asset) + .then(|| asset) .ok_or(IssueActionIncorrectNoteType) }) { - Ok(note_type) => note_type // check that the note_type was properly derived. - .eq(&NoteType::derive(ik, &self.asset_desc)) - .then(|| note_type) + Ok(asset) => asset // check that the asset was properly derived. + .eq(&AssetId::derive(ik, &self.asset_desc)) + .then(|| asset) .ok_or(IssueBundleIkMismatchNoteType), Err(e) => Err(e), } @@ -162,12 +162,12 @@ impl IssueBundle { self.actions.iter().find(|a| a.asset_desc.eq(&asset_desc)) } - /// Find an action by `note_type` for a given `IssueBundle`. - pub fn get_action_by_type(&self, note_type: NoteType) -> Option<&IssueAction> { + /// Find an action by `asset` for a given `IssueBundle`. + pub fn get_action_by_type(&self, asset: AssetId) -> Option<&IssueAction> { let action = self .actions .iter() - .find(|a| NoteType::derive(&self.ik, &a.asset_desc).eq(¬e_type)); + .find(|a| AssetId::derive(&self.ik, &a.asset_desc).eq(&asset)); action } @@ -202,17 +202,17 @@ impl IssueBundle { value: NoteValue, finalize: bool, mut rng: impl RngCore, - ) -> Result { - if !is_asset_desc_valid(&asset_desc) { + ) -> Result { + if !is_asset_desc_of_valid_size(&asset_desc) { return Err(WrongAssetDescSize); } - let note_type = NoteType::derive(&self.ik, &asset_desc); + let asset = AssetId::derive(&self.ik, &asset_desc); let note = Note::new( recipient, value, - note_type, + asset, Nullifier::dummy(&mut rng), &mut rng, ); @@ -238,7 +238,7 @@ impl IssueBundle { } } - Ok(note_type) + Ok(asset) } /// Finalizes a given `IssueAction` @@ -247,7 +247,7 @@ impl IssueBundle { /// /// Panics if `asset_desc` is empty or longer than 512 bytes. pub fn finalize_action(&mut self, asset_desc: String) -> Result<(), Error> { - if !is_asset_desc_valid(&asset_desc) { + if !is_asset_desc_of_valid_size(&asset_desc) { return Err(WrongAssetDescSize); } @@ -279,7 +279,7 @@ impl IssueBundle { impl IssueBundle { /// Sign the `IssueBundle`. - /// The call makes sure that the provided `isk` matches the `ik` and the driven `note_type` for each note in the bundle. + /// The call makes sure that the provided `isk` matches the `ik` and the driven `asset` for each note in the bundle. pub fn sign( self, mut rng: R, @@ -287,10 +287,10 @@ impl IssueBundle { ) -> Result, Error> { let expected_ik: IssuanceValidatingKey = (isk).into(); - // Make sure the `expected_ik` matches the note_type for all notes. + // Make sure the `expected_ik` matches the `asset` for all notes. self.actions.iter().try_for_each(|action| { action - .are_note_types_derived_correctly(&expected_ik) + .are_note_asset_ids_derived_correctly(&expected_ik) .map(|_| ()) // Transform Result into Result<(),Error)>. })?; @@ -332,14 +332,10 @@ impl IssueBundle { } } -fn is_asset_desc_valid(asset_desc: &str) -> bool { - !asset_desc.is_empty() && asset_desc.bytes().len() <= MAX_ASSET_DESCRIPTION_SIZE -} - /// Validation for Orchard IssueBundles /// /// A set of previously finalized asset types must be provided. -/// In case of success, the `Result` will contain a set of the provided **and** the newly finalized `NoteType`s +/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `NoteType`s /// /// The following checks are performed: /// * For the `IssueBundle`: @@ -348,43 +344,46 @@ fn is_asset_desc_valid(asset_desc: &str) -> bool { /// * Asset description size is collect. /// * `NoteType` for the `IssueAction` has not been previously finalized. /// * For each `Note` inside an `IssueAction`: -/// * All notes have the same, correct `NoteType` -pub fn verify_issue_bundle<'a>( +/// * All notes have the same, correct `NoteType`. +pub fn verify_issue_bundle( bundle: &IssueBundle, sighash: [u8; 32], - previously_finalized: &'a mut HashSet, // The current note_type finalization set. -) -> Result<&'a mut HashSet, Error> { + finalized: &mut HashSet, // The current finalization set. +) -> Result<(), Error> { if let Err(e) = bundle.ik.verify(&sighash, &bundle.authorization.signature) { return Err(IssueBundleInvalidSignature(e)); }; + let currently_finalized: &mut HashSet = &mut HashSet::new(); + // Any IssueAction could have just one properly derived NoteType. - bundle + let res = bundle .actions() .iter() - .try_fold(previously_finalized, |acc, action| { - if !is_asset_desc_valid(action.asset_desc()) { + .try_fold(currently_finalized, |acc, action| { + if !is_asset_desc_of_valid_size(action.asset_desc()) { return Err(WrongAssetDescSize); } // Fail if any note in the IssueAction has incorrect note type. - let note_type = action.are_note_types_derived_correctly(bundle.ik())?; + let asset = action.are_note_asset_ids_derived_correctly(bundle.ik())?; - // Fail if the current note_type was previously finalized. - if acc.contains(¬e_type) { - return Err(IssueActionPreviouslyFinalizedNoteType(note_type)); + // Fail if the current asset was previously finalized. + if finalized.contains(&asset) || acc.contains(&asset) { + return Err(IssueActionPreviouslyFinalizedNoteType(asset)); } // Add to finalization set, if needed. if action.is_finalized() { - acc.insert(note_type); + acc.insert(asset); } - // Proceed with the new accumulated note_type finalization set. + // Proceed with the new asset finalization set. Ok(acc) - }) + })?; - // The iterator will return the new finalization set or will fail. + finalized.extend(res.iter()); + Ok(()) } /// Errors produced during the issuance process @@ -405,7 +404,7 @@ pub enum Error { /// Invalid signature. IssueBundleInvalidSignature(reddsa::Error), /// The provided `NoteType` has been previously finalized. - IssueActionPreviouslyFinalizedNoteType(NoteType), + IssueActionPreviouslyFinalizedNoteType(AssetId), } impl std::error::Error for Error {} @@ -456,7 +455,7 @@ mod tests { use crate::keys::{ FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; - use crate::note::{NoteType, Nullifier}; + use crate::note::{AssetId, Nullifier}; use crate::value::NoteValue; use crate::{Address, Note}; use nonempty::NonEmpty; @@ -522,37 +521,37 @@ mod tests { WrongAssetDescSize ); - let note_type = bundle + let asset = bundle .add_recipient(str.clone(), recipient, NoteValue::from_raw(5), false, rng) .unwrap(); - let another_note_type = bundle + let another_asset = bundle .add_recipient(str, recipient, NoteValue::from_raw(10), false, rng) .unwrap(); - assert_eq!(note_type, another_note_type); + assert_eq!(asset, another_asset); - let third_note_type = bundle + let third_asset = bundle .add_recipient(str2.clone(), recipient, NoteValue::from_raw(15), false, rng) .unwrap(); - assert_ne!(note_type, third_note_type); + assert_ne!(asset, third_asset); let actions = bundle.actions(); assert_eq!(actions.len(), 2); - let action = bundle.get_action_by_type(note_type).unwrap(); + let action = bundle.get_action_by_type(asset).unwrap(); assert_eq!(action.notes.len(), 2); assert_eq!(action.notes.first().value().inner(), 5); - assert_eq!(action.notes.first().note_type(), note_type); + assert_eq!(action.notes.first().asset(), asset); assert_eq!(action.notes.first().recipient(), recipient); assert_eq!(action.notes.tail().first().unwrap().value().inner(), 10); - assert_eq!(action.notes.tail().first().unwrap().note_type(), note_type); + assert_eq!(action.notes.tail().first().unwrap().asset(), asset); assert_eq!(action.notes.tail().first().unwrap().recipient(), recipient); let action2 = bundle.get_action(str2).unwrap(); assert_eq!(action2.notes.len(), 1); assert_eq!(action2.notes().first().value().inner(), 15); - assert_eq!(action2.notes().first().note_type(), third_note_type); + assert_eq!(action2.notes().first().asset(), third_asset); } #[test] @@ -700,7 +699,7 @@ mod tests { } #[test] - fn issue_bundle_incorrect_note_type_for_signature() { + fn issue_bundle_incorrect_asset_for_signature() { let (mut rng, isk, ik, recipient, _) = setup_params(); let mut bundle = IssueBundle::new(ik); @@ -720,7 +719,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(5), - NoteType::derive(bundle.ik(), "Poisoned pill"), + AssetId::derive(bundle.ik(), "Poisoned pill"), Nullifier::dummy(&mut rng), &mut rng, ); @@ -760,8 +759,9 @@ mod tests { let prev_finalized = &mut HashSet::new(); - let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); - assert!(finalized.unwrap().is_empty()); + let res = verify_issue_bundle(&signed, sighash, prev_finalized); + assert!(res.is_ok()); + assert!(prev_finalized.is_empty()); } #[test] @@ -784,12 +784,12 @@ mod tests { let prev_finalized = &mut HashSet::new(); - let finalized = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); - assert!(finalized.contains(&NoteType::derive( - &ik, - &String::from("verify_with_finalize") - ))); - assert_eq!(finalized.len(), 1); + let res = verify_issue_bundle(&signed, sighash, prev_finalized); + assert!(res.is_ok()); + assert!( + prev_finalized.contains(&AssetId::derive(&ik, &String::from("verify_with_finalize"))) + ); + assert_eq!(prev_finalized.len(), 1); } #[test] @@ -811,7 +811,7 @@ mod tests { let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let prev_finalized = &mut HashSet::new(); - let final_type = NoteType::derive(&ik, &String::from("already final")); + let final_type = AssetId::derive(&ik, &String::from("already final")); prev_finalized.insert(final_type); @@ -911,7 +911,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(5), - NoteType::derive(signed.ik(), "Poisoned pill"), + AssetId::derive(signed.ik(), "Poisoned pill"), Nullifier::dummy(&mut rng), &mut rng, ); @@ -958,7 +958,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(55), - NoteType::derive(&incorrect_ik, asset_description), + AssetId::derive(&incorrect_ik, asset_description), Nullifier::dummy(&mut rng), &mut rng, ); diff --git a/src/keys.rs b/src/keys.rs index d10e6e24e..65d464147 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -194,6 +194,9 @@ impl SpendValidatingKey { } } +/// We currently use `SpendAuth` as the `IssuanceAuth`. +type IssuanceAuth = SpendAuth; + /// An issuance authorizing key, used to create issuance authorization signatures. /// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. /// @@ -202,7 +205,7 @@ impl SpendValidatingKey { /// /// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation #[derive(Clone, Debug)] -pub struct IssuanceAuthorizingKey(redpallas::SigningKey); +pub struct IssuanceAuthorizingKey(redpallas::SigningKey); impl IssuanceAuthorizingKey { /// Derives isk from sk. Internal use only, does not enforce all constraints. @@ -215,7 +218,7 @@ impl IssuanceAuthorizingKey { &self, rng: &mut (impl RngCore + CryptoRng), msg: &[u8], - ) -> redpallas::Signature { + ) -> redpallas::Signature { self.0.sign(rng, msg) } } @@ -223,7 +226,7 @@ impl IssuanceAuthorizingKey { impl From<&SpendingKey> for IssuanceAuthorizingKey { fn from(sk: &SpendingKey) -> Self { let isk = Self::derive_inner(sk); - // IssuanceSigningKey cannot be constructed such that this assertion would fail. + // IssuanceAuthorizingKey cannot be constructed such that this assertion would fail. assert!(!bool::from(isk.is_zero())); let ret = IssuanceAuthorizingKey(isk.to_repr().try_into().unwrap()); // If the last bit of repr_P(ik) is 1, negate isk. @@ -243,7 +246,8 @@ impl From<&SpendingKey> for IssuanceAuthorizingKey { /// /// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation #[derive(Debug, Clone, PartialOrd, Ord)] -pub struct IssuanceValidatingKey(redpallas::VerificationKey); +pub struct IssuanceValidatingKey(VerificationKey); + impl From<&IssuanceAuthorizingKey> for IssuanceValidatingKey { fn from(isk: &IssuanceAuthorizingKey) -> Self { IssuanceValidatingKey((&isk.0).into()) @@ -284,7 +288,7 @@ impl IssuanceValidatingKey { pub fn verify( &self, msg: &[u8], - signature: &redpallas::Signature, + signature: &redpallas::Signature, ) -> Result<(), reddsa::Error> { self.0.verify(msg, signature) } @@ -1120,7 +1124,7 @@ mod tests { testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key}, *, }; - use crate::note::NoteType; + use crate::note::AssetId; use crate::{ note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, value::NoteValue, @@ -1212,7 +1216,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), - NoteType::native(), + AssetId::native(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ) diff --git a/src/note.rs b/src/note.rs index 75c3d9c64..3ac8560e1 100644 --- a/src/note.rs +++ b/src/note.rs @@ -19,8 +19,8 @@ pub use self::commitment::{ExtractedNoteCommitment, NoteCommitment}; pub(crate) mod nullifier; pub use self::nullifier::Nullifier; -pub(crate) mod note_type; -pub use self::note_type::NoteType; +pub(crate) mod asset_id; +pub use self::asset_id::AssetId; /// The ZIP 212 seed randomness for a note. #[derive(Copy, Clone, Debug)] @@ -93,8 +93,8 @@ pub struct Note { recipient: Address, /// The value of this note. value: NoteValue, - /// The type of this note. - note_type: NoteType, + /// The asset id of this note. + asset: AssetId, /// A unique creation ID for this note. /// /// This is set to the nullifier of the note that was spent in the [`Action`] that @@ -134,14 +134,14 @@ impl Note { pub fn from_parts( recipient: Address, value: NoteValue, - note_type: NoteType, + asset: AssetId, rho: Nullifier, rseed: RandomSeed, ) -> CtOption { let note = Note { recipient, value, - note_type, + asset, rho, rseed, }; @@ -156,12 +156,12 @@ impl Note { pub(crate) fn new( recipient: Address, value: NoteValue, - note_type: NoteType, + asset: AssetId, rho: Nullifier, mut rng: impl RngCore, ) -> Self { loop { - let note = Note::from_parts(recipient, value, note_type, rho, RandomSeed::random(&mut rng, &rho)); + let note = Note::from_parts(recipient, value, asset, rho, RandomSeed::random(&mut rng, &rho)); if note.is_some().into() { break note.unwrap(); } @@ -173,11 +173,10 @@ impl Note { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - /// TODO zsa: remove note_type pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, - note_type: NoteType, + asset: AssetId, ) -> (SpendingKey, FullViewingKey, Self) { let sk = SpendingKey::random(rng); let fvk: FullViewingKey = (&sk).into(); @@ -186,7 +185,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), - note_type, + asset, rho.unwrap_or_else(|| Nullifier::dummy(rng)), rng, ); @@ -205,8 +204,8 @@ impl Note { } /// Returns the note type of this note. - pub fn note_type(&self) -> NoteType { - self.note_type + pub fn asset(&self) -> AssetId { + self.asset } /// Returns the rseed value of this note. @@ -250,7 +249,7 @@ impl Note { g_d.to_bytes(), self.recipient.pk_d().to_bytes(), self.value, - self.note_type, + self.asset, self.rho.0, self.rseed.psi(&self.rho), self.rseed.rcm(&self.rho), @@ -296,8 +295,8 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; - use crate::note::note_type::testing::arb_note_type; - use crate::note::note_type::testing::zsa_note_type; + use crate::note::asset_id::testing::arb_asset_id; + use crate::note::asset_id::testing::zsa_asset_id; use crate::value::testing::arb_note_value; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, @@ -318,12 +317,12 @@ pub mod testing { recipient in arb_address(), rho in arb_nullifier(), rseed in arb_rseed(), - note_type in arb_note_type(), + asset in arb_asset_id(), ) -> Note { Note { recipient, value, - note_type, + asset, rho, rseed, } @@ -337,12 +336,12 @@ pub mod testing { value in arb_note_value(), rho in arb_nullifier(), rseed in arb_rseed(), - note_type in zsa_note_type(), + asset in zsa_asset_id(), ) -> Note { Note { recipient, value, - note_type, + asset, rho, rseed, } diff --git a/src/note/note_type.rs b/src/note/asset_id.rs similarity index 73% rename from src/note/note_type.rs rename to src/note/asset_id.rs index cd69f16ea..6d9466e05 100644 --- a/src/note/note_type.rs +++ b/src/note/asset_id.rs @@ -10,7 +10,7 @@ use crate::keys::IssuanceValidatingKey; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] -pub struct NoteType(pallas::Point); +pub struct AssetId(pallas::Point); pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; @@ -20,13 +20,13 @@ fn asset_id_hasher(msg: Vec) -> pallas::Point { pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) } -impl NoteType { - /// Deserialize the note_type from a byte array. +impl AssetId { + /// Deserialize the asset_id from a byte array. pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { - pallas::Point::from_bytes(bytes).map(NoteType) + pallas::Point::from_bytes(bytes).map(AssetId) } - /// Serialize the note_type to its canonical byte representation. + /// Serialize the asset_id to its canonical byte representation. pub fn to_bytes(self) -> [u8; 32] { self.0.to_bytes() } @@ -42,18 +42,18 @@ impl NoteType { /// Panics if `asset_desc` is empty or greater than `MAX_ASSET_DESCRIPTION_SIZE`. #[allow(non_snake_case)] pub fn derive(ik: &IssuanceValidatingKey, asset_desc: &str) -> Self { - assert!(!asset_desc.is_empty() && asset_desc.len() <= MAX_ASSET_DESCRIPTION_SIZE); + assert!(is_asset_desc_of_valid_size(asset_desc)); let mut s = vec![]; s.extend(ik.to_bytes()); s.extend(asset_desc.as_bytes()); - NoteType(asset_id_hasher(s)) + AssetId(asset_id_hasher(s)) } /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. pub fn native() -> Self { - NoteType(asset_id_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) + AssetId(asset_id_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) } /// The base point used in value commitments. @@ -67,14 +67,19 @@ impl NoteType { } } -impl Hash for NoteType { +impl Hash for AssetId { fn hash(&self, h: &mut H) { h.write(&self.to_bytes()); h.finish(); } } -impl PartialEq for NoteType { +/// Check that `asset_desc` is of valid size. +pub fn is_asset_desc_of_valid_size(asset_desc: &str) -> bool { + !asset_desc.is_empty() && asset_desc.bytes().len() <= MAX_ASSET_DESCRIPTION_SIZE +} + +impl PartialEq for AssetId { fn eq(&self, other: &Self) -> bool { bool::from(self.0.ct_eq(&other.0)) } @@ -84,7 +89,7 @@ impl PartialEq for NoteType { #[cfg(any(test, feature = "test-dependencies"))] #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { - use super::NoteType; + use super::AssetId; use proptest::prelude::*; @@ -92,36 +97,36 @@ pub mod testing { prop_compose! { /// Generate a uniformly distributed note type - pub fn arb_note_type()( + pub fn arb_asset_id()( is_native in prop::bool::ANY, sk in arb_spending_key(), str in "[A-Za-z]{255}", - ) -> NoteType { + ) -> AssetId { if is_native { - NoteType::native() + AssetId::native() } else { let isk = IssuanceAuthorizingKey::from(&sk); - NoteType::derive(&IssuanceValidatingKey::from(&isk), &str) + AssetId::derive(&IssuanceValidatingKey::from(&isk), &str) } } } prop_compose! { /// Generate the native note type - pub fn native_note_type()(_i in 0..10) -> NoteType { + pub fn native_asset_id()(_i in 0..10) -> AssetId { // TODO: remove _i - NoteType::native() + AssetId::native() } } prop_compose! { /// Generate the ZSA note type - pub fn zsa_note_type()( + pub fn zsa_asset_id()( sk in arb_spending_key(), str in "[A-Za-z]{255}" - ) -> NoteType { + ) -> AssetId { let isk = IssuanceAuthorizingKey::from(&sk); - NoteType::derive(&IssuanceValidatingKey::from(&isk), &str) + AssetId::derive(&IssuanceValidatingKey::from(&isk), &str) } } } diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 95dc92a2c..f4bc7247b 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -11,7 +11,7 @@ use crate::{ fixed_bases::{NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION}, L_ORCHARD_BASE, }, - note::note_type::NoteType, + note::asset_id::AssetId, spec::extract_p, value::NoteValue, }; @@ -45,7 +45,7 @@ impl NoteCommitment { g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, - note_type: NoteType, + asset: AssetId, rho: pallas::Base, psi: pallas::Base, rcm: NoteCommitTrapdoor, @@ -64,13 +64,13 @@ impl NoteCommitment { .chain(psi_bits.iter().by_vals().take(L_ORCHARD_BASE)); // TODO: make this constant-time. - if note_type.is_native().into() { + if asset.is_native().into() { // Commit to ZEC notes as per the Orchard protocol. Self::commit(NOTE_COMMITMENT_PERSONALIZATION, zec_note_bits, rcm) } else { // Commit to non-ZEC notes as per the ZSA protocol. // Append the note type to the Orchard note encoding. - let type_bits = BitArray::<_, Lsb0>::new(note_type.to_bytes()); + let type_bits = BitArray::<_, Lsb0>::new(asset.to_bytes()); let zsa_note_bits = zec_note_bits.chain(type_bits.iter().by_vals()); // Commit in a different domain than Orchard notes. diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 57dd76589..48456e261 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -9,7 +9,7 @@ use zcash_note_encryption::{ OUT_PLAINTEXT_SIZE, }; -use crate::note::NoteType; +use crate::note::AssetId; use crate::{ action::Action, keys::{ @@ -72,7 +72,7 @@ where // Check note plaintext version // and parse the asset type accordingly. - let note_type = parse_version_and_asset_type(plaintext)?; + let asset = parse_version_and_asset_type(plaintext)?; // The unwraps below are guaranteed to succeed by the assertion above let diversifier = Diversifier::from_bytes(plaintext[1..12].try_into().unwrap()); @@ -86,19 +86,19 @@ where let recipient = Address::from_parts(diversifier, pk_d); - let note = Option::from(Note::from_parts(recipient, value, note_type, domain.rho, rseed))?; + let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; Some((note, recipient)) } -fn parse_version_and_asset_type(plaintext: &[u8]) -> Option { +fn parse_version_and_asset_type(plaintext: &[u8]) -> Option { // TODO: make this constant-time? match plaintext[0] { - 0x02 => Some(NoteType::native()), + 0x02 => Some(AssetId::native()), 0x03 if plaintext.len() >= COMPACT_ZSA_NOTE_SIZE => { let bytes = &plaintext[COMPACT_NOTE_SIZE..COMPACT_ZSA_NOTE_SIZE] .try_into() .unwrap(); - NoteType::from_bytes(bytes).into() + AssetId::from_bytes(bytes).into() } _ => None, } @@ -192,18 +192,18 @@ impl Domain for OrchardDomain { _: &Self::Recipient, memo: &Self::Memo, ) -> NotePlaintextBytes { - let is_native: bool = note.note_type().is_native().into(); + let is_native: bool = note.asset().is_native().into(); let mut np = [0; NOTE_PLAINTEXT_SIZE]; np[0] = if is_native { 0x02 } else { 0x03 }; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); - // todo: add note_type + // todo: add asset_id np[20..52].copy_from_slice(note.rseed().as_bytes()); if is_native { np[52..].copy_from_slice(memo); } else { - let zsa_type = note.note_type().to_bytes(); + let zsa_type = note.asset().to_bytes(); np[52..84].copy_from_slice(&zsa_type); let short_memo = &memo[0..memo.len() - ZSA_TYPE_SIZE]; np[84..].copy_from_slice(short_memo); @@ -276,13 +276,13 @@ impl Domain for OrchardDomain { fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { let mut memo = [0; MEMO_SIZE]; - match get_note_version(plaintext) { + match get_note_plaintext_version(plaintext) { 0x02 => { let full_memo = &plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; memo.copy_from_slice(full_memo); } 0x03 => { - // ZSA note plaintext have a shorter memo. + // ZSA note plaintexts have a shorter memo. let short_memo = &plaintext.0[COMPACT_ZSA_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; memo[..ZSA_MEMO_SIZE].copy_from_slice(short_memo); } @@ -316,7 +316,7 @@ impl BatchDomain for OrchardDomain { } } -fn get_note_version(plaintext: &NotePlaintextBytes) -> u8 { +fn get_note_plaintext_version(plaintext: &NotePlaintextBytes) -> u8 { plaintext.0[0] } @@ -410,7 +410,7 @@ mod tests { }; use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; - use crate::note::NoteType; + use crate::note::AssetId; use crate::{ action::Action, keys::{ @@ -426,7 +426,7 @@ mod tests { Address, Note, }; - use super::{get_note_version, orchard_parse_note_plaintext_without_memo}; + use super::{get_note_plaintext_version, orchard_parse_note_plaintext_without_memo}; proptest! { #[test] @@ -440,7 +440,7 @@ mod tests { // Decode. let domain = OrchardDomain { rho: note.rho() }; - let parsed_version = get_note_version(&plaintext); + let parsed_version = get_note_plaintext_version(&plaintext); let parsed_memo = domain.extract_memo(&plaintext); let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &plaintext.0, @@ -454,7 +454,7 @@ mod tests { assert_eq!(parsed_note, note); assert_eq!(parsed_recipient, note.recipient()); - if parsed_note.note_type().is_native().into() { + if parsed_note.asset().is_native().into() { assert_eq!(parsed_version, 0x02); assert_eq!(&parsed_memo, memo); } else { @@ -510,12 +510,12 @@ mod tests { let recipient = Address::from_parts(d, pk_d); - let note_type = match tv.note_type { - None => NoteType::native(), - Some(type_bytes) => NoteType::from_bytes(&type_bytes).unwrap(), + let asset = match tv.asset { + None => AssetId::native(), + Some(type_bytes) => AssetId::from_bytes(&type_bytes).unwrap(), }; - let note = Note::from_parts(recipient, value, note_type, rho, rseed).unwrap(); + let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( @@ -554,7 +554,7 @@ mod tests { assert_eq!(decrypted_note, note); assert_eq!(decrypted_to, recipient); } - None => assert!(tv.note_type.is_some(), "Compact note decryption failed"), + None => assert!(tv.asset.is_some(), "Compact note decryption failed"), // Ignore that ZSA notes are not detected in compact decryption. } diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index 7d2b7c960..9501a79b1 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -20,7 +20,7 @@ pub(crate) struct TestVector { pub(crate) ock: [u8; 32], pub(crate) op: [u8; 64], pub(crate) c_out: [u8; 80], - pub(crate) note_type: Option<[u8; 32]>, + pub(crate) asset: Option<[u8; 32]>, } pub(crate) fn test_vectors() -> Vec { @@ -233,7 +233,7 @@ pub(crate) fn test_vectors() -> Vec { 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -443,7 +443,7 @@ pub(crate) fn test_vectors() -> Vec { 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -653,7 +653,7 @@ pub(crate) fn test_vectors() -> Vec { 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -863,7 +863,7 @@ pub(crate) fn test_vectors() -> Vec { 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -1073,7 +1073,7 @@ pub(crate) fn test_vectors() -> Vec { 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -1283,7 +1283,7 @@ pub(crate) fn test_vectors() -> Vec { 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -1493,7 +1493,7 @@ pub(crate) fn test_vectors() -> Vec { 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -1703,7 +1703,7 @@ pub(crate) fn test_vectors() -> Vec { 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -1913,7 +1913,7 @@ pub(crate) fn test_vectors() -> Vec { 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -2123,7 +2123,7 @@ pub(crate) fn test_vectors() -> Vec { 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, ], - note_type: None, + asset: None, }, TestVector { incoming_viewing_key: [ @@ -2333,7 +2333,7 @@ pub(crate) fn test_vectors() -> Vec { 0x13, 0x51, 0xe2, 0x4b, 0x47, 0x02, 0x87, 0xd5, 0x83, 0xba, 0x69, 0x71, 0x18, 0xec, 0x07, 0xf6, 0x59, 0x2c, 0x4c, 0xd7, 0xcd, 0x6a, 0xc7, 0x7e, ], - note_type: Some([ + asset: Some([ 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, @@ -2547,7 +2547,7 @@ pub(crate) fn test_vectors() -> Vec { 0xe8, 0x27, 0xdd, 0x43, 0x89, 0xb8, 0x57, 0xd1, 0x6d, 0xb8, 0x24, 0xe7, 0x72, 0xba, 0x5a, 0xb5, 0xe2, 0x8d, 0xd6, 0xe9, 0x80, 0x82, 0x6b, 0xed, ], - note_type: Some([ + asset: Some([ 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, @@ -2761,7 +2761,7 @@ pub(crate) fn test_vectors() -> Vec { 0xe7, 0xb9, 0x41, 0x0d, 0x6b, 0xe7, 0x59, 0x2a, 0xed, 0xa9, 0xf5, 0x2d, 0x56, 0xd8, 0xc9, 0xf9, 0x3a, 0x0b, 0xe3, 0x8c, 0xfc, 0x8d, 0xc2, 0x94, ], - note_type: Some([ + asset: Some([ 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, 0x42, 0x68, 0x3c, @@ -2975,7 +2975,7 @@ pub(crate) fn test_vectors() -> Vec { 0xb3, 0x76, 0xcf, 0x33, 0xc9, 0xff, 0x27, 0xa5, 0xaa, 0x01, 0x58, 0x24, 0xe6, 0x78, 0x6e, 0x16, 0xe3, 0x7b, 0x35, 0x5c, 0xf7, 0x54, 0x52, 0xdb, ], - note_type: Some([ + asset: Some([ 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, @@ -3189,7 +3189,7 @@ pub(crate) fn test_vectors() -> Vec { 0x9a, 0xb5, 0xa7, 0xce, 0x77, 0x2b, 0x52, 0x2c, 0x4b, 0xaa, 0x12, 0x95, 0xd8, 0x8f, 0x15, 0xdc, 0x75, 0x1d, 0xdf, 0x7d, 0x20, 0x8d, 0xd5, 0x17, ], - note_type: Some([ + asset: Some([ 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, @@ -3403,7 +3403,7 @@ pub(crate) fn test_vectors() -> Vec { 0x1e, 0x58, 0x7e, 0x43, 0xfd, 0xfc, 0x65, 0xfe, 0x52, 0xf1, 0xe0, 0xc6, 0xa0, 0x46, 0x46, 0x48, 0xcd, 0x1f, 0xc8, 0x9e, 0x80, 0xbd, 0x78, 0x0f, ], - note_type: Some([ + asset: Some([ 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, @@ -3617,7 +3617,7 @@ pub(crate) fn test_vectors() -> Vec { 0x51, 0xa5, 0x38, 0x28, 0x0d, 0xaa, 0x94, 0x20, 0x3a, 0xb5, 0x02, 0xa8, 0x15, 0x09, 0xe4, 0x3a, 0x61, 0xa6, 0x98, 0x56, 0x57, 0xd9, 0xe8, 0x4e, ], - note_type: Some([ + asset: Some([ 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, @@ -3831,7 +3831,7 @@ pub(crate) fn test_vectors() -> Vec { 0xe2, 0x31, 0x31, 0xf4, 0xe7, 0x6b, 0xa7, 0x6b, 0x9d, 0x64, 0x66, 0x78, 0xd8, 0x53, 0xd1, 0xdc, 0xaf, 0x81, 0xb8, 0x0e, 0x2e, 0xfd, 0xf0, 0x60, ], - note_type: Some([ + asset: Some([ 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, 0xc3, 0x93, 0x11, 0x78, 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, 0xe5, 0xf5, 0xd4, 0xbc, @@ -4045,7 +4045,7 @@ pub(crate) fn test_vectors() -> Vec { 0xd8, 0x15, 0xf7, 0x29, 0x8c, 0x1d, 0x59, 0x09, 0x1f, 0x1b, 0x38, 0x7a, 0x26, 0x46, 0xe7, 0xfe, 0x36, 0x3a, 0xde, 0x83, 0x63, 0xa9, 0x2a, 0xde, ], - note_type: Some([ + asset: Some([ 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, 0xe3, 0x7a, 0x83, 0xec, 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, 0x29, 0x03, 0x35, 0xaa, @@ -4259,7 +4259,7 @@ pub(crate) fn test_vectors() -> Vec { 0x62, 0x00, 0xfb, 0x18, 0x7d, 0x2c, 0x16, 0x90, 0x65, 0xaf, 0x84, 0xcc, 0x02, 0x3d, 0x6d, 0x63, 0xce, 0x05, 0x83, 0x28, 0xe2, 0x47, 0xb5, 0x98, ], - note_type: Some([ + asset: Some([ 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, 0xab, 0xcf, 0xac, 0x88, 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, 0x07, 0x2d, 0x2d, 0x18, diff --git a/src/value.rs b/src/value.rs index d6e18ba23..02d845b4c 100644 --- a/src/value.rs +++ b/src/value.rs @@ -53,7 +53,7 @@ use pasta_curves::{ use rand::RngCore; use subtle::CtOption; -use crate::note::NoteType; +use crate::note::AssetId; use crate::{ constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES}, primitives::redpallas::{self, Binding}, @@ -325,7 +325,7 @@ impl ValueCommitment { /// /// [concretehomomorphiccommit]: https://zips.z.cash/protocol/nu5.pdf#concretehomomorphiccommit #[allow(non_snake_case)] - pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, note_type: NoteType) -> Self { + pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, asset: AssetId) -> Self { let hasher = pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION); let R = hasher(&VALUE_COMMITMENT_R_BYTES); let abs_value = u64::try_from(value.0.abs()).expect("value must be in valid range"); @@ -336,7 +336,7 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - let V_zsa = note_type.cv_base(); + let V_zsa = asset.cv_base(); ValueCommitment(V_zsa * value + R * rcv.0) } @@ -441,9 +441,9 @@ pub mod testing { #[cfg(test)] mod tests { - use crate::note::note_type::testing::{arb_note_type, native_note_type}; + use crate::note::asset_id::testing::{arb_asset_id, native_asset_id}; - use crate::note::NoteType; + use crate::note::AssetId; use proptest::prelude::*; use super::{ @@ -453,8 +453,8 @@ mod tests { use crate::primitives::redpallas; fn _bsk_consistent_with_bvk( - native_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], - arb_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], + native_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], + arb_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], neg_trapdoors: &[ValueCommitTrapdoor], ) { // for each arb value, create a negative value with a different trapdoor @@ -462,7 +462,7 @@ mod tests { .iter() .cloned() .zip(neg_trapdoors.iter().cloned()) - .map(|((value, _, note_type), rcv)| ((-value).unwrap(), rcv, note_type)) + .map(|((value, _, asset), rcv)| ((-value).unwrap(), rcv, asset)) .collect(); let native_value_balance = native_values @@ -481,12 +481,12 @@ mod tests { let bvk = (values .iter() - .map(|(value, rcv, note_type)| ValueCommitment::derive(*value, *rcv, *note_type)) + .map(|(value, rcv, asset)| ValueCommitment::derive(*value, *rcv, *asset)) .sum::() - ValueCommitment::derive( native_value_balance, ValueCommitTrapdoor::zero(), - NoteType::native(), + AssetId::native(), )) .into_bvk(); @@ -498,7 +498,7 @@ mod tests { fn bsk_consistent_with_bvk_native_only( native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_note_type()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_id()), n_values) ) ), ) { @@ -512,12 +512,12 @@ mod tests { fn bsk_consistent_with_bvk( native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_note_type()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_id()), n_values) ) ), (arb_values,neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| (arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_note_type()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_id()), n_values) ), prop::collection::vec(arb_trapdoor(), n_values)) ), ) { diff --git a/tests/builder.rs b/tests/builder.rs index bf94fc2ee..312541ecf 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -1,5 +1,5 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Hashable, Tree}; -use orchard::note::NoteType; +use orchard::note::AssetId; use orchard::{ builder::Builder, bundle::{Authorized, Flags}, @@ -68,7 +68,7 @@ fn bundle_chain() { None, recipient, NoteValue::from_raw(5000), - NoteType::native(), + AssetId::native(), None ), Ok(()) @@ -103,7 +103,7 @@ fn bundle_chain() { None, recipient, NoteValue::from_raw(5000), - NoteType::native(), + AssetId::native(), None ), Ok(()) diff --git a/tests/zsa.rs b/tests/zsa.rs index 6dfff6dc0..f8ae6d23c 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -6,14 +6,14 @@ use incrementalmerkletree::{Hashable, Tree}; use orchard::bundle::Authorized; use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; -use orchard::note::{ExtractedNoteCommitment, NoteType}; +use orchard::note::{AssetId, ExtractedNoteCommitment}; use orchard::note_encryption::OrchardDomain; use orchard::tree::{MerkleHashOrchard, MerklePath}; use orchard::{ builder::Builder, bundle::Flags, circuit::{ProvingKey, VerifyingKey}, - keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, + keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey, PreparedIncomingViewingKey}, value::NoteValue, Address, Anchor, Bundle, Note, }; @@ -189,7 +189,7 @@ fn create_native_note(keys: &Keychain) -> Note { None, keys.recipient, NoteValue::from_raw(100), - NoteType::native(), + AssetId::native(), None ), Ok(()) @@ -205,7 +205,7 @@ fn create_native_note(keys: &Keychain) -> Note { .iter() .find_map(|action| { let domain = OrchardDomain::for_action(action); - try_note_decryption(&domain, &ivk, action) + try_note_decryption(&domain, &PreparedIncomingViewingKey::new(&ivk), action) }) .unwrap(); @@ -225,7 +225,7 @@ impl TestSpendInfo { struct TestOutputInfo { value: NoteValue, - note_type: NoteType, + asset: AssetId, } fn build_and_verify_bundle( @@ -247,7 +247,7 @@ fn build_and_verify_bundle( }); outputs.iter().for_each(|output| { assert_eq!( - builder.add_recipient(None, keys.recipient, output.value, output.note_type, None), + builder.add_recipient(None, keys.recipient, output.value, output.asset, None), Ok(()) ) }); @@ -289,7 +289,7 @@ fn zsa_issue_and_transfer() { vec![&zsa_spend_1], vec![TestOutputInfo { value: zsa_spend_1.note.value(), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }], anchor, 2, @@ -303,11 +303,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }, TestOutputInfo { value: NoteValue::from_raw(delta), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }, ], anchor, @@ -322,7 +322,7 @@ fn zsa_issue_and_transfer() { value: NoteValue::from_raw( zsa_spend_1.note.value().inner() + zsa_spend_2.note.value().inner(), ), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }], anchor, 2, @@ -335,11 +335,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }, TestOutputInfo { value: NoteValue::from_raw(zsa_spend_2.note.value().inner() + delta), - note_type: zsa_spend_2.note.note_type(), + asset: zsa_spend_2.note.asset(), }, ], anchor, @@ -353,11 +353,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: zsa_spend_1.note.value(), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }, TestOutputInfo { value: NoteValue::from_raw(100), - note_type: NoteType::native(), + asset: AssetId::native(), }, ], anchor, @@ -383,11 +383,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: zsa_spend_1.note.value(), - note_type: zsa_spend_1.note.note_type(), + asset: zsa_spend_1.note.asset(), }, TestOutputInfo { value: native_spend.note.value(), - note_type: NoteType::native(), + asset: AssetId::native(), }, ], native_anchor, @@ -413,11 +413,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: zsa_spend_t7_1.note.value(), - note_type: zsa_spend_t7_1.note.note_type(), + asset: zsa_spend_t7_1.note.asset(), }, TestOutputInfo { value: zsa_spend_t7_2.note.value(), - note_type: zsa_spend_t7_2.note.note_type(), + asset: zsa_spend_t7_2.note.asset(), }, ], anchor_t7, @@ -432,11 +432,11 @@ fn zsa_issue_and_transfer() { vec![ TestOutputInfo { value: NoteValue::from_raw(zsa_spend_t7_1.note.value().inner() + delta), - note_type: zsa_spend_t7_1.note.note_type(), + asset: zsa_spend_t7_1.note.asset(), }, TestOutputInfo { value: NoteValue::from_raw(zsa_spend_t7_2.note.value().inner() - delta), - note_type: zsa_spend_t7_2.note.note_type(), + asset: zsa_spend_t7_2.note.asset(), }, ], anchor_t7, From 9405f801cd95ad4193c098eea6b47de954198461 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:46:02 +0300 Subject: [PATCH 11/67] verify_issue_bundle() cleanup (#25) * improved `verify_issue_bundle()` --- .github/workflows/bench.yml | 2 +- .github/workflows/ci.yml | 10 +++++----- .github/workflows/lints-stable.yml | 6 +++--- Cargo.toml | 2 +- README.md | 2 +- rust-toolchain | 2 +- src/issuance.rs | 26 +++++++++++++------------- src/note.rs | 8 +++++++- tests/zsa.rs | 2 +- 9 files changed, 33 insertions(+), 27 deletions(-) diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index e8e263848..21f631759 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true - name: Run benchmark run: cargo bench -- --output-format bencher | tee output.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7b900029..101cee1ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true - name: Run tests uses: actions-rs/cargo@v1 @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true - name: Setup mdBook uses: peaceiris/actions-mdbook@v1 @@ -90,7 +90,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -113,7 +113,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 diff --git a/.github/workflows/lints-stable.yml b/.github/workflows/lints-stable.yml index 242041e89..88a727090 100644 --- a/.github/workflows/lints-stable.yml +++ b/.github/workflows/lints-stable.yml @@ -5,19 +5,19 @@ on: pull_request jobs: clippy: - name: Clippy (1.56.1) + name: Clippy (1.61) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61 components: clippy override: true - name: Run Clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.56.1) + name: Clippy (1.61) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings diff --git a/Cargo.toml b/Cargo.toml index 813b0aee3..ed956ef27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ authors = [ "Kris Nuttycombe ", ] edition = "2021" -rust-version = "1.56.1" +rust-version = "1.61" description = "The Orchard shielded transaction protocol" license-file = "LICENSE-BOSL" repository = "https://github.com/zcash/orchard" diff --git a/README.md b/README.md index 12b74651b..4d4ac85eb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) # -Requires Rust 1.56.1+. +Requires Rust 1.61+. ## Documentation diff --git a/rust-toolchain b/rust-toolchain index 43c989b55..4213d88dc 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.56.1 +1.61 diff --git a/src/issuance.rs b/src/issuance.rs index 4fbcd8421..9f15d638f 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -335,32 +335,32 @@ impl IssueBundle { /// Validation for Orchard IssueBundles /// /// A set of previously finalized asset types must be provided. -/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `NoteType`s +/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `AssetId`s /// /// The following checks are performed: /// * For the `IssueBundle`: /// * the Signature on top of the provided `sighash` verifies correctly. /// * For each `IssueAction`: /// * Asset description size is collect. -/// * `NoteType` for the `IssueAction` has not been previously finalized. +/// * `AssetId` for the `IssueAction` has not been previously finalized. /// * For each `Note` inside an `IssueAction`: /// * All notes have the same, correct `NoteType`. pub fn verify_issue_bundle( bundle: &IssueBundle, sighash: [u8; 32], - finalized: &mut HashSet, // The current finalization set. + finalized: &mut HashSet, // The finalization set. ) -> Result<(), Error> { if let Err(e) = bundle.ik.verify(&sighash, &bundle.authorization.signature) { return Err(IssueBundleInvalidSignature(e)); }; - let currently_finalized: &mut HashSet = &mut HashSet::new(); + let s = &mut HashSet::::new(); - // Any IssueAction could have just one properly derived NoteType. - let res = bundle + // An IssueAction could have just one properly derived AssetId. + let newly_finalized = bundle .actions() .iter() - .try_fold(currently_finalized, |acc, action| { + .try_fold(s, |newly_finalized, action| { if !is_asset_desc_of_valid_size(action.asset_desc()) { return Err(WrongAssetDescSize); } @@ -368,21 +368,21 @@ pub fn verify_issue_bundle( // Fail if any note in the IssueAction has incorrect note type. let asset = action.are_note_asset_ids_derived_correctly(bundle.ik())?; - // Fail if the current asset was previously finalized. - if finalized.contains(&asset) || acc.contains(&asset) { + // Fail if the asset was previously finalized. + if finalized.contains(&asset) || newly_finalized.contains(&asset) { return Err(IssueActionPreviouslyFinalizedNoteType(asset)); } // Add to finalization set, if needed. if action.is_finalized() { - acc.insert(asset); + newly_finalized.insert(asset); } - // Proceed with the new asset finalization set. - Ok(acc) + // Proceed with the new finalization set. + Ok(newly_finalized) })?; - finalized.extend(res.iter()); + finalized.extend(newly_finalized.iter()); Ok(()) } diff --git a/src/note.rs b/src/note.rs index 3ac8560e1..d5a58a838 100644 --- a/src/note.rs +++ b/src/note.rs @@ -161,7 +161,13 @@ impl Note { mut rng: impl RngCore, ) -> Self { loop { - let note = Note::from_parts(recipient, value, asset, rho, RandomSeed::random(&mut rng, &rho)); + let note = Note::from_parts( + recipient, + value, + asset, + rho, + RandomSeed::random(&mut rng, &rho), + ); if note.is_some().into() { break note.unwrap(); } diff --git a/tests/zsa.rs b/tests/zsa.rs index f8ae6d23c..f65b18616 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -13,7 +13,7 @@ use orchard::{ builder::Builder, bundle::Flags, circuit::{ProvingKey, VerifyingKey}, - keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey, PreparedIncomingViewingKey}, + keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, value::NoteValue, Address, Anchor, Bundle, Note, }; From d8f3563c1c6ae83ee44627557954313cebfdd796 Mon Sep 17 00:00:00 2001 From: Alexey Koren Date: Wed, 7 Dec 2022 16:19:51 +0100 Subject: [PATCH 12/67] ZSA burn functionality (#35) Added a method to add assets to burn to the Builder bvk computation now includes the burnt assets Added Tests for bsk/bvk consistency for burning Added E2E tests for assets burning --- .circleci/config.yml | 2 +- .github/workflows/bench.yml | 2 +- .github/workflows/ci.yml | 10 +-- .github/workflows/lints-stable.yml | 6 +- .gitignore | 1 - Cargo.toml | 2 +- rust-toolchain | 2 +- src/builder.rs | 58 ++++++++----- src/bundle.rs | 52 +++++++++-- src/value.rs | 76 ++++++++++------ tests/zsa.rs | 135 ++++++++++++++++++++--------- 11 files changed, 238 insertions(+), 108 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ba37a7890..9dead1280 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ jobs: # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor docker: - - image: cimg/rust:1.59.0 + - image: cimg/rust:1.61.0 # Add steps to the job # See: https://circleci.com/docs/2.0/configuration-reference/#steps steps: diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 21f631759..ba1ceea59 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true - name: Run benchmark run: cargo bench -- --output-format bencher | tee output.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 101cee1ec..66b8c4d3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true - name: Run tests uses: actions-rs/cargo@v1 @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true - name: Setup mdBook uses: peaceiris/actions-mdbook@v1 @@ -90,7 +90,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -113,7 +113,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 diff --git a/.github/workflows/lints-stable.yml b/.github/workflows/lints-stable.yml index 88a727090..a000ab449 100644 --- a/.github/workflows/lints-stable.yml +++ b/.github/workflows/lints-stable.yml @@ -5,19 +5,19 @@ on: pull_request jobs: clippy: - name: Clippy (1.61) + name: Clippy (1.61.0) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61 + toolchain: 1.61.0 components: clippy override: true - name: Run Clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.61) + name: Clippy (1.61.0) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings diff --git a/.gitignore b/.gitignore index d7f36bd31..f4ca20140 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,3 @@ Cargo.lock .vscode .idea action-circuit-layout.png -proptest-regressions/*.txt diff --git a/Cargo.toml b/Cargo.toml index ed956ef27..cb7508702 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ authors = [ "Kris Nuttycombe ", ] edition = "2021" -rust-version = "1.61" +rust-version = "1.61.0" description = "The Orchard shielded transaction protocol" license-file = "LICENSE-BOSL" repository = "https://github.com/zcash/orchard" diff --git a/rust-toolchain b/rust-toolchain index 4213d88dc..91951fd8a 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.61 +1.61.0 diff --git a/src/builder.rs b/src/builder.rs index 5c6147022..4229cbb28 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -251,6 +251,7 @@ impl ActionInfo { pub struct Builder { spends: Vec, recipients: Vec, + burn: HashMap, flags: Flags, anchor: Anchor, } @@ -261,6 +262,7 @@ impl Builder { Builder { spends: vec![], recipients: vec![], + burn: HashMap::new(), flags, anchor, } @@ -337,6 +339,17 @@ impl Builder { Ok(()) } + /// Add an instruction to burn a given amount of a specific asset. + pub fn add_burn(&mut self, asset: AssetId, value: NoteValue) -> Result<(), &'static str> { + if asset.is_native().into() { + return Err("Burning is only possible for non-native assets"); + } + let cur = *self.burn.get(&asset).unwrap_or(&ValueSum::zero()); + let sum = (cur + value).ok_or("Orchard ValueSum operation overflowed")?; + self.burn.insert(asset, sum); + Ok(()) + } + /// The net value of the bundle to be built. The value of all spends, /// minus the value of all outputs. /// @@ -366,7 +379,7 @@ impl Builder { /// /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. - pub fn build>( + pub fn build + Copy + Into>( self, mut rng: impl RngCore, ) -> Result, V>, Error> { @@ -419,16 +432,14 @@ impl Builder { let anchor = self.anchor; // Determine the value balance for this bundle, ensuring it is valid. - let value_balance = pre_actions + let native_value_balance: V = pre_actions .iter() + .filter(|action| action.spend.note.asset().is_native().into()) .fold(Some(ValueSum::zero()), |acc, action| { acc? + action.value_sum() }) - .ok_or(OverflowError)?; - - let result_value_balance: V = i64::try_from(value_balance) - .map_err(Error::ValueSum) - .and_then(|i| V::try_from(i).map_err(|_| Error::ValueSum(value::OverflowError)))?; + .ok_or(OverflowError)? + .into()?; // Compute the transaction binding signing key. let bsk = pre_actions @@ -441,26 +452,26 @@ impl Builder { let (actions, circuits): (Vec<_>, Vec<_>) = pre_actions.into_iter().map(|a| a.build(&mut rng)).unzip(); - // Verify that bsk and bvk are consistent. - let bvk = (actions.iter().map(|a| a.cv_net()).sum::() - - ValueCommitment::derive( - value_balance, - ValueCommitTrapdoor::zero(), - AssetId::native(), - )) - .into_bvk(); - assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); - - Ok(Bundle::from_parts( + let bundle = Bundle::from_parts( NonEmpty::from_vec(actions).unwrap(), flags, - result_value_balance, + native_value_balance, + self.burn + .into_iter() + .map(|(asset, value)| Ok((asset, value.into()?))) + .collect::>()?, anchor, InProgress { proof: Unproven { circuits }, sigs: Unauthorized { bsk }, }, - )) + ); + + assert_eq!( + redpallas::VerificationKey::from(&bundle.authorization().sigs.bsk), + bundle.binding_validating_key() + ); + Ok(bundle) } } @@ -785,7 +796,7 @@ pub mod testing { impl ArbitraryBundleInputs { /// Create a bundle from the set of arbitrary bundle inputs. - fn into_bundle>(mut self) -> Bundle { + fn into_bundle + Copy + Into>(mut self) -> Bundle { let fvk = FullViewingKey::from(&self.sk); let flags = Flags::from_parts(true, true); let mut builder = Builder::new(flags, self.anchor); @@ -866,14 +877,15 @@ pub mod testing { } /// Produce an arbitrary valid Orchard bundle using a random spending key. - pub fn arb_bundle + Debug>() -> impl Strategy> { + pub fn arb_bundle + Debug + Copy + Into>( + ) -> impl Strategy> { arb_spending_key() .prop_flat_map(arb_bundle_inputs) .prop_map(|inputs| inputs.into_bundle::()) } /// Produce an arbitrary valid Orchard bundle using a specified spending key. - pub fn arb_bundle_with_key + Debug>( + pub fn arb_bundle_with_key + Debug + Copy + Into>( k: SpendingKey, ) -> impl Strategy> { arb_bundle_inputs(k).prop_map(|inputs| inputs.into_bundle::()) diff --git a/src/bundle.rs b/src/bundle.rs index 6f7e0bce9..cbc66e796 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -140,6 +140,9 @@ pub struct Bundle { /// /// This is the sum of Orchard spends minus the sum of Orchard outputs. value_balance: V, + /// Assets intended for burning + /// TODO We need to add a consensus check to make sure that it is impossible to burn ZEC. + burn: Vec<(AssetId, V)>, /// The root of the Orchard commitment tree that this bundle commits to. anchor: Anchor, /// The authorization for this bundle. @@ -172,6 +175,7 @@ impl Bundle { actions: NonEmpty>, flags: Flags, value_balance: V, + burn: Vec<(AssetId, V)>, anchor: Anchor, authorization: T, ) -> Self { @@ -179,6 +183,7 @@ impl Bundle { actions, flags, value_balance, + burn, anchor, authorization, } @@ -214,8 +219,8 @@ impl Bundle { } /// Construct a new bundle by applying a transformation that might fail - /// to the value balance. - pub fn try_map_value_balance Result>( + /// to the value balance and balances of assets to burn. + pub fn try_map_value_balance Result>( self, f: F, ) -> Result, E> { @@ -223,6 +228,11 @@ impl Bundle { actions: self.actions, flags: self.flags, value_balance: f(self.value_balance)?, + burn: self + .burn + .into_iter() + .map(|(asset, value)| Ok((asset, f(value)?))) + .collect::, E>>()?, anchor: self.anchor, authorization: self.authorization, }) @@ -244,6 +254,7 @@ impl Bundle { value_balance: self.value_balance, anchor: self.anchor, authorization: step(context, authorization), + burn: self.burn, } } @@ -267,6 +278,7 @@ impl Bundle { value_balance: self.value_balance, anchor: self.anchor, authorization: step(context, authorization)?, + burn: self.burn, }) } @@ -386,7 +398,19 @@ impl> Bundle { ValueSum::from_raw(self.value_balance.into()), ValueCommitTrapdoor::zero(), AssetId::native(), - )) + ) + - self + .burn + .clone() + .into_iter() + .map(|(asset, value)| { + ValueCommitment::derive( + ValueSum::from_raw(value.into()), + ValueCommitTrapdoor::zero(), + asset, + ) + }) + .sum::()) .into_bvk() } } @@ -503,6 +527,9 @@ pub mod testing { use super::{Action, Authorization, Authorized, Bundle, Flags}; pub use crate::action::testing::{arb_action, arb_unauthorized_action}; + use crate::note::asset_id::testing::zsa_asset_id; + use crate::note::AssetId; + use crate::value::testing::arb_value_sum; /// Marker for an unauthorized bundle with no proofs or signatures. #[derive(Debug)] @@ -562,6 +589,13 @@ pub mod testing { }) } + prop_compose! { + /// Create an arbitrary vector of assets to burn. + pub fn arb_asset_to_burn()(asset_id in zsa_asset_id(), value in arb_value_sum()) -> (AssetId, ValueSum) { + (asset_id, value) + } + } + prop_compose! { /// Create an arbitrary set of flags. pub fn arb_flags()(spends_enabled in prop::bool::ANY, outputs_enabled in prop::bool::ANY) -> Flags { @@ -589,7 +623,8 @@ pub mod testing { ( acts in vec(arb_unauthorized_action_n(n_actions, flags), n_actions), anchor in arb_base().prop_map(Anchor::from), - flags in Just(flags) + flags in Just(flags), + burn in vec(arb_asset_to_burn(), 1usize..10) ) -> Bundle { let (balances, actions): (Vec, Vec>) = acts.into_iter().unzip(); @@ -597,8 +632,9 @@ pub mod testing { NonEmpty::from_vec(actions).unwrap(), flags, balances.into_iter().sum::>().unwrap(), + burn, anchor, - Unauthorized + Unauthorized, ) } } @@ -618,7 +654,8 @@ pub mod testing { rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_proof in vec(prop::num::u8::ANY, 1973), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), - flags in Just(flags) + flags in Just(flags), + burn in vec(arb_asset_to_burn(), 1usize..10) ) -> Bundle { let (balances, actions): (Vec, Vec>) = acts.into_iter().unzip(); let rng = StdRng::from_seed(rng_seed); @@ -627,11 +664,12 @@ pub mod testing { NonEmpty::from_vec(actions).unwrap(), flags, balances.into_iter().sum::>().unwrap(), + burn, anchor, Authorized { proof: Proof::new(fake_proof), binding_signature: sk.sign(rng, &fake_sighash), - } + }, ) } } diff --git a/src/value.rs b/src/value.rs index 02d845b4c..dd3a5546d 100644 --- a/src/value.rs +++ b/src/value.rs @@ -53,6 +53,7 @@ use pasta_curves::{ use rand::RngCore; use subtle::CtOption; +use crate::builder::Error; use crate::note::AssetId; use crate::{ constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES}, @@ -129,6 +130,12 @@ impl From<&NoteValue> for Assigned { } } +impl From for i128 { + fn from(value: NoteValue) -> Self { + value.0 as i128 + } +} + impl Sub for NoteValue { type Output = ValueSum; @@ -181,15 +188,21 @@ impl ValueSum { sign, ) } + + pub(crate) fn into>(self) -> Result { + i64::try_from(self) + .map_err(Error::ValueSum) + .and_then(|i| V::try_from(i).map_err(|_| Error::ValueSum(OverflowError))) + } } -impl Add for ValueSum { +impl> Add for ValueSum { type Output = Option; #[allow(clippy::suspicious_arithmetic_impl)] - fn add(self, rhs: Self) -> Self::Output { + fn add(self, rhs: T) -> Self::Output { self.0 - .checked_add(rhs.0) + .checked_add(rhs.into()) .filter(|v| VALUE_SUM_RANGE.contains(v)) .map(ValueSum) } @@ -227,6 +240,12 @@ impl TryFrom for i64 { } } +impl From for i128 { + fn from(value: ValueSum) -> Self { + value.0 + } +} + /// The blinding factor for a [`ValueCommitment`]. #[derive(Clone, Copy, Debug)] pub struct ValueCommitTrapdoor(pallas::Scalar); @@ -452,10 +471,11 @@ mod tests { }; use crate::primitives::redpallas; - fn _bsk_consistent_with_bvk( + fn check_binding_signature( native_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], arb_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], neg_trapdoors: &[ValueCommitTrapdoor], + arb_values_to_burn: &[(ValueSum, ValueCommitTrapdoor, AssetId)], ) { // for each arb value, create a negative value with a different trapdoor let neg_arb_values: Vec<_> = arb_values @@ -471,7 +491,13 @@ mod tests { .sum::>() .expect("we generate values that won't overflow"); - let values = [native_values, arb_values, &neg_arb_values].concat(); + let values = [ + native_values, + arb_values, + &neg_arb_values, + arb_values_to_burn, + ] + .concat(); let bsk = values .iter() @@ -480,14 +506,20 @@ mod tests { .into_bsk(); let bvk = (values - .iter() - .map(|(value, rcv, asset)| ValueCommitment::derive(*value, *rcv, *asset)) + .into_iter() + .map(|(value, rcv, asset)| ValueCommitment::derive(value, rcv, asset)) .sum::() - ValueCommitment::derive( native_value_balance, ValueCommitTrapdoor::zero(), AssetId::native(), - )) + ) + - arb_values_to_burn + .iter() + .map(|(value, _, asset)| { + ValueCommitment::derive(*value, ValueCommitTrapdoor::zero(), *asset) + }) + .sum::()) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); @@ -495,34 +527,26 @@ mod tests { proptest! { #[test] - fn bsk_consistent_with_bvk_native_only( - native_values in (1usize..10).prop_flat_map(|n_values| - arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_id()), n_values) - ) - ), - ) { - // Test with native note type (zec) only - _bsk_consistent_with_bvk(&native_values, &[], &[]); - } - } - - proptest! { - #[test] - fn bsk_consistent_with_bvk( + fn bsk_consistent_with_bvk_native_with_zsa_transfer_and_burning( native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_id()), n_values) ) ), - (arb_values,neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| + (asset_values, neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| (arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_id()), n_values) ), prop::collection::vec(arb_trapdoor(), n_values)) ), + burn_values in (1usize..10).prop_flat_map(|n_values| + arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64) + .prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_id()), n_values)) + ) ) { - // Test with native note type (zec) - _bsk_consistent_with_bvk(&native_values, &arb_values, &neg_trapdoors); + check_binding_signature(&native_values, &[], &[], &[]); + check_binding_signature(&native_values, &[], &[], &burn_values); + check_binding_signature(&native_values, &asset_values, &neg_trapdoors, &[]); + check_binding_signature(&native_values, &asset_values, &neg_trapdoors, &burn_values); } } } diff --git a/tests/zsa.rs b/tests/zsa.rs index f65b18616..9aad802d5 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -231,32 +231,31 @@ struct TestOutputInfo { fn build_and_verify_bundle( spends: Vec<&TestSpendInfo>, outputs: Vec, + assets_to_burn: Vec<(AssetId, NoteValue)>, anchor: Anchor, expected_num_actions: usize, keys: &Keychain, -) { +) -> Result<(), &'static str> { let rng = OsRng; let shielded_bundle: Bundle<_, i64> = { let mut builder = Builder::new(Flags::from_parts(true, true), anchor); - spends.iter().for_each(|spend| { - assert_eq!( - builder.add_spend(keys.fvk().clone(), spend.note, spend.merkle_path().clone()), - Ok(()) - ); - }); - outputs.iter().for_each(|output| { - assert_eq!( - builder.add_recipient(None, keys.recipient, output.value, output.asset, None), - Ok(()) - ) - }); + spends.iter().try_for_each(|spend| { + builder.add_spend(keys.fvk().clone(), spend.note, spend.merkle_path().clone()) + })?; + outputs.iter().try_for_each(|output| { + builder.add_recipient(None, keys.recipient, output.value, output.asset, None) + })?; + assets_to_burn + .into_iter() + .try_for_each(|(asset, value)| builder.add_burn(asset, value))?; build_and_sign_bundle(builder, rng, keys.pk(), keys.sk()) }; // Verify the shielded bundle, currently without the proof. verify_bundle(&shielded_bundle, &keys.vk, false); assert_eq!(shielded_bundle.actions().len(), expected_num_actions); + Ok(()) } /// Issue several ZSA and native notes and spend them in different combinations, e.g. split and join @@ -268,20 +267,32 @@ fn zsa_issue_and_transfer() { let asset_descr = "zsa_asset"; // Prepare ZSA - let (zsa_note1, zsa_note2) = issue_zsa_notes(asset_descr, &keys); + let (zsa_note_1, zsa_note_2) = issue_zsa_notes(asset_descr, &keys); let (merkle_path1, merkle_path2, anchor) = - build_merkle_path_with_two_leaves(&zsa_note1, &zsa_note2); + build_merkle_path_with_two_leaves(&zsa_note_1, &zsa_note_2); let zsa_spend_1 = TestSpendInfo { - note: zsa_note1, + note: zsa_note_1, merkle_path: merkle_path1, }; let zsa_spend_2 = TestSpendInfo { - note: zsa_note2, + note: zsa_note_2, merkle_path: merkle_path2, }; + let native_note = create_native_note(&keys); + let (native_merkle_path_1, native_merkle_path_2, native_anchor) = + build_merkle_path_with_two_leaves(&native_note, &zsa_note_1); + let native_spend: TestSpendInfo = TestSpendInfo { + note: native_note, + merkle_path: native_merkle_path_1, + }; + let zsa_spend_with_native: TestSpendInfo = TestSpendInfo { + note: zsa_note_1, + merkle_path: native_merkle_path_2, + }; + // --------------------------- Tests ----------------------------------------- // 1. Spend single ZSA note @@ -291,10 +302,12 @@ fn zsa_issue_and_transfer() { value: zsa_spend_1.note.value(), asset: zsa_spend_1.note.asset(), }], + vec![], anchor, 2, &keys, - ); + ) + .unwrap(); // 2. Split single ZSA note into 2 notes let delta = 2; // arbitrary number for value manipulation @@ -310,10 +323,12 @@ fn zsa_issue_and_transfer() { asset: zsa_spend_1.note.asset(), }, ], + vec![], anchor, 2, &keys, - ); + ) + .unwrap(); // 3. Join 2 ZSA notes into a single note build_and_verify_bundle( @@ -324,10 +339,12 @@ fn zsa_issue_and_transfer() { ), asset: zsa_spend_1.note.asset(), }], + vec![], anchor, 2, &keys, - ); + ) + .unwrap(); // 4. Take 2 ZSA notes and send them as 2 notes with different denomination build_and_verify_bundle( @@ -342,10 +359,12 @@ fn zsa_issue_and_transfer() { asset: zsa_spend_2.note.asset(), }, ], + vec![], anchor, 2, &keys, - ); + ) + .unwrap(); // 5. Spend single ZSA note, mixed with native note (shielding) build_and_verify_bundle( @@ -360,24 +379,14 @@ fn zsa_issue_and_transfer() { asset: AssetId::native(), }, ], + vec![], anchor, 4, &keys, - ); + ) + .unwrap(); // 6. Spend single ZSA note, mixed with native note (shielded to shielded) - let native_note = create_native_note(&keys); - let (native_merkle_path1, native_merkle_path2, native_anchor) = - build_merkle_path_with_two_leaves(&native_note, &zsa_note1); - let native_spend: TestSpendInfo = TestSpendInfo { - note: native_note, - merkle_path: native_merkle_path1, - }; - let zsa_spend_with_native: TestSpendInfo = TestSpendInfo { - note: zsa_note1, - merkle_path: native_merkle_path2, - }; - build_and_verify_bundle( vec![&zsa_spend_with_native, &native_spend], vec![ @@ -390,21 +399,23 @@ fn zsa_issue_and_transfer() { asset: AssetId::native(), }, ], + vec![], native_anchor, 4, &keys, - ); + ) + .unwrap(); // 7. Spend ZSA notes of different asset types let (zsa_note_t7, _) = issue_zsa_notes("zsa_asset2", &keys); let (merkle_path_t7_1, merkle_path_t7_2, anchor_t7) = - build_merkle_path_with_two_leaves(&zsa_note_t7, &zsa_note2); + build_merkle_path_with_two_leaves(&zsa_note_t7, &zsa_note_2); let zsa_spend_t7_1: TestSpendInfo = TestSpendInfo { note: zsa_note_t7, merkle_path: merkle_path_t7_1, }; let zsa_spend_t7_2: TestSpendInfo = TestSpendInfo { - note: zsa_note2, + note: zsa_note_2, merkle_path: merkle_path_t7_2, }; @@ -420,10 +431,12 @@ fn zsa_issue_and_transfer() { asset: zsa_spend_t7_2.note.asset(), }, ], + vec![], anchor_t7, 4, &keys, - ); + ) + .unwrap(); // 8. Same but wrong denomination let result = std::panic::catch_unwind(|| { @@ -439,10 +452,54 @@ fn zsa_issue_and_transfer() { asset: zsa_spend_t7_2.note.asset(), }, ], + vec![], anchor_t7, 4, &keys, - ); + ) + .unwrap(); }); assert!(result.is_err()); + + // 9. Burn ZSA assets + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![], + vec![(zsa_spend_1.note.asset(), zsa_spend_1.note.value())], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 10. Burn a partial amount of the ZSA assets + let value_to_burn = 3; + let value_to_transfer = zsa_spend_1.note.value().inner() - value_to_burn; + + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: NoteValue::from_raw(value_to_transfer), + asset: zsa_spend_1.note.asset(), + }], + vec![(zsa_spend_1.note.asset(), NoteValue::from_raw(value_to_burn))], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 11. Try to burn native asset - should fail + let result = build_and_verify_bundle( + vec![&native_spend], + vec![], + vec![(AssetId::native(), native_spend.note.value())], + native_anchor, + 2, + &keys, + ); + match result { + Ok(_) => panic!("Test should fail"), + Err(error) => assert_eq!(error, "Burning is only possible for non-native assets"), + } } From 5a50fb8d11361d3f7d1f3b2f6c0a468f88c0db49 Mon Sep 17 00:00:00 2001 From: Alexey Koren Date: Sun, 18 Dec 2022 13:53:27 +0100 Subject: [PATCH 13/67] Create dummy spend in empty builder by default (#36) --- src/builder.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 4229cbb28..9dfaa9efb 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -387,7 +387,7 @@ impl Builder { // Pair up the spends and recipients, extending with dummy values as necessary. for (asset, (mut spends, mut recipients)) in - partition_by_asset(&self.spends, &self.recipients) + partition_by_asset(&self.spends, &self.recipients, &mut rng) { let num_spends = spends.len(); let num_recipients = recipients.len(); @@ -475,10 +475,12 @@ impl Builder { } } -/// partition a list of spends and recipients by note types. +/// Partition a list of spends and recipients by note types. +/// Method creates single dummy ZEC note if spends and recipients are both empty. fn partition_by_asset( spends: &[SpendInfo], recipients: &[RecipientInfo], + rng: &mut impl RngCore, ) -> HashMap, Vec)> { let mut hm = HashMap::new(); @@ -496,6 +498,11 @@ fn partition_by_asset( .push(r.clone()) } + if hm.is_empty() { + let dummy_spend = SpendInfo::dummy(AssetId::native(), rng); + hm.insert(dummy_spend.note.asset(), (vec![dummy_spend], vec![])); + } + hm } From efbfc197a972ba799adc6fff19dbdd415270fcc6 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 20 Dec 2022 15:49:49 +0100 Subject: [PATCH 14/67] AssetID test vectors (#34) --- src/note/asset_id.rs | 17 + src/test_vectors.rs | 1 + src/test_vectors/asset_id.rs | 1032 +++++++++++++++++++++++++++ src/test_vectors/note_encryption.rs | 240 +++---- 4 files changed, 1170 insertions(+), 120 deletions(-) create mode 100644 src/test_vectors/asset_id.rs diff --git a/src/note/asset_id.rs b/src/note/asset_id.rs index 6d9466e05..074e59364 100644 --- a/src/note/asset_id.rs +++ b/src/note/asset_id.rs @@ -129,4 +129,21 @@ pub mod testing { AssetId::derive(&IssuanceValidatingKey::from(&isk), &str) } } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::asset_id::test_vectors(); + + for tv in test_vectors { + let description = std::str::from_utf8(&tv.description).unwrap(); + + let calculated_asset_id = AssetId::derive( + &IssuanceValidatingKey::from_bytes(&tv.key).unwrap(), + description, + ); + let test_vector_asset_id = AssetId::from_bytes(&tv.asset_id).unwrap(); + + assert_eq!(calculated_asset_id, test_vector_asset_id); + } + } } diff --git a/src/test_vectors.rs b/src/test_vectors.rs index 042f3b913..b70b56e56 100644 --- a/src/test_vectors.rs +++ b/src/test_vectors.rs @@ -1,3 +1,4 @@ +pub(crate) mod asset_id; pub(crate) mod commitment_tree; pub(crate) mod keys; pub(crate) mod merkle_path; diff --git a/src/test_vectors/asset_id.rs b/src/test_vectors/asset_id.rs new file mode 100644 index 000000000..c50c0f8f5 --- /dev/null +++ b/src/test_vectors/asset_id.rs @@ -0,0 +1,1032 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_asset_id) + +pub(crate) struct TestVector { + pub(crate) key: [u8; 32], + pub(crate) description: [u8; 512], + pub(crate) asset_id: [u8; 32], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + key: [ + 0x85, 0xc8, 0xb5, 0xcd, 0x1a, 0xc3, 0xec, 0x3a, 0xd7, 0x09, 0x21, 0x32, 0xf9, 0x7f, + 0x01, 0x78, 0xb0, 0x75, 0xc8, 0x1a, 0x13, 0x9f, 0xd4, 0x60, 0xbb, 0xe0, 0xdf, 0xcd, + 0x75, 0x51, 0x47, 0x24, + ], + description: [ + 0xc5, 0xb3, 0xc8, 0xbe, 0xc8, 0x8a, 0xc8, 0x98, 0xcd, 0xbb, 0xc2, 0xb7, 0xc2, 0xa3, + 0xc9, 0x8f, 0xc5, 0x94, 0xc2, 0xb5, 0xc8, 0x9d, 0x21, 0xc7, 0xbc, 0xc3, 0xb6, 0xc5, + 0xa5, 0xc7, 0xae, 0xc4, 0x9c, 0xc6, 0xa4, 0xc3, 0x81, 0xe2, 0xb1, 0xa5, 0xc6, 0xb6, + 0xc8, 0xb6, 0xc8, 0x88, 0xc3, 0x8c, 0xc6, 0x8e, 0x5d, 0x32, 0xc4, 0x9a, 0xc9, 0x84, + 0xc6, 0xbf, 0xc7, 0x9b, 0xc8, 0x99, 0xc7, 0x9d, 0xc8, 0xbc, 0xcd, 0xb2, 0xc4, 0x9e, + 0xc5, 0xa1, 0xc7, 0xa9, 0xc6, 0xbb, 0xc3, 0x80, 0xc8, 0xba, 0xc3, 0xa1, 0xc4, 0x84, + 0x5f, 0xc7, 0xaa, 0xc5, 0xad, 0xc3, 0x80, 0xc6, 0xaf, 0xc3, 0x85, 0xc6, 0xb1, 0xc7, + 0xbf, 0xc7, 0x93, 0xcd, 0xbc, 0xc3, 0xad, 0xc4, 0x94, 0xc5, 0xad, 0xc3, 0xb6, 0xc3, + 0xa4, 0xc7, 0x9e, 0xc7, 0x81, 0x50, 0xc3, 0xb5, 0xc7, 0x86, 0xcd, 0xbd, 0xe1, 0x9b, + 0x90, 0x23, 0xc6, 0x91, 0xc7, 0x85, 0xc6, 0x8a, 0xc6, 0x9a, 0xc7, 0x88, 0x4e, 0xe1, + 0x9b, 0x9f, 0xe1, 0x9b, 0x93, 0xe1, 0x9a, 0xaf, 0xc6, 0xa1, 0xc8, 0xb1, 0xc7, 0x8d, + 0xc5, 0x93, 0xc8, 0xa0, 0xc7, 0x86, 0x4e, 0xc6, 0xb4, 0xc3, 0x80, 0xce, 0x88, 0x77, + 0xe1, 0x9b, 0xa4, 0xc2, 0xaf, 0xc5, 0x91, 0xc7, 0xa9, 0xc8, 0x83, 0x4d, 0xc8, 0x8b, + 0x6b, 0xc7, 0x9b, 0xc7, 0x82, 0x57, 0xe2, 0xb1, 0xb3, 0xc5, 0x98, 0xc3, 0xb2, 0x61, + 0xc5, 0x9b, 0xc3, 0xbe, 0x3f, 0xc5, 0xb5, 0xc3, 0x88, 0x31, 0xc7, 0xb7, 0xc3, 0xa0, + 0xc5, 0xa2, 0x77, 0xc3, 0x94, 0xc7, 0xa7, 0xc3, 0xa4, 0x6c, 0xe1, 0x9b, 0x97, 0xe1, + 0x9b, 0x81, 0xc2, 0xa5, 0xc8, 0x99, 0xc3, 0xa6, 0xc4, 0x9f, 0xc5, 0x89, 0xc8, 0xa2, + 0xc4, 0xb3, 0xc5, 0x9a, 0xc6, 0x90, 0x48, 0xc3, 0x80, 0xc6, 0xb6, 0xc5, 0x92, 0xe1, + 0x9b, 0xa8, 0xc2, 0xa3, 0xc7, 0xba, 0xc2, 0xa2, 0xc8, 0x87, 0xc3, 0xb1, 0xc7, 0xbb, + 0x6d, 0xc8, 0xa2, 0xc7, 0xa2, 0xc6, 0xaf, 0xe1, 0x9b, 0xa3, 0xc3, 0x86, 0xe1, 0x9b, + 0xa1, 0x60, 0x37, 0xc7, 0x91, 0x56, 0xc5, 0x95, 0xc4, 0xbc, 0xc5, 0xbe, 0xc4, 0x97, + 0x5a, 0x31, 0xc5, 0x89, 0xc9, 0x83, 0xc8, 0xb4, 0xc6, 0xa4, 0xc7, 0xb5, 0xe1, 0x9b, + 0x9e, 0xc3, 0xab, 0xcd, 0xb0, 0x56, 0xc7, 0x86, 0xc6, 0x99, 0xe1, 0x9b, 0x96, 0xc7, + 0x90, 0xe1, 0x9b, 0x95, 0xc4, 0xaf, 0xc8, 0xac, 0xe2, 0xb1, 0xa7, 0xc3, 0x91, 0xc9, + 0x8b, 0xc6, 0xad, 0xc5, 0x87, 0x5f, 0xe2, 0xb1, 0xb4, 0xc2, 0xb4, 0xc9, 0x8b, 0xc8, + 0x9b, 0xc7, 0x80, 0xc6, 0xbb, 0xc2, 0xbd, 0xc8, 0xbb, 0xc4, 0xa2, 0x48, 0xc7, 0xa1, + 0xc2, 0xa4, 0xc4, 0x86, 0xe2, 0xb1, 0xa8, 0xc6, 0x87, 0xc7, 0xb9, 0xe1, 0x9a, 0xa0, + 0xc6, 0xb0, 0xc6, 0xad, 0xc9, 0x83, 0xc7, 0x99, 0xc4, 0x9e, 0xe1, 0x9a, 0xbf, 0xc7, + 0xa6, 0x67, 0xc8, 0x95, 0xc3, 0x83, 0xe1, 0x9a, 0xa2, 0xce, 0x8a, 0x57, 0xc3, 0xa3, + 0xc7, 0x81, 0xc6, 0xab, 0xc6, 0xbe, 0x7b, 0xc3, 0x9e, 0xc7, 0x88, 0xe1, 0x9a, 0xae, + 0xc3, 0x94, 0xc6, 0x8e, 0xce, 0x88, 0xe1, 0x9b, 0x96, 0xc3, 0x85, 0xc4, 0xa9, 0xe2, + 0xb1, 0xb4, 0xc7, 0xab, 0xe1, 0x9b, 0x8e, 0xc4, 0xa9, 0xe2, 0xb1, 0xa1, 0xe2, 0xb1, + 0xa0, 0xc7, 0x96, 0xc3, 0xbe, 0xe1, 0x9a, 0xa2, 0xc4, 0xba, 0xe1, 0x9b, 0x95, 0xe2, + 0xb1, 0xaa, 0xc5, 0x88, 0xc6, 0xa2, 0xe1, 0x9b, 0x99, 0xc2, 0xaa, 0xe1, 0x9a, 0xa7, + 0xc6, 0x98, 0x72, 0xe1, 0x9b, 0x88, 0xc6, 0xa0, 0xc5, 0x8f, 0xc2, 0xa6, 0xc2, 0xb8, + 0xc5, 0x8f, 0xc6, 0x9f, 0xc7, 0xb0, 0xc4, 0xb8, 0xc9, 0x8f, 0xc7, 0xac, 0x6e, 0x44, + 0xe1, 0x9a, 0xba, 0xc3, 0xb3, 0xc3, 0x99, 0x5a, + ], + asset_id: [ + 0x29, 0xb8, 0x07, 0x86, 0xde, 0xf6, 0x7e, 0xee, 0xe1, 0xfa, 0x1e, 0xb2, 0x4f, 0xd9, + 0xad, 0xf0, 0xab, 0xba, 0xe1, 0x70, 0x57, 0xeb, 0x4a, 0x04, 0x11, 0x13, 0xa4, 0x4e, + 0x9a, 0x1c, 0x92, 0x33, + ], + }, + TestVector { + key: [ + 0x43, 0x10, 0x6d, 0xe9, 0xa7, 0xec, 0x54, 0xdd, 0x36, 0xdf, 0xa7, 0x0b, 0xdb, 0xd9, + 0x07, 0x2d, 0xbd, 0xda, 0xb5, 0xe0, 0x66, 0xaa, 0xef, 0xfc, 0xf9, 0xbb, 0xa3, 0x20, + 0xd4, 0xff, 0xf7, 0x12, + ], + description: [ + 0x76, 0xc4, 0xb6, 0xc5, 0xb8, 0xe1, 0x9b, 0xa4, 0xc4, 0x9f, 0xc7, 0xb9, 0xc2, 0xb8, + 0xc7, 0x95, 0xc6, 0xbf, 0xc9, 0x87, 0xc5, 0xb3, 0xe1, 0x9b, 0xa1, 0xc5, 0xa9, 0xc3, + 0xa2, 0xc7, 0xb7, 0x77, 0xc6, 0xbf, 0xc6, 0xb5, 0xe1, 0x9a, 0xb6, 0xc3, 0xa2, 0xc5, + 0xbf, 0xe1, 0x9b, 0x82, 0xc4, 0x9c, 0xc6, 0xab, 0xc4, 0xbc, 0xc5, 0xb8, 0xe1, 0x9a, + 0xb6, 0xc7, 0xb7, 0xc2, 0xbe, 0xc7, 0x8e, 0xcd, 0xbd, 0xe1, 0x9a, 0xb4, 0xc8, 0x98, + 0xc8, 0x93, 0xc5, 0xb9, 0xc7, 0xb8, 0xc4, 0x8d, 0xe1, 0x9b, 0x86, 0xc7, 0x85, 0xc7, + 0x8e, 0xc4, 0x9f, 0xc5, 0xa3, 0x47, 0x7a, 0xc6, 0xa3, 0x5e, 0xe1, 0x9a, 0xa7, 0x66, + 0xc8, 0x9a, 0x45, 0xc4, 0x94, 0xc9, 0x8e, 0xc7, 0x9b, 0xc8, 0xbf, 0xe1, 0x9a, 0xa4, + 0x2b, 0xc6, 0xad, 0xc3, 0x9c, 0xc5, 0xbf, 0xc3, 0x91, 0xe1, 0x9b, 0xaf, 0xc5, 0x94, + 0xe1, 0x9b, 0x8d, 0xc2, 0xbb, 0xc4, 0xab, 0xc3, 0x88, 0xc4, 0xac, 0xe1, 0x9b, 0x96, + 0xcd, 0xb7, 0xc3, 0x97, 0x2b, 0x3c, 0xe1, 0x9b, 0x99, 0xc7, 0x91, 0xe1, 0x9a, 0xa4, + 0xc4, 0x8e, 0xc7, 0xa7, 0xe2, 0xb1, 0xac, 0xc2, 0xbc, 0xc4, 0x82, 0xc3, 0x81, 0xc6, + 0xb8, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x95, 0xc4, 0xa4, 0xe1, 0x9b, 0xaa, 0xe1, 0x9a, + 0xa0, 0xc5, 0xbe, 0xe1, 0x9b, 0x8a, 0x34, 0xc7, 0x82, 0x7d, 0xe1, 0x9a, 0xbe, 0xc4, + 0x83, 0xe1, 0x9a, 0xa5, 0xc5, 0x8d, 0x51, 0xc8, 0xa9, 0xc9, 0x81, 0xc7, 0xa9, 0xc4, + 0x8f, 0xe2, 0xb1, 0xa2, 0x58, 0xc3, 0x9d, 0xc6, 0x94, 0xce, 0x85, 0xc7, 0xbe, 0xc4, + 0x89, 0x3c, 0xc2, 0xa3, 0xc7, 0xaf, 0xc3, 0x9b, 0xc7, 0xae, 0xc8, 0x89, 0xc9, 0x88, + 0xc5, 0xa8, 0xe2, 0xb1, 0xa9, 0xc5, 0xa3, 0x67, 0xc6, 0xa8, 0xe1, 0x9a, 0xb3, 0xc7, + 0x95, 0xc5, 0xa9, 0xc5, 0xa0, 0xc5, 0x84, 0xe1, 0x9a, 0xbf, 0xc7, 0xb4, 0xc9, 0x8a, + 0xc4, 0xbc, 0xc5, 0xbb, 0xc7, 0x99, 0xc3, 0x8e, 0xe1, 0x9a, 0xb0, 0xc5, 0x87, 0xe2, + 0xb1, 0xb0, 0xe1, 0x9a, 0xab, 0xc4, 0x8f, 0xc5, 0xb8, 0xc5, 0x90, 0xc5, 0xbc, 0xc3, + 0x80, 0xc3, 0xbc, 0xc4, 0x8a, 0xc5, 0xbb, 0x64, 0x3e, 0xc2, 0xa7, 0xc6, 0xb3, 0xe2, + 0xb1, 0xb6, 0xc8, 0xa4, 0x72, 0x71, 0xe1, 0x9b, 0x92, 0x3c, 0xc4, 0x99, 0xe2, 0xb1, + 0xb5, 0xc7, 0x81, 0xc4, 0xbd, 0xc8, 0xa6, 0xc4, 0xa8, 0xe1, 0x9a, 0xa1, 0xc3, 0x85, + 0xc6, 0x8f, 0xc2, 0xb9, 0xc7, 0x9b, 0xc7, 0xa7, 0xe1, 0x9a, 0xb3, 0xc8, 0x99, 0xc7, + 0xb4, 0xe1, 0x9b, 0xa6, 0xc3, 0x94, 0xe1, 0x9b, 0x91, 0xc6, 0xb7, 0x31, 0xc7, 0xb2, + 0xc3, 0x9e, 0xc7, 0xad, 0xc3, 0xa4, 0xc4, 0x97, 0xcd, 0xb5, 0xe1, 0x9a, 0xac, 0x63, + 0xc7, 0x96, 0xe2, 0xb1, 0xa3, 0xc8, 0x86, 0xc4, 0x97, 0x37, 0xc5, 0xa9, 0xc2, 0xa5, + 0xc4, 0xbf, 0xc7, 0x85, 0xc2, 0xa4, 0xe1, 0x9a, 0xa6, 0xc5, 0xba, 0xc6, 0xb3, 0xc5, + 0xb5, 0x36, 0x4e, 0x6e, 0xc5, 0x90, 0xc3, 0x80, 0xc7, 0xbd, 0xc6, 0x88, 0xc3, 0xb4, + 0xe2, 0xb1, 0xa6, 0xc8, 0xa4, 0xc8, 0xb0, 0xe1, 0x9a, 0xa0, 0xc3, 0x84, 0xc8, 0x8b, + 0xcd, 0xbe, 0xc5, 0x80, 0xc8, 0x9e, 0xc3, 0x99, 0xc4, 0x8a, 0xc3, 0x83, 0x3e, 0x28, + 0x4a, 0xe1, 0x9b, 0x85, 0xce, 0x87, 0xc5, 0x82, 0xc8, 0xbb, 0xc8, 0x8d, 0xc4, 0x88, + 0xc6, 0x9e, 0xc6, 0x98, 0xc5, 0xbf, 0x45, 0xc7, 0xb2, 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, + 0x9a, 0xc4, 0xb5, 0xc2, 0xae, 0xc9, 0x80, 0xc6, 0x88, 0xc3, 0x8c, 0xc8, 0xa5, 0xc2, + 0xb8, 0x35, 0xc7, 0xba, 0xc6, 0xac, 0x58, 0xc4, 0x97, 0x7e, 0xc7, 0x98, 0xc3, 0xbd, + 0xc2, 0xb9, 0xc8, 0x99, 0xe1, 0x9b, 0x8c, 0x5a, + ], + asset_id: [ + 0x35, 0x52, 0x83, 0x87, 0xd4, 0x4d, 0x74, 0x21, 0xa9, 0x78, 0xad, 0x56, 0xe5, 0x33, + 0xf3, 0x6e, 0x85, 0xec, 0xac, 0x44, 0x9f, 0x3b, 0x3f, 0x68, 0xe7, 0xff, 0x39, 0x7f, + 0xae, 0x24, 0x5a, 0x99, + ], + }, + TestVector { + key: [ + 0x6b, 0xfb, 0xe5, 0xc2, 0x42, 0x23, 0x94, 0xdc, 0x23, 0x76, 0xad, 0x10, 0x69, 0x3a, + 0xbc, 0x1b, 0xf4, 0xa1, 0x6e, 0x18, 0x56, 0x5e, 0xbe, 0x79, 0x84, 0x1b, 0x95, 0x13, + 0x45, 0x02, 0x53, 0x01, + ], + description: [ + 0xc7, 0x8e, 0x4f, 0xc2, 0xbb, 0x39, 0xc3, 0xa4, 0xc4, 0x94, 0xc5, 0xbb, 0xc5, 0xa6, + 0xc2, 0xab, 0xc2, 0xba, 0xc7, 0x9e, 0xc5, 0x88, 0xc8, 0x9c, 0x57, 0xc3, 0xbc, 0xe2, + 0xb1, 0xb7, 0xe1, 0x9a, 0xa9, 0x3a, 0xc3, 0x84, 0xc5, 0x9b, 0xc8, 0xb5, 0xc5, 0x80, + 0xc9, 0x81, 0xc7, 0xa7, 0xc5, 0x92, 0xc6, 0x9b, 0xc7, 0x86, 0xc8, 0xba, 0xc6, 0x88, + 0xc9, 0x85, 0xc3, 0xab, 0xc8, 0x94, 0xc8, 0x92, 0xc7, 0xa2, 0xc7, 0x82, 0xc4, 0x91, + 0x74, 0x62, 0xc5, 0x9b, 0x42, 0xc8, 0xbe, 0xc3, 0xa7, 0xc4, 0xb8, 0xc2, 0xaf, 0xc6, + 0x8d, 0x39, 0xc7, 0xb3, 0xc8, 0x97, 0xc8, 0x91, 0xc2, 0xbb, 0xc4, 0x87, 0xe1, 0x9b, + 0x8a, 0xc2, 0xa7, 0xc7, 0xb4, 0xc4, 0xbb, 0xc2, 0xb2, 0xc8, 0x9a, 0xe1, 0x9a, 0xa3, + 0xc3, 0x92, 0x36, 0xe1, 0x9b, 0x9d, 0xc7, 0x8f, 0xc8, 0x90, 0xc8, 0xb3, 0x36, 0x49, + 0xc4, 0x92, 0xe1, 0x9b, 0x84, 0xc6, 0x94, 0xc8, 0xba, 0xc9, 0x8c, 0xc7, 0x85, 0xc6, + 0x94, 0xc6, 0x87, 0xc6, 0xb6, 0xc4, 0xba, 0xc5, 0xb4, 0x51, 0xe1, 0x9a, 0xb7, 0xc3, + 0xbb, 0xcd, 0xbb, 0xc7, 0x89, 0xc3, 0xba, 0xc6, 0x93, 0xc2, 0xa7, 0xc3, 0xa1, 0xc3, + 0x8f, 0x7b, 0xc7, 0xa9, 0xc6, 0x92, 0x4b, 0xe1, 0x9b, 0xb0, 0xc8, 0xb3, 0xc5, 0x9a, + 0xe1, 0x9a, 0xb8, 0x71, 0xc9, 0x88, 0x4c, 0x25, 0xc7, 0x9b, 0xe1, 0x9b, 0x9a, 0xc2, + 0xb7, 0xc4, 0xb1, 0xe1, 0x9b, 0x97, 0x64, 0xe1, 0x9b, 0xa3, 0xc5, 0xb4, 0xe2, 0xb1, + 0xb1, 0xc9, 0x8d, 0x60, 0xe1, 0x9b, 0xa7, 0xe1, 0x9b, 0xa3, 0xc5, 0x84, 0xc4, 0x94, + 0xc7, 0xb8, 0xc8, 0x9c, 0x7c, 0xc3, 0xaa, 0x36, 0xc2, 0xa4, 0xc3, 0xa8, 0xe1, 0x9b, + 0x9f, 0xc3, 0x95, 0xc8, 0xa1, 0xc3, 0xac, 0xc4, 0x99, 0xc7, 0xa4, 0xc8, 0x93, 0xc8, + 0xb0, 0xc8, 0xa2, 0xc6, 0xb4, 0xc6, 0xa4, 0xe1, 0x9a, 0xaa, 0xc9, 0x85, 0xc2, 0xa5, + 0xcd, 0xbd, 0xc4, 0x97, 0xc4, 0xb2, 0xc4, 0xa7, 0xc4, 0x91, 0xc7, 0xbe, 0xe2, 0xb1, + 0xb4, 0xc9, 0x87, 0xc5, 0xab, 0xc7, 0x84, 0xc5, 0x9c, 0xe2, 0xb1, 0xaf, 0x55, 0xe2, + 0xb1, 0xaf, 0x23, 0xc4, 0x8e, 0xc5, 0xba, 0xc5, 0xaf, 0xc8, 0xaf, 0xe2, 0xb1, 0xa0, + 0x56, 0xc7, 0xb2, 0xc6, 0xb7, 0xc6, 0x90, 0xc6, 0x8d, 0x5e, 0xc6, 0xb5, 0xe1, 0x9a, + 0xb7, 0xc3, 0x89, 0xc8, 0x91, 0xc6, 0x9a, 0x74, 0x4f, 0xc4, 0xb1, 0xc7, 0xae, 0xc4, + 0xaa, 0xc3, 0xae, 0xc6, 0x9f, 0xc3, 0x99, 0xc8, 0x87, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, + 0xa4, 0xe1, 0x9b, 0xad, 0xc8, 0x93, 0xc6, 0x94, 0xc8, 0x82, 0xc7, 0xa8, 0xc6, 0xba, + 0xc6, 0x90, 0xc3, 0x88, 0xc6, 0xbb, 0xc9, 0x88, 0xc2, 0xa5, 0xc6, 0xad, 0xe1, 0x9a, + 0xb0, 0xc4, 0xbb, 0x47, 0x2e, 0xc6, 0x92, 0xc6, 0x8b, 0xe1, 0x9a, 0xaa, 0xc7, 0x80, + 0xe1, 0x9a, 0xa0, 0xc6, 0xab, 0xc3, 0xaf, 0xc8, 0xb9, 0xe1, 0x9b, 0x8f, 0xe1, 0x9a, + 0xb9, 0xc3, 0xa9, 0xc5, 0x8e, 0x68, 0xc8, 0xaa, 0xc4, 0xb6, 0xe2, 0xb1, 0xbd, 0xe1, + 0x9b, 0xad, 0xc7, 0xa6, 0xc5, 0x96, 0xc6, 0x82, 0xc7, 0x84, 0x3f, 0xc3, 0x97, 0xc4, + 0xbe, 0xc8, 0x91, 0xc6, 0xaa, 0x41, 0xc4, 0xa9, 0xc6, 0x80, 0xc2, 0xb7, 0xe2, 0xb1, + 0xb1, 0xc2, 0xa3, 0xc6, 0xa8, 0xe1, 0x9a, 0xa7, 0xc2, 0xaf, 0xc8, 0x83, 0xe1, 0x9b, + 0xac, 0x37, 0xc4, 0x8f, 0xc5, 0xb9, 0xe2, 0xb1, 0xb8, 0xc3, 0x8f, 0xc6, 0xb1, 0xc4, + 0xaa, 0xc5, 0x97, 0xe2, 0xb1, 0xab, 0xe1, 0x9b, 0x80, 0x58, 0xe1, 0x9b, 0x8b, 0xc8, + 0xb8, 0x2c, 0x21, 0x36, 0xc5, 0xb3, 0xc6, 0xaa, 0xc7, 0x8a, 0xc4, 0xa3, 0xc4, 0xb6, + 0xc5, 0xa4, 0xc5, 0x92, 0xe1, 0x9a, 0xbf, 0x5a, + ], + asset_id: [ + 0xf5, 0x4b, 0x0c, 0x9b, 0xad, 0x5a, 0x85, 0x26, 0x2b, 0x8a, 0x3b, 0xa4, 0x13, 0x6a, + 0x5b, 0x4c, 0xf3, 0x23, 0x85, 0xca, 0x49, 0x2f, 0x09, 0x4a, 0x42, 0xb2, 0xf6, 0xad, + 0x65, 0xc1, 0x07, 0x33, + ], + }, + TestVector { + key: [ + 0xab, 0x90, 0x15, 0x62, 0x52, 0x72, 0xe1, 0xe7, 0xba, 0x69, 0x0a, 0xe0, 0x09, 0xa9, + 0x92, 0xe4, 0x9d, 0xe1, 0x9f, 0x33, 0xfc, 0xde, 0xb9, 0xf1, 0x71, 0xab, 0x1a, 0xaf, + 0x28, 0x88, 0xc6, 0x0e, + ], + description: [ + 0xce, 0x88, 0xcd, 0xb5, 0xc6, 0x9f, 0xc6, 0xa5, 0xc8, 0x9e, 0xc7, 0xb2, 0xc7, 0xbc, + 0x7d, 0xc3, 0xb9, 0xc5, 0x84, 0xc5, 0x8b, 0xc4, 0x9a, 0xc3, 0xb4, 0xc7, 0x9a, 0xe2, + 0xb1, 0xa1, 0xc7, 0xb4, 0xc3, 0x8d, 0xe1, 0x9a, 0xab, 0xc7, 0x92, 0xe1, 0x9b, 0xaa, + 0xc5, 0x88, 0x26, 0xc5, 0xba, 0xc4, 0xad, 0xc5, 0xb5, 0xc3, 0xa3, 0xc5, 0xa8, 0x30, + 0xc5, 0xaf, 0xc8, 0x96, 0xe1, 0x9b, 0xa6, 0xe1, 0x9b, 0xa9, 0xc2, 0xb2, 0xc7, 0xaa, + 0xc4, 0x93, 0xc8, 0x8f, 0xc5, 0xac, 0xe1, 0x9a, 0xa7, 0xc4, 0x89, 0xc8, 0xbc, 0xc3, + 0xb9, 0xc6, 0xb6, 0xe1, 0x9b, 0x99, 0xc7, 0xae, 0xc4, 0xa6, 0xc7, 0xb9, 0x7c, 0xce, + 0x88, 0xc3, 0xbe, 0xc5, 0x9c, 0xc8, 0x82, 0xc6, 0x88, 0xc7, 0x9a, 0xc6, 0xbb, 0xcd, + 0xb6, 0xc7, 0x8a, 0xc5, 0x88, 0xe1, 0x9a, 0xa2, 0x52, 0xc4, 0xae, 0xc2, 0xa9, 0xc5, + 0x9b, 0xc4, 0x83, 0x74, 0xc8, 0x9e, 0xc3, 0xb4, 0xc3, 0x82, 0x30, 0xc3, 0xbd, 0xc3, + 0x87, 0xc8, 0xba, 0xc5, 0xb1, 0xc8, 0x85, 0x6b, 0xc4, 0xb7, 0xc5, 0x9d, 0x57, 0xc7, + 0x90, 0xc6, 0xb9, 0x45, 0xc4, 0x9f, 0xc7, 0x8d, 0xc5, 0xa8, 0xc5, 0x8f, 0xc3, 0xaf, + 0xc3, 0xb3, 0xc3, 0xb3, 0xc3, 0xb1, 0xc2, 0xac, 0xc5, 0xb7, 0xe2, 0xb1, 0xa2, 0xc8, + 0xbb, 0xc7, 0xa7, 0xe1, 0x9a, 0xb9, 0xc5, 0xb2, 0xc5, 0xbd, 0xc6, 0xaf, 0xc3, 0xac, + 0xe1, 0x9b, 0xb0, 0xc7, 0x9d, 0xc4, 0x8a, 0xc6, 0xa9, 0xc5, 0xaa, 0xc3, 0x8e, 0xc2, + 0xa7, 0xc7, 0xaa, 0xc4, 0x90, 0x66, 0xe2, 0xb1, 0xb7, 0xe1, 0x9a, 0xbc, 0xc6, 0xbc, + 0xc5, 0x91, 0xc8, 0xbb, 0x44, 0xce, 0x8c, 0xc8, 0x84, 0xc8, 0x92, 0xe1, 0x9a, 0xbb, + 0xe1, 0x9a, 0xa2, 0xc6, 0x88, 0xc7, 0xb7, 0xc6, 0xa1, 0xe1, 0x9b, 0x90, 0xc4, 0xa2, + 0xc4, 0x92, 0x36, 0xc6, 0xb8, 0xc4, 0xaa, 0xc2, 0xb3, 0xe1, 0x9b, 0x81, 0xc9, 0x87, + 0xc7, 0xbc, 0x3b, 0xc8, 0xbc, 0xc8, 0x8e, 0xc3, 0xaa, 0xc9, 0x8a, 0xc6, 0x94, 0xe2, + 0xb1, 0xb4, 0xc5, 0x9a, 0xe1, 0x9b, 0x92, 0xc8, 0xa2, 0xc4, 0xb6, 0xc4, 0x91, 0xcd, + 0xbe, 0xc8, 0xac, 0xc4, 0xb5, 0xcd, 0xbc, 0x3d, 0xe1, 0x9b, 0xa7, 0xc2, 0xab, 0xc2, + 0xa8, 0xc6, 0xb0, 0xc4, 0x84, 0xc3, 0xb5, 0xe1, 0x9a, 0xb8, 0xc6, 0x96, 0xc3, 0x99, + 0x65, 0x56, 0xc3, 0xb9, 0xc8, 0xb0, 0xc4, 0xb2, 0xcd, 0xb6, 0x71, 0xc3, 0xb8, 0xc7, + 0xb6, 0xc8, 0x8b, 0xc3, 0xa3, 0xe1, 0x9b, 0x8f, 0x6c, 0xc4, 0xad, 0xc3, 0xa2, 0xc2, + 0xb2, 0xe1, 0x9a, 0xb6, 0xe1, 0x9b, 0x98, 0xe1, 0x9b, 0xae, 0xc8, 0xa2, 0xc2, 0xb6, + 0xc8, 0xb3, 0xc6, 0xbe, 0xe1, 0x9b, 0x85, 0xe1, 0x9b, 0x90, 0xe1, 0x9b, 0x89, 0xc3, + 0xbc, 0xe2, 0xb1, 0xa2, 0xc5, 0xb3, 0xc3, 0x84, 0xc7, 0x95, 0xc5, 0x9d, 0xc4, 0xba, + 0xe2, 0xb1, 0xb6, 0xc2, 0xa8, 0x78, 0xc8, 0xad, 0xc3, 0xae, 0xc6, 0x88, 0xc3, 0x9e, + 0xc3, 0xa9, 0xc3, 0x9d, 0xe2, 0xb1, 0xaf, 0xc5, 0x8c, 0xe2, 0xb1, 0xa1, 0xc5, 0xbc, + 0xe1, 0x9a, 0xab, 0xc8, 0xbf, 0xc7, 0x8b, 0xc6, 0xb2, 0x21, 0xc3, 0x93, 0xc5, 0xa5, + 0x6d, 0xcd, 0xb2, 0xe1, 0x9b, 0x88, 0x5e, 0xe1, 0x9a, 0xb6, 0xc5, 0xb1, 0xc7, 0x87, + 0xc8, 0x9a, 0xc7, 0xa6, 0xc2, 0xaf, 0xe1, 0x9b, 0xa6, 0xc4, 0x86, 0xc2, 0xb1, 0x29, + 0xe1, 0x9a, 0xb9, 0xc7, 0x90, 0xc9, 0x8a, 0xc4, 0xab, 0xe1, 0x9b, 0x8e, 0xc7, 0x90, + 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0xa5, 0xc6, 0xb8, 0xc4, 0xa6, 0xe1, 0x9b, 0x8a, 0xc5, + 0xb2, 0xc6, 0xa8, 0xc6, 0x8e, 0xc2, 0xbe, 0xc8, 0xbd, 0xc8, 0xa5, 0xc5, 0xa5, 0xc6, + 0x90, 0x3f, 0xc7, 0xa8, 0xc4, 0xaf, 0xc2, 0xaa, + ], + asset_id: [ + 0xe2, 0xc6, 0x6a, 0x5e, 0x81, 0xaf, 0x85, 0x65, 0x05, 0x7c, 0x42, 0xab, 0x5a, 0x5b, + 0x5b, 0xb8, 0xc3, 0xca, 0x18, 0x13, 0xbe, 0x45, 0x76, 0xd8, 0xea, 0xe8, 0xb2, 0x50, + 0xfd, 0xe9, 0xfd, 0x95, + ], + }, + TestVector { + key: [ + 0x06, 0xd4, 0x75, 0x14, 0x97, 0x0d, 0x02, 0xd3, 0xf8, 0x43, 0xfb, 0x9b, 0x96, 0x51, + 0x08, 0x75, 0xa7, 0xa6, 0xc0, 0x15, 0x68, 0x1d, 0x06, 0xe0, 0xb1, 0x5b, 0x8a, 0x92, + 0x1f, 0xbd, 0x81, 0x30, + ], + description: [ + 0xe1, 0x9a, 0xa5, 0xe1, 0x9a, 0xb5, 0xc7, 0xb1, 0x2b, 0x72, 0xc6, 0x83, 0xc3, 0x82, + 0xe1, 0x9b, 0x8e, 0x34, 0xe1, 0x9b, 0x98, 0x3c, 0xc2, 0xa5, 0xc8, 0xbe, 0x2c, 0xc3, + 0x82, 0xc3, 0xa4, 0xe2, 0xb1, 0xa3, 0xc5, 0xab, 0xc3, 0xb4, 0xc7, 0xb8, 0xc2, 0xa2, + 0xc6, 0x86, 0xc6, 0xad, 0xc3, 0x9a, 0xc5, 0x93, 0xc7, 0xa3, 0xc2, 0xb7, 0xc6, 0x9a, + 0x5f, 0x55, 0xc9, 0x8c, 0xc9, 0x89, 0x58, 0xc6, 0x95, 0xe1, 0x9a, 0xba, 0xc7, 0x80, + 0xc2, 0xb4, 0xe1, 0x9b, 0x9b, 0xc4, 0x90, 0xe1, 0x9b, 0x8b, 0xe1, 0x9a, 0xae, 0xc8, + 0x92, 0xe1, 0x9b, 0xa8, 0xe2, 0xb1, 0xb2, 0xcd, 0xbd, 0xc3, 0x98, 0xe1, 0x9a, 0xba, + 0xe1, 0x9a, 0xb0, 0x48, 0xc6, 0xa4, 0x2f, 0xc5, 0x9d, 0xe1, 0x9b, 0x86, 0xe1, 0x9a, + 0xb5, 0x7c, 0xc5, 0xa5, 0xe1, 0x9a, 0xba, 0xc4, 0x86, 0xc8, 0xa6, 0xc6, 0xa6, 0xc6, + 0x84, 0xc3, 0xbb, 0xc5, 0xbe, 0x6e, 0xe1, 0x9b, 0xa6, 0xc5, 0x95, 0xe1, 0x9b, 0xaa, + 0xc7, 0xb7, 0xe2, 0xb1, 0xbd, 0xce, 0x8c, 0xc3, 0xa6, 0xc6, 0x9e, 0xc4, 0xb5, 0xe1, + 0x9a, 0xa4, 0xc3, 0xa8, 0xc7, 0x9c, 0xc4, 0x82, 0xc2, 0xa6, 0x31, 0xc3, 0xa6, 0xe2, + 0xb1, 0xae, 0xc7, 0xbb, 0x26, 0xc7, 0xa0, 0xc5, 0x9d, 0xc5, 0xb9, 0xe1, 0x9a, 0xb4, + 0xe1, 0x9b, 0xad, 0xc7, 0x88, 0x30, 0x42, 0xc6, 0x9f, 0xc3, 0x9b, 0x25, 0xc4, 0x9c, + 0xce, 0x87, 0xc5, 0x9c, 0xc5, 0x8c, 0xe1, 0x9b, 0x81, 0xce, 0x89, 0xc4, 0x9a, 0xc5, + 0xa7, 0xe1, 0x9a, 0xa9, 0xc3, 0x93, 0xc7, 0x9b, 0xc3, 0x8d, 0xc3, 0xbe, 0xc3, 0x93, + 0xc8, 0xbc, 0xc8, 0xb3, 0xc5, 0xaf, 0xc7, 0xb3, 0xe1, 0x9a, 0xa7, 0xc4, 0x80, 0xc4, + 0x80, 0xcd, 0xb2, 0xc7, 0x82, 0xc4, 0x83, 0xc7, 0x88, 0xc6, 0x84, 0xe1, 0x9b, 0x90, + 0xc3, 0xa4, 0xc3, 0xbc, 0xc5, 0xad, 0xc6, 0x8b, 0xc2, 0xac, 0xc4, 0xa1, 0xc3, 0xae, + 0xce, 0x86, 0xe1, 0x9b, 0x94, 0xc5, 0x9e, 0xc6, 0x92, 0xe1, 0x9b, 0xac, 0xc3, 0x8d, + 0xc5, 0xb9, 0xc3, 0x82, 0xc8, 0x81, 0xe2, 0xb1, 0xbb, 0xc8, 0xa0, 0xc2, 0xbd, 0xc5, + 0xa2, 0xc6, 0x86, 0xc3, 0xb7, 0xe1, 0x9a, 0xad, 0xc5, 0xbc, 0x2c, 0x51, 0xe1, 0x9a, + 0xab, 0xe1, 0x9b, 0x99, 0x77, 0xc3, 0x9c, 0xc6, 0x9c, 0x31, 0x60, 0xc5, 0x8e, 0xc3, + 0xb5, 0xc3, 0x85, 0xe1, 0x9b, 0xad, 0xc9, 0x8f, 0xc4, 0x8b, 0xc5, 0x93, 0xc2, 0xa2, + 0xc6, 0x8a, 0xe1, 0x9a, 0xa3, 0x4a, 0xc3, 0x9e, 0x30, 0xc8, 0xae, 0xc7, 0xbc, 0xcd, + 0xb3, 0xc7, 0x94, 0xe1, 0x9b, 0x93, 0xc3, 0x93, 0xc3, 0xaa, 0xc4, 0xad, 0xc8, 0x91, + 0xc5, 0xac, 0xe1, 0x9b, 0xa6, 0x26, 0x74, 0xc6, 0xbd, 0xe1, 0x9b, 0xa3, 0xc9, 0x8e, + 0xc8, 0x94, 0xc5, 0xad, 0xc6, 0xac, 0xc6, 0xb7, 0xc7, 0xa5, 0xc3, 0xa5, 0xc8, 0xb4, + 0xc6, 0x95, 0xc8, 0x93, 0xc8, 0xbc, 0xc8, 0xb9, 0xe1, 0x9b, 0x86, 0xc3, 0xb2, 0xc2, + 0xb5, 0xc5, 0x92, 0xe1, 0x9b, 0xa2, 0xe2, 0xb1, 0xb2, 0xc8, 0x80, 0xc4, 0x90, 0xe1, + 0x9a, 0xb9, 0xe2, 0xb1, 0xa7, 0xc5, 0xab, 0xc5, 0xa6, 0xc6, 0xaa, 0xc5, 0x98, 0xc4, + 0xb0, 0xc7, 0xb0, 0xe1, 0x9a, 0xbe, 0xe1, 0x9a, 0xaa, 0xc5, 0xb7, 0xc4, 0x96, 0xc7, + 0xa1, 0xc6, 0xbc, 0xe1, 0x9a, 0xb5, 0xc3, 0x87, 0xc8, 0xa5, 0x73, 0xc3, 0x84, 0xc4, + 0xa6, 0xc6, 0x9d, 0xc5, 0xa9, 0xc5, 0xaa, 0xc7, 0xa6, 0xc6, 0x9e, 0xc8, 0xbc, 0xe1, + 0x9a, 0xbf, 0xc6, 0xa3, 0xc3, 0x99, 0xc5, 0x97, 0xe2, 0xb1, 0xa0, 0xc4, 0x9e, 0x74, + 0xc4, 0x90, 0xc6, 0xa0, 0xe1, 0x9b, 0xaa, 0xc7, 0xaf, 0xc5, 0x8c, 0xc4, 0x91, 0xc7, + 0x93, 0xe1, 0x9b, 0xa3, 0xc5, 0xbd, 0xc8, 0xa3, + ], + asset_id: [ + 0x9e, 0xa8, 0x07, 0x5c, 0x02, 0xdf, 0xe4, 0x64, 0x18, 0x07, 0xe0, 0x7d, 0x2d, 0x8a, + 0x84, 0x6c, 0x1f, 0xfb, 0xaf, 0x66, 0x86, 0x85, 0x74, 0x5c, 0x04, 0x5a, 0xf9, 0xe3, + 0x6c, 0xbe, 0x91, 0xb9, + ], + }, + TestVector { + key: [ + 0x3d, 0x8b, 0xb6, 0x41, 0x5a, 0x53, 0x0b, 0xb2, 0x0f, 0x0d, 0x70, 0x2e, 0x8c, 0xb8, + 0x0b, 0xc1, 0xd5, 0xae, 0x41, 0x66, 0x5c, 0x53, 0x14, 0x4c, 0xfb, 0x60, 0x6e, 0x58, + 0x6a, 0xbc, 0x03, 0x33, + ], + description: [ + 0xc3, 0x92, 0xcd, 0xb4, 0xc2, 0xaa, 0xc2, 0xb7, 0x78, 0xc5, 0x8d, 0xc5, 0x8f, 0xc5, + 0x84, 0xe1, 0x9b, 0x9c, 0xc4, 0x8f, 0xc3, 0x9a, 0xc6, 0x8f, 0x42, 0xc4, 0x94, 0x50, + 0x3a, 0xc5, 0x9f, 0x60, 0xc8, 0xa5, 0x21, 0xc3, 0xa2, 0x3a, 0xe1, 0x9a, 0xb1, 0xc5, + 0x88, 0xc5, 0x81, 0xc6, 0x9d, 0xc7, 0x95, 0xc4, 0xa1, 0x55, 0x3f, 0x48, 0xc9, 0x8a, + 0xc4, 0x8d, 0xc3, 0xbf, 0xe1, 0x9b, 0x8e, 0xc6, 0x8e, 0xc4, 0xbb, 0xe1, 0x9b, 0x9f, + 0xe1, 0x9a, 0xb9, 0xc4, 0xb1, 0xe1, 0x9a, 0xb3, 0xe1, 0x9b, 0x9b, 0xc6, 0x84, 0xe1, + 0x9a, 0xac, 0x2b, 0x51, 0xc5, 0x99, 0xe1, 0x9a, 0xb3, 0xc3, 0xb8, 0xc6, 0x99, 0xc8, + 0x9b, 0xe1, 0x9a, 0xbc, 0xc8, 0xa4, 0xe1, 0x9b, 0x84, 0x6e, 0xc4, 0x83, 0x5e, 0xe1, + 0x9a, 0xa8, 0xc6, 0xad, 0xc5, 0x82, 0xc8, 0xa4, 0xc4, 0x8a, 0xe2, 0xb1, 0xab, 0xc6, + 0x89, 0xe1, 0x9b, 0x8c, 0xc8, 0x8d, 0xe1, 0x9a, 0xb2, 0xe2, 0xb1, 0xb1, 0xc5, 0x87, + 0xe2, 0xb1, 0xad, 0xc4, 0xab, 0x50, 0xc2, 0xb9, 0xc7, 0xae, 0xc5, 0x99, 0xc3, 0x8a, + 0xc3, 0xbc, 0xc4, 0xa9, 0xe1, 0x9b, 0xa6, 0xc8, 0x92, 0xc4, 0xa7, 0xc2, 0xbd, 0xc2, + 0xbb, 0xc8, 0xb2, 0xcd, 0xbd, 0xe1, 0x9b, 0xa0, 0xc2, 0xbe, 0x63, 0xc5, 0xae, 0x69, + 0xc4, 0x90, 0x2e, 0xc4, 0xb0, 0x53, 0xc3, 0x83, 0xc5, 0xa7, 0xc3, 0xb1, 0xc2, 0xb1, + 0xc6, 0x8a, 0xc8, 0x85, 0xc6, 0xb0, 0x46, 0xc2, 0xb6, 0xc9, 0x88, 0xc4, 0xa5, 0xc7, + 0xb9, 0xc5, 0xb5, 0xc8, 0x80, 0xc4, 0xa8, 0xc8, 0x87, 0xc5, 0x8d, 0xc4, 0x97, 0xc8, + 0x86, 0xc2, 0xa8, 0xc4, 0xa9, 0xc6, 0x99, 0xc3, 0x98, 0xc4, 0x97, 0xc8, 0xb1, 0xce, + 0x84, 0xe1, 0x9a, 0xb0, 0xc6, 0x86, 0xc4, 0x97, 0xc6, 0xab, 0xe2, 0xb1, 0xac, 0xc8, + 0xa5, 0xc8, 0xa9, 0xc5, 0x80, 0x65, 0x51, 0xc8, 0x87, 0xe1, 0x9b, 0x95, 0xc4, 0x88, + 0xe1, 0x9b, 0xb0, 0xc6, 0x9d, 0xc5, 0xa8, 0xc8, 0x8b, 0xc7, 0xb4, 0xc4, 0xb9, 0xc7, + 0xb2, 0xc4, 0xb4, 0xe1, 0x9b, 0x9c, 0xc2, 0xbb, 0xe2, 0xb1, 0xa9, 0xc4, 0xa7, 0xc7, + 0x86, 0xc8, 0xac, 0xe2, 0xb1, 0xb1, 0xe1, 0x9b, 0x81, 0x71, 0xc4, 0x8d, 0xc7, 0x97, + 0x33, 0xc3, 0x83, 0xc9, 0x8a, 0xc6, 0xb3, 0xc4, 0xb0, 0xc3, 0xb1, 0xe2, 0xb1, 0xac, + 0xe1, 0x9b, 0x91, 0xc6, 0x96, 0xc2, 0xb5, 0xc7, 0xac, 0x29, 0x6d, 0x36, 0xc6, 0x91, + 0xc4, 0xa8, 0xc4, 0xb1, 0xc7, 0x8d, 0xce, 0x8c, 0xc3, 0x88, 0x6b, 0xc7, 0xbd, 0xc7, + 0x98, 0xc8, 0x95, 0xc7, 0xa2, 0xe2, 0xb1, 0xa0, 0xc7, 0xa0, 0x46, 0x31, 0x2e, 0xc6, + 0x81, 0xc8, 0x96, 0xc8, 0x8f, 0xe1, 0x9b, 0x98, 0xc4, 0xb3, 0xc8, 0xb8, 0xe1, 0x9a, + 0xb2, 0xc8, 0x9e, 0xc5, 0x83, 0xc7, 0x87, 0xc6, 0xa1, 0xc2, 0xae, 0x43, 0xc8, 0xb3, + 0xc4, 0x89, 0xc3, 0x9e, 0xe1, 0x9b, 0x96, 0xc5, 0x84, 0x33, 0xc9, 0x87, 0x69, 0xce, + 0x88, 0xc8, 0xac, 0xc5, 0x87, 0xc5, 0x87, 0xe1, 0x9b, 0x8b, 0xc4, 0x89, 0xc5, 0xb0, + 0xc4, 0x9f, 0xe1, 0x9b, 0x97, 0xc7, 0xa8, 0xc8, 0xb3, 0xc7, 0x83, 0xc4, 0x91, 0xe1, + 0x9a, 0xba, 0xc7, 0x82, 0xc7, 0xb0, 0xc4, 0xbd, 0xc5, 0xab, 0xe1, 0x9b, 0xac, 0xe2, + 0xb1, 0xbe, 0xc4, 0x89, 0xc3, 0x8b, 0xe2, 0xb1, 0xae, 0xcd, 0xbe, 0xc4, 0x9b, 0xc4, + 0xab, 0xc6, 0xbc, 0xe1, 0x9b, 0xac, 0xc4, 0x84, 0xc5, 0x9f, 0xc7, 0xac, 0xc3, 0xba, + 0xc6, 0x83, 0xc3, 0x9b, 0xc6, 0xa6, 0xc6, 0xac, 0xc7, 0xb5, 0xc6, 0x8a, 0xc4, 0xbf, + 0xe2, 0xb1, 0xaa, 0xc3, 0x96, 0x42, 0xc4, 0x95, 0xc3, 0xa2, 0xc6, 0xa5, 0x5b, 0x2e, + 0xc3, 0xaf, 0xc3, 0x93, 0xc4, 0x9d, 0xc8, 0xa4, + ], + asset_id: [ + 0x02, 0xce, 0x39, 0x82, 0x1e, 0x86, 0x41, 0xcd, 0x79, 0x5c, 0x1e, 0x41, 0xf7, 0x48, + 0x3c, 0x59, 0x88, 0x81, 0xb5, 0x0f, 0x88, 0xe7, 0x36, 0xcb, 0x4f, 0xb0, 0x00, 0xbc, + 0xf0, 0x28, 0x62, 0x2b, + ], + }, + TestVector { + key: [ + 0x95, 0xa6, 0xa5, 0x7f, 0x8e, 0x85, 0x43, 0x72, 0xf9, 0xce, 0x7d, 0xb1, 0x34, 0xfd, + 0x9e, 0x87, 0x43, 0xbd, 0x39, 0x17, 0xe6, 0x50, 0x52, 0x93, 0x4c, 0xbd, 0xef, 0xa7, + 0x67, 0xb7, 0xc7, 0x18, + ], + description: [ + 0xc7, 0x84, 0xc3, 0xb8, 0xc7, 0xba, 0xc6, 0xbc, 0xc6, 0xa3, 0x28, 0xc5, 0xb4, 0xc7, + 0x8c, 0xc2, 0xba, 0xe1, 0x9b, 0xac, 0x3d, 0xc5, 0xb3, 0xc5, 0xbf, 0xc4, 0xb5, 0xce, + 0x8a, 0xc5, 0xab, 0xc7, 0xbe, 0xc7, 0xa0, 0xc4, 0x95, 0xe1, 0x9b, 0xa8, 0xc3, 0xab, + 0xc7, 0x99, 0xe1, 0x9a, 0xae, 0xcd, 0xb6, 0xe2, 0xb1, 0xb1, 0xc5, 0x8a, 0xe1, 0x9b, + 0xab, 0xc5, 0xaa, 0xc7, 0xb8, 0xc6, 0xb2, 0x48, 0xe1, 0x9b, 0x94, 0xc8, 0xb4, 0xc7, + 0x9e, 0xc8, 0x9b, 0x4f, 0xc7, 0xab, 0xc5, 0xa8, 0xc7, 0x9c, 0xc8, 0x9f, 0xc4, 0x8a, + 0xc8, 0x98, 0xe1, 0x9a, 0xa6, 0xc4, 0xb7, 0xc3, 0xb8, 0xe1, 0x9b, 0x97, 0xc7, 0xb6, + 0x57, 0xc4, 0xa0, 0xe1, 0x9b, 0x9f, 0xc5, 0x9a, 0xc2, 0xa7, 0x2c, 0xe1, 0x9a, 0xa4, + 0xc6, 0x84, 0xcd, 0xba, 0xc7, 0x90, 0xc4, 0xae, 0xc4, 0xaf, 0xc2, 0xb1, 0xce, 0x84, + 0xe1, 0x9a, 0xa0, 0xe1, 0x9b, 0xa9, 0xc4, 0xa0, 0xce, 0x86, 0xc3, 0x83, 0xc7, 0xab, + 0xcd, 0xb4, 0xc5, 0x83, 0xc8, 0xbd, 0xc8, 0x98, 0xce, 0x89, 0x73, 0xe1, 0x9a, 0xa6, + 0xc5, 0xa1, 0xc2, 0xa7, 0xc3, 0x81, 0xc9, 0x83, 0xc5, 0xbc, 0xc5, 0x9b, 0xc4, 0xbe, + 0x5f, 0xc6, 0xb8, 0xe1, 0x9b, 0x86, 0x74, 0xc3, 0xb4, 0x40, 0xc8, 0xbc, 0xc8, 0x93, + 0xc8, 0x9c, 0xc2, 0xa4, 0xe1, 0x9a, 0xb4, 0xc3, 0x98, 0xc5, 0x96, 0xe1, 0x9b, 0xa0, + 0x7c, 0xe2, 0xb1, 0xa0, 0xc4, 0xb2, 0xc2, 0xb7, 0xce, 0x85, 0xc3, 0x8c, 0xc2, 0xa2, + 0xc8, 0x9a, 0x4f, 0xc7, 0xae, 0xc4, 0xb5, 0xc7, 0x95, 0xc3, 0x8e, 0xc8, 0xa3, 0xe1, + 0x9a, 0xa3, 0xc3, 0xa7, 0xc7, 0xb7, 0xc6, 0xaa, 0xc6, 0xb6, 0xc8, 0xbb, 0xc2, 0xa9, + 0xe1, 0x9b, 0x8b, 0xc7, 0x9a, 0xc9, 0x84, 0xc3, 0xa2, 0x71, 0xc5, 0x83, 0xc3, 0x83, + 0xc8, 0x86, 0xcd, 0xb2, 0xc4, 0xa7, 0xe1, 0x9b, 0x80, 0x58, 0xc5, 0x96, 0xe2, 0xb1, + 0xb2, 0xe2, 0xb1, 0xbd, 0xc7, 0xbc, 0x4b, 0xcd, 0xbc, 0xc8, 0x88, 0xc4, 0x81, 0xc7, + 0xb8, 0xc4, 0x8f, 0xc8, 0x8d, 0x26, 0xc7, 0x92, 0xc3, 0xa0, 0xc5, 0x8c, 0xc5, 0xbd, + 0xc6, 0xb3, 0xc2, 0xa4, 0x67, 0xc8, 0x93, 0xc8, 0xac, 0xc9, 0x89, 0xc4, 0xbd, 0xc8, + 0x82, 0xe2, 0xb1, 0xa9, 0xe1, 0x9b, 0xa2, 0x79, 0x54, 0xe1, 0x9b, 0x94, 0xc7, 0x96, + 0xc8, 0xae, 0xc7, 0xba, 0xc8, 0xa3, 0xc6, 0xa3, 0xcd, 0xba, 0xc8, 0xa7, 0xc4, 0xa8, + 0x3b, 0xc7, 0xb9, 0xc6, 0x83, 0xc8, 0x98, 0xc2, 0xb0, 0xe1, 0x9a, 0xae, 0xc8, 0x8c, + 0xc3, 0xa3, 0xe1, 0x9a, 0xbd, 0x45, 0xc8, 0xb6, 0xc9, 0x80, 0x28, 0xe1, 0x9b, 0x81, + 0x2b, 0x6d, 0xc8, 0xb9, 0xc7, 0x80, 0xe2, 0xb1, 0xad, 0xc8, 0x8d, 0x6c, 0x7b, 0xc6, + 0x91, 0xc3, 0x93, 0xc8, 0xa9, 0xc7, 0xaf, 0xc5, 0x95, 0xe1, 0x9b, 0xa0, 0xc6, 0xbe, + 0x21, 0xc4, 0xac, 0xc4, 0xa8, 0xe1, 0x9a, 0xbe, 0xc9, 0x8e, 0xc3, 0x88, 0xc4, 0x9e, + 0xc4, 0xbe, 0xe1, 0x9b, 0x90, 0xc3, 0x99, 0xc7, 0x93, 0xc6, 0xa8, 0xe1, 0x9b, 0xa9, + 0xe1, 0x9b, 0xa5, 0xc7, 0xa4, 0xc6, 0x81, 0xe1, 0x9b, 0x9a, 0xc3, 0xa0, 0xc5, 0xab, + 0xc4, 0x86, 0xc8, 0xa4, 0x53, 0xce, 0x8c, 0xc9, 0x81, 0xc3, 0xb7, 0xc7, 0xaa, 0xc8, + 0x8a, 0xc3, 0xa9, 0x41, 0xe1, 0x9b, 0xaa, 0xcd, 0xb7, 0xc3, 0xac, 0xc3, 0xbf, 0xc8, + 0x8d, 0xc7, 0xa7, 0xc7, 0xa3, 0xe1, 0x9b, 0xa9, 0x5a, 0xc4, 0xb1, 0x68, 0xe2, 0xb1, + 0xbf, 0x2a, 0x5b, 0xc8, 0xb6, 0xc5, 0xa0, 0x39, 0xc4, 0x8b, 0xc8, 0xae, 0x6c, 0xe2, + 0xb1, 0xb5, 0xe1, 0x9b, 0x9b, 0xc5, 0x8c, 0xc5, 0x91, 0x68, 0xc6, 0xaf, 0xc9, 0x84, + 0x44, 0xc7, 0x93, 0xc2, 0xb5, 0xc8, 0x90, 0x67, + ], + asset_id: [ + 0x7a, 0x8e, 0xea, 0x55, 0xfb, 0xde, 0x77, 0x4d, 0x8a, 0x7a, 0x5c, 0x01, 0xfa, 0x8e, + 0xbc, 0x8c, 0x57, 0x5f, 0xf9, 0x33, 0xd9, 0xd1, 0x51, 0x9b, 0x62, 0xf3, 0x18, 0xf4, + 0x8c, 0xa2, 0xab, 0x94, + ], + }, + TestVector { + key: [ + 0xa3, 0x6d, 0xf3, 0x6a, 0xc7, 0xa2, 0xe2, 0xba, 0xab, 0xfd, 0x1e, 0x8d, 0xbf, 0x39, + 0x3b, 0xd8, 0x25, 0x32, 0xec, 0x3d, 0x52, 0x3b, 0xbe, 0x85, 0x7f, 0x71, 0x58, 0x0c, + 0xcd, 0x22, 0xdf, 0x08, + ], + description: [ + 0xc6, 0x81, 0xc4, 0x90, 0xe1, 0x9a, 0xa0, 0xe1, 0x9b, 0x8c, 0x40, 0xc8, 0x8d, 0xc7, + 0xaf, 0xcd, 0xb2, 0xc5, 0xae, 0xc7, 0xb1, 0xce, 0x84, 0xc2, 0xb6, 0xc7, 0x99, 0xe1, + 0x9a, 0xb4, 0xe1, 0x9b, 0xaf, 0xc6, 0x93, 0xc9, 0x83, 0x37, 0xe2, 0xb1, 0xb1, 0xc4, + 0x98, 0xe1, 0x9b, 0xa7, 0xc8, 0x8f, 0xc3, 0x83, 0xc3, 0x82, 0xc4, 0x98, 0xc7, 0x9c, + 0xc2, 0xae, 0xc8, 0x9a, 0xcd, 0xb5, 0xc3, 0xac, 0xc6, 0x9c, 0xc8, 0xab, 0xc6, 0xbd, + 0x71, 0xc4, 0xaf, 0xe1, 0x9a, 0xa0, 0xe1, 0x9a, 0xb1, 0x23, 0xc5, 0xa8, 0xc4, 0xb9, + 0x45, 0xe1, 0x9b, 0xa8, 0xc6, 0xb0, 0xc4, 0xa0, 0xc8, 0xa7, 0xe1, 0x9b, 0x9b, 0xc6, + 0xa7, 0x79, 0xc7, 0xa8, 0xc7, 0xa1, 0xc7, 0xbd, 0xc3, 0xa1, 0xe2, 0xb1, 0xa2, 0xc3, + 0x82, 0xc6, 0xa7, 0xc4, 0x9d, 0xc7, 0xbb, 0x64, 0xc2, 0xb0, 0xc4, 0x91, 0xe1, 0x9a, + 0xbe, 0xc7, 0xaf, 0xe2, 0xb1, 0xaa, 0xc8, 0xa3, 0xe2, 0xb1, 0xbe, 0x3f, 0xc8, 0xa7, + 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0x88, 0xc8, 0xa0, 0xc8, 0x96, 0x28, 0xc6, 0xb7, 0xc7, + 0xa2, 0xc6, 0x99, 0x66, 0xc8, 0x8c, 0xc3, 0x93, 0xc5, 0x8b, 0xc8, 0xa2, 0xc5, 0x91, + 0xe2, 0xb1, 0xa6, 0xc3, 0xbd, 0xc3, 0xa4, 0xc6, 0x86, 0xe1, 0x9b, 0xa4, 0xc3, 0xbe, + 0xc4, 0xbf, 0xc9, 0x88, 0xc6, 0x97, 0xcd, 0xb5, 0xc4, 0xb1, 0xc7, 0x92, 0xc3, 0x86, + 0xc5, 0x80, 0xc5, 0x9c, 0xc5, 0x92, 0xc3, 0x80, 0xe1, 0x9a, 0xbd, 0xc6, 0x84, 0x46, + 0xc6, 0xb6, 0xc6, 0x87, 0xc4, 0x95, 0xc3, 0xbe, 0xc3, 0xbc, 0xc2, 0xaf, 0xc2, 0xa9, + 0xe1, 0x9a, 0xa1, 0xc3, 0xa4, 0xe1, 0x9b, 0xaf, 0xc5, 0x8f, 0xe1, 0x9b, 0x98, 0xc5, + 0x91, 0x55, 0xc3, 0x99, 0xc8, 0xbf, 0xc7, 0xb4, 0x63, 0xc5, 0xa0, 0xc8, 0xa1, 0xe2, + 0xb1, 0xb7, 0xc3, 0xaf, 0xc5, 0x8c, 0xc8, 0xab, 0xc8, 0x8b, 0x3c, 0xc3, 0x8d, 0xc6, + 0x80, 0xc8, 0xa1, 0xc7, 0xb9, 0xc3, 0xbf, 0xc2, 0xa4, 0x4f, 0xc8, 0x82, 0xe2, 0xb1, + 0xa8, 0xc2, 0xbd, 0x78, 0xe1, 0x9b, 0xac, 0xc5, 0x90, 0xc3, 0x94, 0xc3, 0xb8, 0xc7, + 0xb7, 0xc3, 0x84, 0xe2, 0xb1, 0xaf, 0xc6, 0x88, 0xc7, 0x83, 0xc9, 0x8d, 0xc5, 0x9f, + 0x78, 0xc3, 0xbb, 0xe2, 0xb1, 0xa7, 0xe2, 0xb1, 0xbc, 0xc5, 0x8d, 0xc6, 0xbd, 0xe2, + 0xb1, 0xa5, 0xc4, 0x94, 0xc7, 0x91, 0xc8, 0x97, 0x63, 0xc3, 0x99, 0xc2, 0xb6, 0xc7, + 0x99, 0xe1, 0x9a, 0xa2, 0xc7, 0xa0, 0xc8, 0xa6, 0xcd, 0xbc, 0xc6, 0x86, 0xe2, 0xb1, + 0xb5, 0x42, 0xc2, 0xa1, 0xc8, 0x97, 0xc8, 0xa6, 0xc5, 0x98, 0xc4, 0xba, 0xc4, 0x88, + 0xc3, 0x80, 0x59, 0xc8, 0xa0, 0xc6, 0xa7, 0xc4, 0xb5, 0xc8, 0x8e, 0xc3, 0xa1, 0x7c, + 0xc6, 0xae, 0xc2, 0xaa, 0x7c, 0xc8, 0xaa, 0xc2, 0xb8, 0xc4, 0xa9, 0xc7, 0xa8, 0xc3, + 0x98, 0xc9, 0x82, 0xc8, 0x87, 0xc3, 0x98, 0xc5, 0x9d, 0xc9, 0x8b, 0xc4, 0x87, 0xce, + 0x86, 0xc8, 0x96, 0xc2, 0xa5, 0x66, 0xe2, 0xb1, 0xbb, 0xc4, 0x9f, 0xc7, 0xaa, 0xc8, + 0x93, 0xc4, 0xbe, 0xe2, 0xb1, 0xac, 0x5c, 0xc3, 0x8f, 0x44, 0xcd, 0xb4, 0x53, 0x31, + 0xc8, 0xaf, 0xc2, 0xbd, 0xc4, 0x85, 0xc4, 0xa1, 0xc5, 0xaf, 0xc8, 0xa2, 0xc8, 0x95, + 0xc6, 0x95, 0xe1, 0x9b, 0xac, 0xc4, 0x95, 0x2b, 0x4e, 0x78, 0xc5, 0xbf, 0xc7, 0x89, + 0xc7, 0x9c, 0xc3, 0x9b, 0x72, 0xcd, 0xbc, 0xc8, 0x93, 0xc6, 0x93, 0xc3, 0xa5, 0x66, + 0xe1, 0x9a, 0xbf, 0xc3, 0xa6, 0xc5, 0x84, 0xc4, 0xbd, 0xe2, 0xb1, 0xaf, 0xc4, 0x92, + 0x4e, 0xc5, 0x8c, 0xe1, 0x9b, 0xae, 0xc3, 0xac, 0xce, 0x88, 0xc7, 0xb5, 0xc3, 0xa8, + 0xe1, 0x9a, 0xab, 0xc7, 0x95, 0xe2, 0xb1, 0xbd, + ], + asset_id: [ + 0xbe, 0x14, 0xb4, 0xa7, 0x43, 0x0a, 0x90, 0xa9, 0x50, 0xd5, 0x8d, 0xd7, 0xbb, 0x10, + 0x72, 0x0e, 0xb9, 0x50, 0xb2, 0x4e, 0x6f, 0x27, 0xce, 0x85, 0x4a, 0x80, 0xf6, 0x4a, + 0x19, 0x24, 0xcd, 0x28, + ], + }, + TestVector { + key: [ + 0x68, 0x89, 0x11, 0x8f, 0xa9, 0xe7, 0xda, 0xf2, 0x76, 0xfd, 0x62, 0xcb, 0x66, 0x5a, + 0xbf, 0x50, 0x72, 0x20, 0x15, 0xc2, 0xa0, 0x8b, 0x13, 0xf7, 0x7d, 0x20, 0x24, 0x75, + 0x96, 0x26, 0xc5, 0x03, + ], + description: [ + 0xc2, 0xaa, 0xc2, 0xb5, 0xc2, 0xa5, 0xc7, 0xbc, 0xc3, 0x9a, 0xc9, 0x83, 0xc3, 0x8f, + 0x25, 0xc5, 0x83, 0xc3, 0x86, 0xc4, 0xa4, 0xc3, 0xac, 0xc7, 0xbf, 0xc3, 0x93, 0xc6, + 0x95, 0x42, 0x3b, 0xe1, 0x9b, 0x96, 0xc7, 0x85, 0xc3, 0x84, 0x23, 0xc3, 0xb9, 0x53, + 0xc6, 0xb0, 0xc2, 0xac, 0xc4, 0x94, 0xe1, 0x9a, 0xba, 0xc9, 0x8c, 0xc8, 0x8e, 0xce, + 0x87, 0xc7, 0x8f, 0xc8, 0xbb, 0x79, 0xc3, 0xb4, 0x36, 0xc5, 0x9c, 0xc4, 0x9b, 0xe1, + 0x9a, 0xb4, 0x51, 0xc5, 0xb3, 0x2b, 0xc7, 0x93, 0xe1, 0x9b, 0xa7, 0xc5, 0x93, 0xe1, + 0x9b, 0x9b, 0xc6, 0x81, 0xc4, 0xa8, 0xc8, 0x9a, 0xe1, 0x9b, 0x90, 0xc8, 0x9b, 0xc3, + 0xa5, 0xc4, 0xbd, 0xc7, 0x8b, 0xe1, 0x9b, 0xad, 0xc5, 0xa0, 0xe1, 0x9a, 0xb5, 0x5e, + 0x69, 0x78, 0xc5, 0xbc, 0xc7, 0x8e, 0xc4, 0x8b, 0xc4, 0xa9, 0xc6, 0x91, 0xc5, 0xa8, + 0xc5, 0xbe, 0xc4, 0xb0, 0xc5, 0x96, 0xe1, 0x9a, 0xac, 0xe2, 0xb1, 0xbf, 0xc8, 0xae, + 0xc3, 0x97, 0xc6, 0x8a, 0xc4, 0x9b, 0xc8, 0x9b, 0xc7, 0x89, 0xe1, 0x9a, 0xbd, 0xe1, + 0x9b, 0x89, 0xc9, 0x86, 0xc7, 0x91, 0xe1, 0x9b, 0x96, 0xe1, 0x9a, 0xa4, 0xc8, 0xad, + 0xcd, 0xb0, 0xce, 0x87, 0xc5, 0xb7, 0x5d, 0xe1, 0x9b, 0x9b, 0xc9, 0x80, 0xc3, 0x9b, + 0xc3, 0x85, 0xc3, 0x9a, 0xc6, 0xb7, 0xe1, 0x9b, 0x89, 0xc2, 0xb6, 0xe1, 0x9a, 0xac, + 0xe1, 0x9b, 0x8f, 0xc2, 0xb3, 0xcd, 0xbd, 0xc3, 0x85, 0xc6, 0x90, 0x32, 0xc7, 0xab, + 0xe2, 0xb1, 0xac, 0xc8, 0x8a, 0xc4, 0x86, 0xc5, 0x98, 0xc5, 0x90, 0xc8, 0x9c, 0xc3, + 0x8e, 0xc8, 0x96, 0xc5, 0xa8, 0xc3, 0xa4, 0x7c, 0xc6, 0xb9, 0xc5, 0xa8, 0xc3, 0xa5, + 0x36, 0xc2, 0xa3, 0x7a, 0xc5, 0xb1, 0xc7, 0xb0, 0xc5, 0xb6, 0x61, 0xc5, 0x80, 0xc9, + 0x84, 0xc6, 0xb0, 0xc5, 0x8f, 0xe1, 0x9b, 0x9a, 0xc6, 0xb0, 0xcd, 0xb7, 0xe1, 0x9b, + 0x8a, 0xc6, 0xba, 0xe1, 0x9b, 0x9e, 0x3e, 0x57, 0xc8, 0x9c, 0xc6, 0x9b, 0x5e, 0xc8, + 0xa7, 0xc8, 0x98, 0xc5, 0xbc, 0xc3, 0x9d, 0xc3, 0xa4, 0xe1, 0x9a, 0xbd, 0xe1, 0x9b, + 0x81, 0xc6, 0xbf, 0x6c, 0xc4, 0xbd, 0xc4, 0xbe, 0xe1, 0x9b, 0x8a, 0x75, 0x6c, 0xc5, + 0x97, 0xc8, 0xbc, 0xc5, 0x9e, 0xc5, 0x94, 0xe1, 0x9a, 0xa5, 0xc9, 0x81, 0xc6, 0x88, + 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xbe, 0x49, 0xc5, 0xa6, 0xc4, 0xb7, 0xc9, 0x88, 0xe1, + 0x9a, 0xa6, 0xc5, 0x91, 0xc5, 0xa5, 0xce, 0x8c, 0x56, 0xc3, 0x99, 0xc4, 0x9e, 0xc2, + 0xb4, 0xc3, 0x8b, 0x53, 0x2c, 0xc7, 0xb8, 0x3a, 0xc7, 0x81, 0xc6, 0xb3, 0xe1, 0x9b, + 0xaf, 0xc3, 0xaa, 0xc7, 0xa7, 0xc3, 0xbe, 0xe2, 0xb1, 0xb7, 0xe1, 0x9a, 0xb4, 0x5c, + 0x7c, 0xc2, 0xbf, 0xe1, 0x9a, 0xb3, 0xc8, 0xb6, 0xc6, 0x8e, 0xe1, 0x9b, 0xae, 0xc5, + 0xaf, 0xe1, 0x9b, 0x90, 0xc6, 0xab, 0xc5, 0xb2, 0xe1, 0x9b, 0x81, 0x49, 0xe1, 0x9b, + 0xa4, 0xc3, 0x80, 0x75, 0xc4, 0x9c, 0xc8, 0x96, 0xe1, 0x9a, 0xae, 0x5d, 0xc4, 0xba, + 0xe1, 0x9b, 0x86, 0x2b, 0xe2, 0xb1, 0xb0, 0xc4, 0x9d, 0xe2, 0xb1, 0xb9, 0xc6, 0xb5, + 0xc3, 0xb2, 0xc6, 0x87, 0xc5, 0x9c, 0xc5, 0x94, 0xc6, 0x92, 0xc3, 0x86, 0xc5, 0x82, + 0xc6, 0xb7, 0x47, 0xc6, 0x8b, 0xcd, 0xbd, 0xcd, 0xbd, 0xc7, 0xad, 0xc7, 0x97, 0xc2, + 0xa1, 0xc8, 0xa8, 0xe1, 0x9a, 0xbd, 0xc7, 0xad, 0xc4, 0xac, 0xc8, 0x99, 0x6c, 0x36, + 0x5f, 0xc5, 0x89, 0xc4, 0x87, 0xc4, 0x80, 0xc2, 0xbe, 0xe2, 0xb1, 0xbd, 0xc4, 0x8f, + 0xc4, 0xb1, 0xc3, 0x83, 0xc5, 0xbd, 0xc6, 0xa5, 0xc5, 0xb9, 0xc5, 0xa5, 0xc6, 0xba, + 0x6e, 0xc8, 0xaa, 0x6d, 0xc4, 0x80, 0x7c, 0x5a, + ], + asset_id: [ + 0xac, 0xa7, 0x66, 0x43, 0xac, 0xdd, 0x83, 0xe3, 0x8e, 0xe5, 0xcf, 0xe0, 0xe7, 0xd2, + 0x99, 0xd6, 0x35, 0x69, 0x0a, 0x82, 0xba, 0x96, 0x51, 0x47, 0xe2, 0xa4, 0x48, 0x24, + 0x9b, 0xee, 0xb2, 0x88, + ], + }, + TestVector { + key: [ + 0x7a, 0xb9, 0xe5, 0xa6, 0x04, 0x28, 0x8a, 0x55, 0x0b, 0x9e, 0x08, 0x7a, 0x00, 0x4b, + 0xb8, 0x8b, 0xe4, 0xb2, 0xb4, 0x8d, 0xb3, 0x3f, 0xb0, 0x80, 0x97, 0xf8, 0xbc, 0x64, + 0x60, 0x3e, 0xf8, 0x1f, + ], + description: [ + 0xc7, 0xad, 0x3b, 0xc8, 0x91, 0xc6, 0x96, 0xe1, 0x9a, 0xbd, 0xe1, 0x9a, 0xa6, 0xce, + 0x87, 0xc3, 0x83, 0xc3, 0x84, 0xe1, 0x9b, 0x84, 0xc9, 0x8a, 0xc4, 0x97, 0xc9, 0x87, + 0xe2, 0xb1, 0xba, 0xc6, 0x93, 0xc6, 0x98, 0xe2, 0xb1, 0xb7, 0xc6, 0x8e, 0xc8, 0x8f, + 0xc9, 0x84, 0xc2, 0xbe, 0x55, 0xc8, 0xb0, 0xc7, 0x82, 0xc2, 0xb2, 0xc6, 0x88, 0xcd, + 0xb3, 0xc6, 0xb2, 0x2e, 0x2e, 0xc3, 0x87, 0xc9, 0x80, 0xc7, 0x9c, 0xc8, 0x9f, 0xc5, + 0xb0, 0xc8, 0x9e, 0xc4, 0xbb, 0xc7, 0x81, 0x74, 0x6c, 0xc6, 0x8c, 0xc6, 0x8f, 0xe1, + 0x9a, 0xb4, 0xc8, 0x94, 0xc2, 0xac, 0xc4, 0x8f, 0xc5, 0xb6, 0xc8, 0xb5, 0xc3, 0xb7, + 0xcd, 0xb6, 0xc2, 0xb1, 0xc5, 0xb1, 0xc4, 0xa5, 0x40, 0x68, 0x58, 0x2b, 0xc5, 0xb7, + 0xc4, 0x91, 0xc6, 0xa1, 0xc7, 0xa7, 0x79, 0xe1, 0x9b, 0xa6, 0xe2, 0xb1, 0xac, 0xc6, + 0x99, 0x51, 0xc7, 0xaf, 0xcd, 0xb4, 0xe1, 0x9b, 0x8e, 0xe1, 0x9b, 0xad, 0xc8, 0x96, + 0xe1, 0x9b, 0xad, 0xc3, 0xa1, 0xc6, 0x95, 0xc5, 0x98, 0xc6, 0x95, 0xc2, 0xaf, 0xe2, + 0xb1, 0xac, 0xc4, 0xbe, 0xc5, 0xac, 0xc8, 0x85, 0xc5, 0xa9, 0xc4, 0x93, 0xc5, 0x9a, + 0x6c, 0xc3, 0xae, 0xe1, 0x9a, 0xba, 0xc6, 0x85, 0xc6, 0x92, 0xc5, 0xa7, 0xc4, 0xa5, + 0xc5, 0x80, 0xc6, 0xaa, 0xe2, 0xb1, 0xa5, 0xc4, 0xaa, 0xc8, 0x83, 0xc5, 0xad, 0xc9, + 0x88, 0x7c, 0xc7, 0xa6, 0xe1, 0x9a, 0xb9, 0xc3, 0xa4, 0xc9, 0x84, 0xc5, 0xa3, 0xc3, + 0xb6, 0xc5, 0x8c, 0xc8, 0xab, 0xc8, 0xa7, 0xc8, 0xb7, 0xc5, 0x9c, 0xc6, 0xb5, 0xc8, + 0x8d, 0xc2, 0xb7, 0xc5, 0x93, 0xc5, 0xb7, 0xc7, 0xac, 0xcd, 0xbe, 0xc3, 0xa2, 0xc5, + 0xa5, 0xc4, 0x8c, 0xe2, 0xb1, 0xbf, 0x66, 0xc5, 0xbf, 0xc6, 0x83, 0xc6, 0x99, 0xc2, + 0xa2, 0xe1, 0x9b, 0xad, 0x7c, 0xc4, 0x9e, 0xc6, 0xa2, 0xc3, 0xb8, 0xc6, 0xb6, 0xc6, + 0xaf, 0x72, 0xc6, 0xb1, 0xc6, 0x98, 0xc6, 0xb8, 0x49, 0xe1, 0x9a, 0xa6, 0x59, 0xe1, + 0x9b, 0xa1, 0xc8, 0xb6, 0xc4, 0xa6, 0xc6, 0xbe, 0xc8, 0xa1, 0xe2, 0xb1, 0xa5, 0xe1, + 0x9b, 0xa3, 0xc5, 0x8d, 0xc2, 0xb5, 0xc6, 0xa8, 0xc7, 0xbd, 0xc8, 0x8a, 0xe1, 0x9b, + 0xb0, 0xc5, 0xaf, 0x56, 0xc8, 0x8b, 0x34, 0xc4, 0x94, 0xc4, 0xbc, 0x67, 0xc6, 0xb5, + 0xc2, 0xb0, 0x63, 0xe1, 0x9b, 0x99, 0xc4, 0xa8, 0xc6, 0x9c, 0xe1, 0x9a, 0xbc, 0xe1, + 0x9b, 0x8a, 0xc6, 0x99, 0x4b, 0xc6, 0xb2, 0xe1, 0x9b, 0xa2, 0xc8, 0x9f, 0xc5, 0x88, + 0xc5, 0xb6, 0xc3, 0xb8, 0x6d, 0xe2, 0xb1, 0xa2, 0xc7, 0xb4, 0xcd, 0xb3, 0xc2, 0xa3, + 0xc7, 0xa1, 0xc4, 0x83, 0xc7, 0xb1, 0xc8, 0x98, 0xc8, 0x84, 0x6b, 0xc7, 0x84, 0xc6, + 0xb6, 0xe1, 0x9a, 0xb8, 0xc5, 0x93, 0xc8, 0x90, 0x79, 0xc8, 0xa3, 0xe1, 0x9a, 0xb0, + 0xe1, 0x9b, 0xad, 0xc8, 0xb0, 0xc4, 0x9e, 0xe1, 0x9b, 0x9a, 0xc7, 0x97, 0x32, 0xc6, + 0xb2, 0xc9, 0x83, 0xe1, 0x9b, 0x96, 0xc9, 0x8f, 0xc3, 0x8c, 0xe2, 0xb1, 0xad, 0xc4, + 0xbd, 0xc3, 0xbe, 0xe1, 0x9b, 0x8b, 0xc8, 0x9d, 0xc6, 0x95, 0xc8, 0x8f, 0xc8, 0x9e, + 0xc8, 0x83, 0x74, 0xc7, 0xbe, 0xe1, 0x9b, 0x8a, 0x3c, 0xc5, 0x93, 0x63, 0xc7, 0x98, + 0x31, 0xc4, 0x82, 0x56, 0xe2, 0xb1, 0xa3, 0x53, 0xe1, 0x9b, 0xa4, 0xc7, 0x94, 0xc7, + 0x9e, 0x2e, 0xcd, 0xbe, 0xc7, 0x9c, 0xc4, 0x90, 0xe2, 0xb1, 0xbe, 0xe2, 0xb1, 0xba, + 0xc7, 0x82, 0xc5, 0xb2, 0xe1, 0x9a, 0xa4, 0xc6, 0xb2, 0xcd, 0xb2, 0xc3, 0xa5, 0xe1, + 0x9b, 0xab, 0xc3, 0xa9, 0xc7, 0xa3, 0xc3, 0x8a, 0xc2, 0xa3, 0xc9, 0x82, 0x7b, 0xc6, + 0xb3, 0x4b, 0xc4, 0xb6, 0xc4, 0x85, 0xc7, 0x8c, + ], + asset_id: [ + 0x03, 0x74, 0x69, 0x16, 0xa8, 0xa6, 0xb8, 0xff, 0xa0, 0x4d, 0x71, 0x95, 0xbc, 0x06, + 0x74, 0x96, 0xa6, 0xce, 0xce, 0x35, 0x6a, 0x2a, 0x14, 0x6d, 0x69, 0x52, 0x9a, 0xea, + 0xac, 0x10, 0x1a, 0xb8, + ], + }, + TestVector { + key: [ + 0xa2, 0x4a, 0x5b, 0x4b, 0x0c, 0x62, 0xe0, 0xfb, 0x6f, 0x01, 0xdb, 0x56, 0x7c, 0x33, + 0x3e, 0x12, 0x82, 0xe3, 0x70, 0xa6, 0x6f, 0x16, 0x8a, 0xe7, 0xf7, 0x7a, 0x3f, 0x16, + 0xaf, 0x40, 0x8d, 0x12, + ], + description: [ + 0xe1, 0x9b, 0xad, 0xe1, 0x9a, 0xaf, 0x39, 0xc7, 0x92, 0xc4, 0x87, 0xc8, 0x8b, 0xe2, + 0xb1, 0xa9, 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, 0x97, 0xc6, 0x89, 0xc4, 0xb1, 0xc8, 0xa1, + 0xc7, 0xad, 0xc7, 0x8a, 0xe1, 0x9a, 0xb4, 0xe1, 0x9a, 0xa4, 0xc5, 0x99, 0xe1, 0x9b, + 0xa5, 0xcd, 0xb7, 0xc6, 0xa5, 0xc3, 0xb6, 0xe1, 0x9b, 0x9a, 0xe1, 0x9b, 0xab, 0xc5, + 0x9a, 0x4d, 0xe1, 0x9b, 0x81, 0xe1, 0x9b, 0x8a, 0xc2, 0xbe, 0xc5, 0x88, 0xc6, 0xbd, + 0xe2, 0xb1, 0xb8, 0xe2, 0xb1, 0xbb, 0xc5, 0x8d, 0xc2, 0xbc, 0xc6, 0x81, 0xc5, 0x9c, + 0xe2, 0xb1, 0xb5, 0xc8, 0x95, 0x6d, 0xc3, 0x9b, 0xc2, 0xb3, 0x36, 0xc4, 0x88, 0xc6, + 0xbf, 0xc7, 0xb6, 0xe1, 0x9b, 0xad, 0xc7, 0x8e, 0xe1, 0x9b, 0xa9, 0x69, 0xc3, 0xa5, + 0xe2, 0xb1, 0xb3, 0xc7, 0xbb, 0xc6, 0x9f, 0xc3, 0xa7, 0xc3, 0xbe, 0xce, 0x86, 0xc6, + 0xbd, 0xc6, 0x95, 0xc7, 0xa2, 0xc7, 0xbf, 0xc7, 0xad, 0xc4, 0x93, 0xc6, 0xb6, 0xc3, + 0x8b, 0xe2, 0xb1, 0xbb, 0xc3, 0x96, 0xc8, 0xaa, 0xc7, 0xa9, 0xc8, 0x8e, 0xc2, 0xb9, + 0xc8, 0x99, 0xc3, 0x93, 0xe1, 0x9b, 0x9c, 0xc2, 0xac, 0xc7, 0xbc, 0xc3, 0xb6, 0xc2, + 0xa7, 0xc3, 0xa9, 0xcd, 0xbc, 0xe2, 0xb1, 0xbf, 0xe1, 0x9a, 0xb1, 0xc2, 0xb8, 0xc3, + 0xb9, 0xe1, 0x9b, 0x9e, 0xc7, 0x88, 0xc5, 0x9e, 0xc6, 0xb9, 0xc4, 0x9e, 0xc6, 0x8e, + 0x3e, 0xc8, 0x93, 0x74, 0x37, 0xe2, 0xb1, 0xb2, 0x58, 0xcd, 0xbe, 0xc6, 0x9a, 0x5c, + 0xc8, 0x94, 0xe1, 0x9a, 0xb6, 0xc8, 0x90, 0xc5, 0x95, 0xe2, 0xb1, 0xa6, 0x23, 0xc5, + 0xa2, 0xc3, 0x9c, 0xe2, 0xb1, 0xb4, 0xc4, 0x94, 0xc3, 0x97, 0xc6, 0x9f, 0xc3, 0x92, + 0xcd, 0xbd, 0xc4, 0xbe, 0xc5, 0xba, 0xc6, 0xb0, 0x77, 0xc7, 0xba, 0xc5, 0xb0, 0xc3, + 0x9b, 0xc5, 0xbf, 0xc7, 0xa3, 0xc3, 0xad, 0xc6, 0xbf, 0xc3, 0xbe, 0xc5, 0xab, 0xc7, + 0xb9, 0xe1, 0x9b, 0xa9, 0xc5, 0xb3, 0xe1, 0x9a, 0xac, 0xe1, 0x9a, 0xa4, 0xc5, 0x9e, + 0xc2, 0xa7, 0xcd, 0xbe, 0x4e, 0xe2, 0xb1, 0xb5, 0xc4, 0xb8, 0xe1, 0x9a, 0xbd, 0xe1, + 0x9b, 0x83, 0xe2, 0xb1, 0xa2, 0xc6, 0xa4, 0xc6, 0xa6, 0xc7, 0xbc, 0xe1, 0x9b, 0x82, + 0x44, 0xe1, 0x9a, 0xa4, 0xc3, 0xb3, 0xc5, 0xb1, 0xc3, 0xa5, 0xc7, 0xaa, 0x5b, 0xc6, + 0x9c, 0xc7, 0x92, 0x2f, 0xc6, 0x86, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb5, 0x44, 0xc7, + 0xb1, 0xc4, 0xac, 0xc8, 0xae, 0xe1, 0x9a, 0xa1, 0xc8, 0xaa, 0xc5, 0x9a, 0xc3, 0xac, + 0xc8, 0xac, 0xe1, 0x9b, 0xa3, 0xc5, 0xab, 0xc7, 0x98, 0xe1, 0x9b, 0x93, 0x6e, 0xc7, + 0x8a, 0xc4, 0x9f, 0xe1, 0x9b, 0x9b, 0xc7, 0x86, 0xe2, 0xb1, 0xb8, 0xc6, 0xaa, 0xc8, + 0xa1, 0xc2, 0xbf, 0xc3, 0x97, 0xcd, 0xbd, 0xc8, 0x99, 0xc4, 0x98, 0xc3, 0x88, 0x3f, + 0x4a, 0xc7, 0x99, 0xc4, 0x8a, 0xc7, 0x9a, 0xc5, 0xa9, 0xc7, 0xb5, 0xc7, 0x9b, 0xc5, + 0xb1, 0xc5, 0xbf, 0xc7, 0x81, 0xc8, 0xb2, 0xc9, 0x89, 0xc5, 0xa4, 0xc8, 0x82, 0xc6, + 0x91, 0xe1, 0x9a, 0xa8, 0xc7, 0xac, 0x6c, 0x64, 0xc4, 0x86, 0xc8, 0x8b, 0xc5, 0x99, + 0xc6, 0x9a, 0xc3, 0x83, 0xc6, 0x8e, 0xc3, 0x9a, 0xc7, 0xa9, 0xc3, 0xb3, 0xe1, 0x9b, + 0x8a, 0xc7, 0x94, 0xc7, 0xbb, 0xe1, 0x9a, 0xbb, 0xc6, 0xb4, 0xc6, 0xaf, 0xe1, 0x9b, + 0xa8, 0xc2, 0xa1, 0x24, 0xe1, 0x9b, 0xab, 0xc8, 0xbb, 0xc3, 0xba, 0xe1, 0x9a, 0xb9, + 0xc8, 0x92, 0xc8, 0xb2, 0xc5, 0xa6, 0xc5, 0xb3, 0xc4, 0x8d, 0xc5, 0xad, 0xc5, 0xa0, + 0xc3, 0x9c, 0xe1, 0x9b, 0xae, 0xc7, 0xb2, 0xc4, 0x9b, 0xc6, 0xbb, 0xc5, 0xb0, 0xc7, + 0xbb, 0xc7, 0xba, 0xc5, 0xb7, 0xc8, 0xa4, 0x5a, + ], + asset_id: [ + 0x0f, 0x1a, 0x21, 0x20, 0x6c, 0x80, 0xdb, 0x63, 0x73, 0xde, 0x95, 0x66, 0xe9, 0x06, + 0xf1, 0x87, 0xe5, 0xea, 0x72, 0x84, 0x10, 0x86, 0x13, 0x86, 0x31, 0x77, 0x51, 0x0c, + 0xee, 0x14, 0xd7, 0xb1, + ], + }, + TestVector { + key: [ + 0xbe, 0xb4, 0x9a, 0x61, 0x01, 0x0b, 0x35, 0x51, 0xbc, 0x5c, 0xb2, 0xdb, 0xbc, 0xa6, + 0x0b, 0x20, 0xb5, 0x31, 0x6e, 0x42, 0x21, 0xdc, 0x9c, 0xed, 0xb8, 0xc3, 0xc4, 0x62, + 0xc1, 0xca, 0xcd, 0x02, + ], + description: [ + 0xc3, 0xa0, 0x26, 0xc8, 0xb0, 0xc3, 0x82, 0xc3, 0xb6, 0xc4, 0xa3, 0xc6, 0x85, 0xc3, + 0x8f, 0xc9, 0x8a, 0xc4, 0x99, 0xc8, 0xb8, 0xc6, 0xaa, 0xc4, 0xa4, 0xe1, 0x9b, 0x99, + 0xc6, 0x98, 0xe1, 0x9b, 0x99, 0xc6, 0x8a, 0x3c, 0xe1, 0x9b, 0x89, 0xc6, 0xa8, 0xc6, + 0xb4, 0x33, 0xe1, 0x9b, 0xa1, 0xc6, 0xb7, 0xcd, 0xb2, 0xc6, 0xbc, 0xc7, 0x86, 0xc6, + 0x9d, 0xc5, 0xac, 0xc2, 0xb7, 0xc6, 0x8a, 0xc7, 0xa5, 0xc3, 0x95, 0x35, 0xc3, 0x86, + 0x44, 0xc3, 0x89, 0xc5, 0xa1, 0xe1, 0x9b, 0xaf, 0xc6, 0xae, 0x41, 0xc4, 0x99, 0xc3, + 0xa8, 0x45, 0xe2, 0xb1, 0xb5, 0xc3, 0x83, 0x5f, 0x37, 0xc7, 0xbf, 0xe1, 0x9a, 0xa8, + 0xc7, 0x8f, 0xc5, 0x92, 0x7e, 0xc3, 0xad, 0xe2, 0xb1, 0xb9, 0xe1, 0x9a, 0xa9, 0xc6, + 0xa3, 0xc7, 0xbf, 0xcd, 0xb1, 0xc7, 0xb6, 0xe1, 0x9b, 0xa4, 0xe1, 0x9a, 0xb1, 0xe1, + 0x9a, 0xb8, 0x41, 0xc7, 0x90, 0xc5, 0x8e, 0xe1, 0x9b, 0xad, 0xc3, 0xb8, 0xc6, 0xae, + 0xc5, 0x9d, 0xc3, 0xb3, 0xc3, 0xbb, 0xc5, 0x97, 0xc7, 0x8f, 0xc8, 0xa4, 0xe1, 0x9b, + 0xb0, 0x63, 0x39, 0xe2, 0xb1, 0xa0, 0xc3, 0xbc, 0xc3, 0x97, 0xc8, 0x88, 0x5a, 0x30, + 0xc6, 0xb0, 0xe1, 0x9b, 0xa6, 0xc6, 0xbb, 0xc6, 0x86, 0xc6, 0xb8, 0xc6, 0x88, 0xe1, + 0x9a, 0xbc, 0xc5, 0xbb, 0xc5, 0xaa, 0xcd, 0xb6, 0xc6, 0xa0, 0xe2, 0xb1, 0xb7, 0xc3, + 0x8b, 0xc7, 0xa5, 0xc7, 0x9c, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x82, 0xc6, 0xb4, 0xc8, + 0xa1, 0xc3, 0xb2, 0x77, 0xc3, 0xaf, 0xc2, 0xb9, 0xc6, 0x8d, 0xe2, 0xb1, 0xbf, 0xc4, + 0xb8, 0x33, 0xc3, 0xa4, 0xc8, 0xa5, 0xc7, 0xb5, 0xc7, 0x94, 0xc2, 0xaa, 0xc2, 0xbd, + 0x40, 0xe1, 0x9a, 0xba, 0xc8, 0x80, 0xc6, 0x9c, 0xc4, 0x96, 0x32, 0xe1, 0x9a, 0xb8, + 0xc3, 0xa2, 0xc7, 0xb1, 0xc4, 0x94, 0xc7, 0x88, 0xcd, 0xb4, 0xc4, 0x8d, 0x49, 0xc4, + 0xbd, 0xe1, 0x9a, 0xb4, 0xc7, 0x88, 0xe1, 0x9b, 0xac, 0xc4, 0x9a, 0xcd, 0xbe, 0xc5, + 0x96, 0xc8, 0x92, 0xe1, 0x9b, 0xaf, 0xc9, 0x89, 0xc5, 0xb5, 0x2f, 0x41, 0xcd, 0xbe, + 0xc4, 0x9d, 0xc3, 0x86, 0xc2, 0xbb, 0x25, 0xc3, 0xaa, 0xc3, 0x86, 0xc4, 0x97, 0xc8, + 0x9f, 0xcd, 0xb5, 0xc6, 0xb9, 0xc4, 0x83, 0x35, 0xe1, 0x9b, 0x9b, 0xc4, 0xa0, 0xc4, + 0x89, 0xc8, 0xa8, 0xc4, 0x84, 0xc4, 0xba, 0xc3, 0x80, 0xc4, 0xb4, 0x53, 0xc7, 0x81, + 0xc9, 0x85, 0xc6, 0xbc, 0xcd, 0xbb, 0xc6, 0xa8, 0xc5, 0x92, 0xce, 0x87, 0xe1, 0x9b, + 0x88, 0x34, 0xc8, 0xbc, 0xc6, 0xae, 0xc3, 0xbe, 0xc4, 0x9d, 0xc8, 0x81, 0xc4, 0xa4, + 0x60, 0xc7, 0x93, 0xce, 0x86, 0xc7, 0x94, 0xc7, 0x84, 0x78, 0xc8, 0x82, 0xcd, 0xb0, + 0xc6, 0xa4, 0xc6, 0x8a, 0x65, 0xc7, 0xba, 0xc6, 0xb7, 0xc4, 0xae, 0xc9, 0x82, 0xc5, + 0xaf, 0xc4, 0x84, 0xc8, 0x96, 0xc7, 0xb6, 0xc2, 0xb1, 0xc5, 0xaf, 0xc3, 0xac, 0xe1, + 0x9b, 0xa9, 0xc4, 0x87, 0x43, 0xc8, 0x84, 0xc9, 0x82, 0xc7, 0xb3, 0x6a, 0xc5, 0x89, + 0xc3, 0xb4, 0xc8, 0xa0, 0xe1, 0x9b, 0x8d, 0xc7, 0xbd, 0xc2, 0xb3, 0xc3, 0x80, 0xc6, + 0xa6, 0xc4, 0x84, 0x69, 0xc7, 0xa7, 0xc5, 0xb5, 0xc7, 0x95, 0x21, 0xc4, 0xad, 0xe1, + 0x9b, 0xaf, 0xe1, 0x9a, 0xa8, 0xc5, 0x85, 0xc7, 0xa8, 0xc9, 0x8c, 0xc5, 0x96, 0xe2, + 0xb1, 0xa1, 0x33, 0xe1, 0x9b, 0xa2, 0xc3, 0xbc, 0x2e, 0x63, 0x2b, 0xc3, 0x9f, 0x7c, + 0xc6, 0xa4, 0xc6, 0xbf, 0xc8, 0x8d, 0xc5, 0xa8, 0xc5, 0xb5, 0xc5, 0x96, 0xe1, 0x9b, + 0x98, 0xc8, 0xb3, 0xc6, 0x90, 0xc3, 0xa6, 0x3d, 0xc9, 0x8e, 0xc8, 0xb4, 0xc7, 0xbf, + 0xc2, 0xa6, 0xe1, 0x9a, 0xad, 0x41, 0x5e, 0x40, + ], + asset_id: [ + 0x8e, 0x95, 0x38, 0x48, 0xf3, 0xbd, 0xa6, 0xcd, 0xc0, 0x11, 0xdf, 0xd6, 0xe0, 0x1e, + 0x9f, 0x45, 0x71, 0xf9, 0x2c, 0xa1, 0x29, 0x4f, 0xd2, 0x69, 0xff, 0x98, 0x2b, 0xd2, + 0x1a, 0xac, 0xa0, 0xbc, + ], + }, + TestVector { + key: [ + 0xb7, 0x0b, 0xb2, 0x77, 0xc0, 0x83, 0xf2, 0x95, 0x37, 0x6a, 0x02, 0xb3, 0x98, 0x76, + 0xae, 0x35, 0xfb, 0x26, 0x62, 0x3d, 0x9d, 0x6a, 0x55, 0xa5, 0x63, 0xf7, 0x85, 0xa6, + 0x5b, 0xc5, 0xa8, 0x27, + ], + description: [ + 0xe1, 0x9b, 0x96, 0xe1, 0x9a, 0xb1, 0xc7, 0xb2, 0xc4, 0xb1, 0xc9, 0x81, 0xc2, 0xbe, + 0xc6, 0x84, 0xc4, 0x91, 0xc7, 0xb1, 0xc5, 0x83, 0xc2, 0xa3, 0xce, 0x8c, 0xce, 0x8c, + 0xc8, 0x8d, 0xc5, 0xaa, 0xc7, 0xa1, 0xe1, 0x9b, 0x9f, 0xc8, 0x8a, 0xc6, 0xbc, 0xc8, + 0xa3, 0xc8, 0xa8, 0xe1, 0x9b, 0x9b, 0xc8, 0xba, 0xc3, 0x88, 0xc7, 0x9f, 0x34, 0xc6, + 0xb9, 0xc2, 0xb9, 0xe1, 0x9a, 0xac, 0xc9, 0x88, 0xc5, 0x84, 0xc6, 0xa1, 0xe2, 0xb1, + 0xb6, 0xc2, 0xa8, 0xc6, 0xb4, 0xc7, 0xb3, 0x5a, 0x3d, 0xc7, 0xa1, 0xc8, 0x80, 0xc3, + 0x92, 0xc7, 0xa2, 0xc7, 0x93, 0xc7, 0xbb, 0xc8, 0xae, 0xc4, 0xb2, 0xc9, 0x83, 0xc6, + 0x88, 0xe2, 0xb1, 0xa2, 0xc8, 0x95, 0xc2, 0xb4, 0xc4, 0x86, 0xc5, 0xa5, 0x47, 0x70, + 0xe2, 0xb1, 0xb1, 0x62, 0xc3, 0x96, 0x5a, 0xe1, 0x9b, 0x97, 0xc5, 0x99, 0xc6, 0xb7, + 0xc3, 0xaa, 0xc5, 0x9d, 0xc7, 0x85, 0xc2, 0xa1, 0xc4, 0x93, 0xe1, 0x9a, 0xb8, 0xc3, + 0x8b, 0xe1, 0x9a, 0xad, 0xc7, 0xb3, 0xc7, 0x9a, 0xc7, 0xac, 0xe2, 0xb1, 0xaa, 0xc7, + 0xac, 0xc6, 0x91, 0xc2, 0xa9, 0xc5, 0xba, 0xc5, 0xa7, 0xc7, 0x9f, 0xc3, 0xad, 0xc8, + 0x81, 0xc8, 0x88, 0xc4, 0x86, 0xc9, 0x8d, 0xe1, 0x9b, 0xaf, 0xe1, 0x9b, 0xa1, 0xe2, + 0xb1, 0xb6, 0xc8, 0x8a, 0xc8, 0xa4, 0xc2, 0xaa, 0xe1, 0x9b, 0x9e, 0xc5, 0xa2, 0xc7, + 0x98, 0xc6, 0x93, 0xc4, 0xa8, 0xe1, 0x9b, 0x80, 0x2c, 0xc3, 0x8e, 0x25, 0x51, 0xe2, + 0xb1, 0xa7, 0xc8, 0xb3, 0xc3, 0xa4, 0xcd, 0xb6, 0xe2, 0xb1, 0xae, 0xc5, 0xb0, 0xe2, + 0xb1, 0xaa, 0xc7, 0xae, 0xc7, 0x8f, 0xc7, 0x9b, 0xc8, 0xa5, 0xc6, 0x9f, 0xc8, 0x8e, + 0x2e, 0x5a, 0xe1, 0x9a, 0xb9, 0xc2, 0xba, 0xc7, 0x8f, 0xc6, 0x90, 0xe1, 0x9a, 0xa9, + 0xc4, 0x85, 0xe1, 0x9b, 0x9f, 0x45, 0x3c, 0xc4, 0xbf, 0xc2, 0xa6, 0xc7, 0x9d, 0xe2, + 0xb1, 0xa8, 0xc7, 0x97, 0xc2, 0xbd, 0xc6, 0x8d, 0xcd, 0xb0, 0xc9, 0x83, 0x4a, 0xc8, + 0x80, 0xce, 0x89, 0xc9, 0x8f, 0xc3, 0xbb, 0xc4, 0xa7, 0xc7, 0x8c, 0x39, 0x7e, 0xc7, + 0x8f, 0xc5, 0xaa, 0x5a, 0xc3, 0x88, 0xc8, 0x93, 0xe1, 0x9b, 0xa6, 0xc5, 0x9e, 0xc8, + 0xaa, 0xc5, 0x90, 0x2e, 0xc8, 0xac, 0xe2, 0xb1, 0xb8, 0x7d, 0xc5, 0x9d, 0xc6, 0xaf, + 0xc8, 0x9d, 0xcd, 0xbe, 0xe2, 0xb1, 0xac, 0xc2, 0xbd, 0xc6, 0x9a, 0xc8, 0xb0, 0xe2, + 0xb1, 0xbc, 0xe1, 0x9b, 0x83, 0x29, 0x44, 0xe1, 0x9b, 0x9d, 0xc4, 0x87, 0xc6, 0x99, + 0xc7, 0xb6, 0xe1, 0x9b, 0x90, 0xcd, 0xb5, 0x3b, 0xc8, 0x92, 0xc6, 0x80, 0xc8, 0xa7, + 0xc9, 0x8e, 0xc2, 0xa8, 0xc7, 0x8b, 0xc2, 0xb1, 0xc5, 0xb4, 0xe2, 0xb1, 0xbf, 0xe1, + 0x9b, 0x86, 0xe1, 0x9a, 0xb8, 0x46, 0xe1, 0x9b, 0x81, 0x55, 0xc7, 0xa2, 0x26, 0xc5, + 0x99, 0x37, 0xe1, 0x9a, 0xa5, 0xc3, 0x93, 0xc7, 0x94, 0x6f, 0xe2, 0xb1, 0xba, 0xc7, + 0x86, 0xc2, 0xa9, 0xc5, 0x87, 0xc6, 0x9e, 0xc3, 0xae, 0xc8, 0xa7, 0xc3, 0x8c, 0x30, + 0xc7, 0x82, 0xc7, 0xaf, 0xc5, 0xa6, 0x77, 0xe1, 0x9b, 0x80, 0x5c, 0xcd, 0xbd, 0xc2, + 0xb5, 0xc7, 0x8f, 0x3c, 0xc3, 0x97, 0xc2, 0xb3, 0x58, 0xc6, 0x84, 0xc7, 0x86, 0xc6, + 0xaa, 0x61, 0xc5, 0x8c, 0xc5, 0xa1, 0xe2, 0xb1, 0xbf, 0xe1, 0x9b, 0xb0, 0xc3, 0x96, + 0xc8, 0x9e, 0xc8, 0xbb, 0xe1, 0x9a, 0xa0, 0xc6, 0x9d, 0xc4, 0xb3, 0xc8, 0x91, 0xc8, + 0xb2, 0xc8, 0xa5, 0xc8, 0x81, 0xc5, 0x80, 0xc8, 0x93, 0x62, 0x30, 0xe1, 0x9b, 0xa6, + 0xc5, 0x93, 0xc6, 0x81, 0xe1, 0x9a, 0xb3, 0x72, 0xc8, 0xa8, 0xc5, 0x90, 0xc8, 0x85, + 0xc3, 0x81, 0xc4, 0x97, 0xe1, 0x9b, 0x92, 0x5a, + ], + asset_id: [ + 0x08, 0xfe, 0xbb, 0x02, 0x39, 0x9f, 0x3d, 0x81, 0x83, 0x8b, 0x51, 0xbf, 0x9a, 0xb5, + 0x35, 0xe9, 0x5b, 0xba, 0x0f, 0x19, 0x9a, 0xda, 0x1c, 0x26, 0x65, 0xd4, 0x39, 0x4e, + 0xa0, 0xb2, 0xa7, 0x02, + ], + }, + TestVector { + key: [ + 0x70, 0x0d, 0xc0, 0x7a, 0xea, 0x5b, 0x17, 0xb5, 0xc0, 0x2b, 0xe3, 0x8c, 0x71, 0x1c, + 0x5d, 0x6d, 0x38, 0x13, 0xa4, 0x5e, 0xc2, 0x30, 0xda, 0x29, 0xfb, 0x37, 0x3c, 0x56, + 0x8c, 0x10, 0x44, 0x20, + ], + description: [ + 0xc3, 0x92, 0xe1, 0x9b, 0x95, 0xe1, 0x9a, 0xbf, 0xc4, 0xbc, 0x42, 0xc3, 0x88, 0xc7, + 0xb1, 0x42, 0xc8, 0xb4, 0xc4, 0x8b, 0xc4, 0xa9, 0xc4, 0xbe, 0xc2, 0xa4, 0xc2, 0xa3, + 0xc8, 0xaf, 0xc4, 0x87, 0xc4, 0xaa, 0xc3, 0x94, 0xcd, 0xb0, 0xc8, 0x87, 0xc5, 0xaa, + 0x3d, 0xc2, 0xbb, 0xc7, 0x9c, 0xc3, 0xb1, 0xc2, 0xb9, 0xc8, 0x94, 0xc4, 0x93, 0x5e, + 0xe1, 0x9b, 0xa1, 0xc8, 0x91, 0xc7, 0xb7, 0x41, 0x46, 0x44, 0xc4, 0xac, 0xc6, 0x83, + 0xc5, 0xbe, 0xc3, 0xa7, 0xc8, 0x9a, 0xe1, 0x9b, 0x86, 0xc3, 0xa5, 0xc3, 0x9f, 0xc6, + 0xb5, 0xe1, 0x9b, 0xa8, 0xe2, 0xb1, 0xbc, 0xc6, 0xaa, 0xe1, 0x9a, 0xa1, 0xc3, 0x81, + 0xce, 0x87, 0xc3, 0x8c, 0xc6, 0xa0, 0xe1, 0x9a, 0xa7, 0x38, 0xc4, 0x98, 0xc4, 0x99, + 0xc2, 0xbd, 0xc3, 0xa4, 0xc3, 0xab, 0xc4, 0xa7, 0xe1, 0x9a, 0xa3, 0xcd, 0xb4, 0x7b, + 0xe1, 0x9a, 0xb7, 0xc4, 0xbb, 0xe2, 0xb1, 0xb3, 0xe2, 0xb1, 0xa7, 0xc6, 0x97, 0xc3, + 0x9f, 0xc3, 0x91, 0xce, 0x8c, 0xc3, 0x84, 0xc7, 0xac, 0xcd, 0xb1, 0xe2, 0xb1, 0xb9, + 0xe2, 0xb1, 0xac, 0xc9, 0x87, 0xc3, 0x9a, 0xc7, 0xb9, 0xc5, 0x96, 0xc7, 0x8e, 0xc4, + 0x8e, 0xc7, 0xbb, 0xc4, 0x9b, 0xe1, 0x9b, 0x9c, 0xc4, 0xad, 0xc7, 0x81, 0xc4, 0xa4, + 0x39, 0xc6, 0x81, 0xc6, 0x89, 0xc7, 0xa9, 0xc2, 0xa3, 0xe2, 0xb1, 0xac, 0xc9, 0x80, + 0x51, 0xcd, 0xbd, 0xc6, 0xb8, 0xc9, 0x81, 0xc5, 0x93, 0xc8, 0xa0, 0x5d, 0xc4, 0x9c, + 0xc6, 0x90, 0x35, 0xc4, 0xb7, 0xc8, 0x9a, 0xc5, 0x90, 0xc8, 0x94, 0xc8, 0x95, 0xc8, + 0x92, 0xc9, 0x8c, 0xc4, 0xb5, 0x49, 0xc6, 0xbe, 0xc9, 0x84, 0xc2, 0xbf, 0xc6, 0xbb, + 0xc2, 0xab, 0xe1, 0x9b, 0xac, 0xc6, 0x87, 0x6a, 0xc6, 0xbc, 0xc4, 0xae, 0xe1, 0x9b, + 0x81, 0xc4, 0xb3, 0xe2, 0xb1, 0xb4, 0xc3, 0x96, 0x2f, 0xc4, 0x94, 0xc7, 0x8c, 0xc3, + 0xb2, 0xc2, 0xab, 0xc5, 0x80, 0xc5, 0xac, 0xe2, 0xb1, 0xad, 0xc4, 0x9c, 0xc4, 0xae, + 0xc7, 0xb7, 0x7d, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, 0xbd, 0xc4, 0xb3, 0xcd, 0xb3, 0xc2, + 0xa6, 0xe1, 0x9a, 0xbc, 0x33, 0xe2, 0xb1, 0xb8, 0xc7, 0xa8, 0xe1, 0x9a, 0xa1, 0xe1, + 0x9b, 0xad, 0xc5, 0xac, 0xce, 0x8a, 0xc4, 0x94, 0xc3, 0x80, 0xc7, 0xb4, 0xc7, 0xa9, + 0xc9, 0x84, 0xc2, 0xb1, 0xc5, 0x9c, 0xc7, 0x88, 0xe2, 0xb1, 0xb6, 0xcd, 0xb0, 0xc5, + 0x93, 0xc2, 0xb7, 0xe1, 0x9b, 0x8e, 0xe1, 0x9a, 0xa4, 0xc4, 0x87, 0xc4, 0x8c, 0xc6, + 0x92, 0xc3, 0xa9, 0xc5, 0xa7, 0xc7, 0x96, 0xc3, 0xbd, 0xc4, 0x83, 0xc3, 0xb4, 0x44, + 0xc3, 0x96, 0xc2, 0xb3, 0x7b, 0xe1, 0x9b, 0x8d, 0xc6, 0x86, 0xc6, 0x89, 0x61, 0xc7, + 0x90, 0xc2, 0xb1, 0xc5, 0xaf, 0xc7, 0x94, 0xc6, 0xb5, 0xc7, 0xae, 0xe1, 0x9b, 0x8f, + 0xc7, 0xa6, 0xc8, 0xac, 0xc5, 0x92, 0xc5, 0xb3, 0xc5, 0xb3, 0xc8, 0x92, 0xc3, 0x8e, + 0xc4, 0x93, 0xc3, 0xb0, 0xc4, 0x9b, 0xc4, 0x8c, 0xc3, 0x83, 0xce, 0x89, 0xc6, 0x9b, + 0x79, 0xc2, 0xa5, 0xc7, 0xa9, 0xc4, 0xa3, 0xc2, 0xa2, 0xc3, 0x90, 0xc6, 0x9e, 0xc6, + 0x9d, 0xe1, 0x9a, 0xbb, 0xc4, 0x8c, 0xc5, 0xa8, 0xc8, 0xb2, 0xc3, 0xac, 0x5e, 0xc8, + 0xb2, 0x38, 0xc7, 0xa0, 0xc4, 0x9e, 0xc5, 0x8f, 0xc6, 0xa9, 0xe1, 0x9a, 0xb1, 0xe1, + 0x9b, 0x84, 0xcd, 0xbe, 0x61, 0xc7, 0x87, 0xce, 0x85, 0xc4, 0x89, 0xc8, 0x96, 0xc8, + 0xa3, 0xc8, 0x96, 0xc3, 0xab, 0xc6, 0xae, 0xce, 0x88, 0xe1, 0x9a, 0xbf, 0xc5, 0x91, + 0xe1, 0x9b, 0xab, 0xc7, 0x96, 0x33, 0xc3, 0xab, 0xe2, 0xb1, 0xb9, 0xe2, 0xb1, 0xac, + 0xe2, 0xb1, 0xbb, 0xe2, 0xb1, 0xae, 0xc2, 0xbf, + ], + asset_id: [ + 0xda, 0x5b, 0xdf, 0x78, 0xe8, 0x94, 0xa9, 0x67, 0xb8, 0x2b, 0xfe, 0xc3, 0x50, 0x04, + 0x41, 0x5e, 0xe1, 0xc8, 0xc3, 0xf2, 0x66, 0x22, 0xa2, 0xc2, 0x0c, 0xf5, 0x13, 0x9b, + 0x79, 0xf1, 0x08, 0xba, + ], + }, + TestVector { + key: [ + 0xf3, 0x2c, 0x7a, 0x80, 0xb6, 0x83, 0x45, 0xb2, 0x38, 0xc7, 0x73, 0x34, 0x67, 0xba, + 0x6c, 0xd9, 0x7c, 0xcd, 0xf4, 0xfd, 0x21, 0x29, 0x48, 0x13, 0x1b, 0xfb, 0xc4, 0x06, + 0x19, 0x68, 0x73, 0x26, + ], + description: [ + 0xe1, 0x9b, 0xa7, 0xe2, 0xb1, 0xb3, 0xc4, 0x8f, 0xe1, 0x9b, 0x97, 0x23, 0xe1, 0x9b, + 0xaf, 0x70, 0xc6, 0x9f, 0xc8, 0x82, 0xc4, 0x9c, 0xc7, 0x96, 0xc5, 0x81, 0xc3, 0x90, + 0xc5, 0xaf, 0xc6, 0x81, 0x33, 0xc8, 0xb2, 0x46, 0xc8, 0xba, 0x65, 0xcd, 0xb6, 0xe2, + 0xb1, 0xb7, 0xc8, 0xae, 0x5a, 0xc3, 0x87, 0xc6, 0xb3, 0xc6, 0x9f, 0x3d, 0xc3, 0x8a, + 0xc2, 0xb2, 0xc6, 0xab, 0xe1, 0x9b, 0x90, 0xc8, 0xbb, 0xe2, 0xb1, 0xab, 0xc3, 0x9f, + 0xc7, 0xb9, 0x67, 0xe2, 0xb1, 0xba, 0xe1, 0x9b, 0x88, 0xc4, 0x91, 0xc5, 0x9a, 0xe1, + 0x9b, 0x86, 0xe2, 0xb1, 0xbf, 0xc5, 0x9c, 0xc5, 0xad, 0x7d, 0xe2, 0xb1, 0xb1, 0xc4, + 0x9e, 0xc6, 0x90, 0xc5, 0x8b, 0xc4, 0xa3, 0xc5, 0x8c, 0xc3, 0xaf, 0xc4, 0x90, 0xc4, + 0xb2, 0x76, 0xc8, 0xbe, 0x33, 0xc9, 0x85, 0xc5, 0x80, 0xc7, 0x98, 0x6b, 0xe1, 0x9a, + 0xa8, 0x5e, 0xc4, 0xa3, 0xe1, 0x9b, 0x9c, 0xc7, 0x87, 0xc4, 0xbd, 0xce, 0x89, 0xc8, + 0xb4, 0x50, 0x3d, 0xc7, 0xa7, 0xc6, 0x97, 0xe1, 0x9b, 0xac, 0xc3, 0xb4, 0xe2, 0xb1, + 0xbc, 0xc6, 0x9f, 0xc4, 0xb5, 0xc5, 0xb7, 0xe1, 0x9a, 0xac, 0xc7, 0xa1, 0xe1, 0x9a, + 0xbe, 0xe2, 0xb1, 0xbb, 0xc6, 0x94, 0xc7, 0x90, 0xe1, 0x9b, 0x82, 0xe1, 0x9b, 0x80, + 0xc6, 0x98, 0xc4, 0x9f, 0xc7, 0xac, 0xc6, 0xab, 0xc5, 0xb2, 0x48, 0x6e, 0xc2, 0xa5, + 0xc4, 0x8c, 0xc9, 0x83, 0xc9, 0x86, 0x73, 0x29, 0x6b, 0xc3, 0xbd, 0xc2, 0xbf, 0xc4, + 0x9b, 0xe1, 0x9a, 0xbf, 0xc7, 0xbe, 0xe1, 0x9b, 0x83, 0xe2, 0xb1, 0xab, 0xc7, 0x8d, + 0xe2, 0xb1, 0xa2, 0x57, 0xc5, 0x84, 0xc6, 0xbc, 0xe1, 0x9b, 0xaf, 0xc5, 0xa3, 0xc8, + 0x8f, 0x25, 0xe2, 0xb1, 0xa3, 0x6d, 0x35, 0xc8, 0xae, 0x34, 0xe2, 0xb1, 0xb9, 0xe2, + 0xb1, 0xad, 0xc3, 0xb6, 0x71, 0xce, 0x84, 0xc8, 0x92, 0xc5, 0xa7, 0xc6, 0xb9, 0xce, + 0x87, 0xc4, 0xb8, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x89, 0x76, 0xc4, 0xaf, 0xc4, 0x85, + 0xc2, 0xac, 0xc4, 0xbd, 0x7c, 0xc4, 0xba, 0xc4, 0x80, 0xc4, 0xa0, 0xc9, 0x82, 0xc3, + 0xb3, 0xe1, 0x9b, 0x9e, 0xc2, 0xaf, 0xc3, 0x86, 0x7e, 0xc6, 0xa0, 0xc4, 0x8d, 0xc6, + 0x8a, 0xc2, 0xba, 0xc4, 0xbd, 0xe1, 0x9b, 0x84, 0x75, 0xe1, 0x9a, 0xa1, 0xe2, 0xb1, + 0xbe, 0xc7, 0xa1, 0xc7, 0x90, 0xcd, 0xbb, 0x29, 0xc5, 0xa4, 0xc4, 0xb8, 0xc4, 0xbd, + 0xc9, 0x87, 0xc4, 0x9a, 0xc6, 0xa2, 0xe2, 0xb1, 0xa3, 0xc5, 0xae, 0xc2, 0xb4, 0xc5, + 0x89, 0xc7, 0x93, 0xc2, 0xa9, 0xc4, 0x9c, 0xe1, 0x9a, 0xa9, 0xc9, 0x81, 0xc6, 0x88, + 0xc3, 0x95, 0xc6, 0xb5, 0x56, 0x6b, 0x69, 0xc4, 0x86, 0xc4, 0xa5, 0xc4, 0xb3, 0xc3, + 0x85, 0xe2, 0xb1, 0xb0, 0xc4, 0x8e, 0x38, 0x5e, 0x3c, 0xc7, 0xb1, 0xc8, 0xa1, 0xc5, + 0x84, 0xc6, 0x85, 0xc8, 0xb9, 0xc6, 0x96, 0xc8, 0x94, 0xc3, 0x98, 0xc5, 0xb6, 0xc8, + 0x9a, 0xc8, 0x97, 0xc3, 0xa4, 0xc3, 0x81, 0xc3, 0xa9, 0x5c, 0xc7, 0xb7, 0xe1, 0x9b, + 0xac, 0xc8, 0x90, 0x2c, 0xe1, 0x9b, 0xa2, 0xc6, 0xb8, 0xc7, 0x93, 0xc4, 0x9e, 0xc4, + 0xbd, 0xc4, 0x90, 0xe1, 0x9a, 0xb7, 0xc9, 0x85, 0xc7, 0x9f, 0xc4, 0xbf, 0xc5, 0xba, + 0xc2, 0xa9, 0xe1, 0x9b, 0x9f, 0x76, 0xc3, 0xa3, 0xc8, 0xa6, 0xc5, 0x8c, 0xc6, 0xa0, + 0xc9, 0x8d, 0xc3, 0xa0, 0xc8, 0xa7, 0x2c, 0xc6, 0x80, 0xc8, 0xbf, 0x75, 0x2b, 0xc7, + 0xbe, 0xc5, 0xb5, 0xe1, 0x9b, 0x87, 0xc3, 0xbe, 0xcd, 0xba, 0xe1, 0x9b, 0x8f, 0xc6, + 0x82, 0xc7, 0xa7, 0xe1, 0x9b, 0x87, 0x62, 0xc3, 0x95, 0xc4, 0xbf, 0xe1, 0x9b, 0xaf, + 0xc4, 0xb3, 0xc7, 0xaf, 0xc3, 0x95, 0xc7, 0x9f, + ], + asset_id: [ + 0x4f, 0x20, 0x3c, 0x3a, 0x6f, 0x5b, 0x58, 0xbb, 0x4b, 0x01, 0x14, 0xf0, 0x2c, 0x1f, + 0x4e, 0xbb, 0x78, 0x4a, 0xa3, 0xa3, 0x7e, 0x5d, 0xae, 0x4a, 0x27, 0xf0, 0xea, 0xcc, + 0xf6, 0x8b, 0xab, 0x29, + ], + }, + TestVector { + key: [ + 0x98, 0xee, 0xc6, 0xfb, 0xdc, 0xa2, 0x77, 0x2a, 0x2a, 0x6b, 0xf9, 0x2f, 0x17, 0x18, + 0xdf, 0x59, 0xba, 0xb2, 0x5f, 0xd1, 0x05, 0x4c, 0x57, 0xad, 0xae, 0x0d, 0x72, 0x20, + 0xbf, 0xcd, 0x06, 0x38, + ], + description: [ + 0xc8, 0xb4, 0x34, 0xc3, 0x8c, 0xc7, 0x89, 0xc7, 0x86, 0x5e, 0xc5, 0xbb, 0xc7, 0xba, + 0xe1, 0x9b, 0x96, 0x5d, 0xc5, 0x88, 0x52, 0xcd, 0xb1, 0xe1, 0x9b, 0xad, 0xce, 0x88, + 0xc7, 0x80, 0xc5, 0x91, 0xc6, 0xba, 0xc6, 0x8f, 0xc6, 0x81, 0xc7, 0xa8, 0xc6, 0xb1, + 0x6b, 0xc6, 0x8c, 0xc5, 0x8f, 0xe2, 0xb1, 0xb3, 0xc5, 0x95, 0xc5, 0xa3, 0xc7, 0xaa, + 0xc5, 0xb5, 0xc7, 0xbe, 0xc6, 0xb2, 0xc6, 0x8d, 0x61, 0x23, 0xe2, 0xb1, 0xb3, 0xc4, + 0xbb, 0xc5, 0x96, 0xc6, 0x91, 0xc7, 0x99, 0x60, 0x2c, 0xe1, 0x9b, 0x82, 0xce, 0x86, + 0xc8, 0x92, 0xc4, 0xa1, 0xc4, 0xa2, 0xc7, 0xb4, 0x56, 0x23, 0xe1, 0x9b, 0xae, 0xc7, + 0x8d, 0xc3, 0xa0, 0xc6, 0xa4, 0xc4, 0x9b, 0xc9, 0x81, 0xc8, 0xb6, 0xe1, 0x9b, 0xa0, + 0xe2, 0xb1, 0xbc, 0xe1, 0x9b, 0x82, 0xc8, 0x98, 0xc3, 0xb7, 0xe1, 0x9b, 0x8b, 0xe1, + 0x9b, 0x80, 0xe1, 0x9a, 0xa5, 0x2a, 0xc3, 0x90, 0x5c, 0xc4, 0xb8, 0xc8, 0x9e, 0xc5, + 0x80, 0xc8, 0x9b, 0xe2, 0xb1, 0xaf, 0xc7, 0x9f, 0xc7, 0x97, 0xc3, 0x9d, 0xe1, 0x9b, + 0x9e, 0xc4, 0xaf, 0xc4, 0xb8, 0xc2, 0xb9, 0x3c, 0xc4, 0x9a, 0xc8, 0x80, 0xc6, 0x9d, + 0x2f, 0x47, 0xc6, 0xb0, 0xc6, 0xb4, 0xc7, 0xb9, 0xe2, 0xb1, 0xb6, 0xc8, 0xa5, 0xc7, + 0x91, 0xe1, 0x9b, 0x9d, 0xc6, 0x95, 0x74, 0xe1, 0x9b, 0x9b, 0xc4, 0xac, 0xc6, 0xa3, + 0xe1, 0x9b, 0xa8, 0xc4, 0x8d, 0xc6, 0x97, 0xc5, 0xb6, 0xc6, 0xb8, 0xe2, 0xb1, 0xa8, + 0xc2, 0xbb, 0xe1, 0x9b, 0x95, 0xc7, 0x91, 0xe1, 0x9a, 0xba, 0xc8, 0xbe, 0xc3, 0xa1, + 0xc2, 0xbf, 0xc6, 0x9d, 0xcd, 0xb2, 0x51, 0xc6, 0x8d, 0xe1, 0x9a, 0xb9, 0xc8, 0x8d, + 0xc5, 0xaf, 0xc4, 0xa9, 0xc6, 0xa4, 0xc5, 0x8b, 0xc6, 0xbd, 0xc3, 0xb6, 0xc4, 0x8d, + 0xc7, 0x80, 0xc6, 0x95, 0xc5, 0xb9, 0xc2, 0xae, 0xe1, 0x9a, 0xa4, 0x54, 0x69, 0xc3, + 0x9b, 0xc4, 0x8e, 0xc6, 0x9f, 0xc8, 0xb5, 0x65, 0xc5, 0x95, 0xcd, 0xb3, 0xc5, 0x9f, + 0xc7, 0xae, 0xc4, 0xa4, 0xc3, 0x83, 0xc3, 0x82, 0xe1, 0x9a, 0xa4, 0xc4, 0x93, 0xc7, + 0x88, 0x67, 0xc3, 0xaf, 0xc3, 0xb9, 0xc5, 0xb5, 0x46, 0xcd, 0xb1, 0x5e, 0x28, 0xe1, + 0x9a, 0xb6, 0xc6, 0x86, 0x67, 0xc3, 0xb9, 0xc5, 0xb2, 0xc5, 0x8c, 0xc4, 0xb5, 0xc3, + 0xba, 0xe1, 0x9a, 0xbe, 0xc6, 0x85, 0x5a, 0xcd, 0xb4, 0xe1, 0x9b, 0xa8, 0xc6, 0x86, + 0xc7, 0xb5, 0xc6, 0x83, 0xc3, 0x8d, 0xc4, 0xa0, 0xc7, 0x9d, 0xc6, 0xab, 0x57, 0xc4, + 0xa3, 0xc3, 0x9d, 0xc7, 0x88, 0x3f, 0xc8, 0x99, 0xc5, 0x98, 0xc4, 0x91, 0xe1, 0x9b, + 0x88, 0xe2, 0xb1, 0xa1, 0xc7, 0x97, 0xc5, 0x8d, 0xe1, 0x9a, 0xb8, 0xc8, 0xa8, 0xc2, + 0xac, 0x4d, 0xc6, 0xa2, 0xe2, 0xb1, 0xb8, 0x3f, 0xe2, 0xb1, 0xb8, 0xc8, 0xa4, 0xc7, + 0x98, 0xc7, 0x98, 0x63, 0xc6, 0xb3, 0xc5, 0x8f, 0xc8, 0x86, 0xc4, 0xbf, 0xe2, 0xb1, + 0xb8, 0xc8, 0xb6, 0xc4, 0x98, 0xc4, 0x8a, 0xc6, 0x93, 0xe1, 0x9b, 0x87, 0xc7, 0x93, + 0xc6, 0xbb, 0xc8, 0x84, 0xc7, 0x92, 0xc8, 0x97, 0xe2, 0xb1, 0xa2, 0xc6, 0x8b, 0xc5, + 0xa1, 0xc8, 0x8b, 0xc9, 0x8b, 0xc3, 0x9a, 0xe1, 0x9b, 0x81, 0xc2, 0xa2, 0xc6, 0x95, + 0xc8, 0x99, 0x38, 0xc4, 0xb2, 0x68, 0xc7, 0x83, 0xe1, 0x9a, 0xb2, 0xc4, 0xae, 0xc8, + 0x8d, 0xc5, 0xb6, 0xc5, 0x9e, 0x79, 0xc6, 0xa9, 0x45, 0xc6, 0x9f, 0xc7, 0x99, 0xc7, + 0x99, 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0xa1, 0xc7, 0xbc, 0xc8, 0x88, 0xc6, 0xbe, 0xc4, + 0xb3, 0xc8, 0x90, 0x4c, 0xc8, 0xba, 0xc3, 0x9d, 0xe1, 0x9b, 0x8f, 0xe1, 0x9a, 0xb7, + 0xe2, 0xb1, 0xb6, 0xc4, 0x83, 0xc5, 0xa9, 0x5a, + ], + asset_id: [ + 0x61, 0xb6, 0x64, 0xff, 0x70, 0xb4, 0x5a, 0x10, 0x5a, 0x5e, 0x5e, 0x2a, 0x65, 0xbd, + 0x5b, 0x37, 0x7a, 0x0d, 0x89, 0xf0, 0x65, 0x6d, 0xb9, 0xe5, 0x72, 0x43, 0x2a, 0x3b, + 0x41, 0x09, 0xb8, 0xba, + ], + }, + TestVector { + key: [ + 0x3a, 0x86, 0x32, 0x5c, 0x89, 0x70, 0xca, 0x21, 0xb8, 0x3a, 0xb7, 0x59, 0x76, 0xa8, + 0xd8, 0x54, 0xff, 0xa0, 0xc7, 0x63, 0x1b, 0xd0, 0xf8, 0xa8, 0x8c, 0x0a, 0x09, 0x89, + 0xbd, 0xb7, 0x75, 0x19, + ], + description: [ + 0xc4, 0xae, 0xc6, 0x83, 0xc3, 0xb4, 0xe1, 0x9b, 0xa2, 0xc6, 0x93, 0xc9, 0x86, 0xc4, + 0xa7, 0xe2, 0xb1, 0xb9, 0xc8, 0x9b, 0x3d, 0xcd, 0xbd, 0x3f, 0x54, 0xc8, 0xa9, 0xce, + 0x84, 0xc8, 0x87, 0xc4, 0x8d, 0xe1, 0x9b, 0x83, 0xc6, 0xac, 0xe1, 0x9b, 0x9f, 0xc5, + 0x83, 0xc7, 0x89, 0x66, 0xc4, 0x86, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, 0x8f, 0xc6, 0x99, + 0xc5, 0xb0, 0xc4, 0x8e, 0xc4, 0x8b, 0xc7, 0x93, 0xc5, 0x9b, 0xc5, 0xb7, 0xc8, 0x89, + 0xc3, 0x9b, 0x6e, 0xc5, 0xbd, 0xc2, 0xbe, 0xc4, 0x9e, 0x5f, 0xe1, 0x9b, 0x9a, 0xc4, + 0x86, 0xe2, 0xb1, 0xa2, 0x7c, 0xcd, 0xb7, 0xc3, 0xab, 0x43, 0xc7, 0xa7, 0xe2, 0xb1, + 0xa0, 0xcd, 0xbc, 0xc8, 0x90, 0xc7, 0x9f, 0xc7, 0xb4, 0xc8, 0x9d, 0xc4, 0x9e, 0xe1, + 0x9a, 0xb3, 0x38, 0xc6, 0xaa, 0xe2, 0xb1, 0xb4, 0xc8, 0x97, 0xc8, 0x96, 0xc6, 0x90, + 0xc7, 0xaf, 0xc7, 0x97, 0x77, 0x5f, 0xc4, 0x9d, 0xc7, 0xa9, 0xc8, 0x9f, 0xe1, 0x9a, + 0xb0, 0xc3, 0x90, 0x35, 0x49, 0xc4, 0xb9, 0xc5, 0x96, 0xcd, 0xbc, 0xc7, 0xb3, 0xc8, + 0xa4, 0x37, 0x46, 0xc2, 0xba, 0xe1, 0x9b, 0x89, 0xc5, 0x86, 0xc6, 0x84, 0xc5, 0x9b, + 0xe1, 0x9b, 0x93, 0xc7, 0x81, 0xc5, 0x8d, 0x29, 0xc4, 0x9c, 0xc6, 0xbe, 0xc4, 0xad, + 0xc8, 0x83, 0xe1, 0x9b, 0x81, 0xc4, 0xa2, 0xc8, 0x9d, 0xc4, 0x9c, 0xc7, 0xae, 0xc7, + 0x80, 0x35, 0xe1, 0x9a, 0xa6, 0xe1, 0x9a, 0xac, 0xc4, 0xb7, 0xe1, 0x9b, 0xa2, 0xc7, + 0xa6, 0xe2, 0xb1, 0xad, 0xc5, 0x89, 0xc6, 0x95, 0xc4, 0x98, 0xc8, 0x8d, 0xe2, 0xb1, + 0xa3, 0xc6, 0xb3, 0xc7, 0xaf, 0xe1, 0x9a, 0xb7, 0xc4, 0xb8, 0xe2, 0xb1, 0xa8, 0xc8, + 0xa9, 0xc8, 0xba, 0xc3, 0x97, 0xe1, 0x9b, 0x89, 0xc3, 0x93, 0xc5, 0x9a, 0xc4, 0x8b, + 0xc5, 0xa6, 0xc4, 0xad, 0xc5, 0xb3, 0xe2, 0xb1, 0xb5, 0x66, 0xc6, 0x9c, 0x40, 0xc2, + 0xa1, 0xc8, 0x96, 0xe2, 0xb1, 0xa3, 0xc3, 0xbf, 0xc5, 0xa5, 0xcd, 0xb0, 0xc8, 0xb8, + 0xc6, 0xa1, 0x33, 0xe1, 0x9a, 0xb1, 0xe1, 0x9a, 0xbd, 0x33, 0xc3, 0xa2, 0xc6, 0xb7, + 0xc4, 0xb9, 0xc7, 0xba, 0x30, 0xc5, 0x9f, 0xc8, 0xad, 0xc5, 0x9c, 0xc4, 0xa5, 0xc2, + 0xbc, 0xce, 0x88, 0x4c, 0xc8, 0x9f, 0x7c, 0xc5, 0xbd, 0xc5, 0xa2, 0xe2, 0xb1, 0xae, + 0xc3, 0xb2, 0xc7, 0xb6, 0xc4, 0x96, 0xc5, 0xaa, 0xc6, 0x87, 0xc5, 0xb6, 0xe1, 0x9b, + 0x9a, 0xc3, 0xb1, 0xcd, 0xbb, 0xc6, 0xbd, 0xcd, 0xb5, 0x70, 0xce, 0x88, 0xc4, 0x8a, + 0xc2, 0xa8, 0xc4, 0xa6, 0xc2, 0xb0, 0xc4, 0xaf, 0xc6, 0xb5, 0xcd, 0xbd, 0x34, 0xc4, + 0x9a, 0xc4, 0x93, 0xc8, 0xbb, 0xc5, 0x99, 0xc7, 0x9d, 0xc2, 0xb4, 0xc9, 0x86, 0xe1, + 0x9b, 0x91, 0xc4, 0x9b, 0xc8, 0x94, 0xc7, 0xae, 0xe1, 0x9b, 0x9c, 0xc8, 0xab, 0xe1, + 0x9b, 0xa9, 0xc3, 0x99, 0xc8, 0x9c, 0xc3, 0x83, 0x7a, 0xe1, 0x9b, 0x87, 0xe1, 0x9a, + 0xad, 0xc5, 0x8c, 0xe1, 0x9a, 0xaa, 0xc7, 0xbe, 0x5f, 0xc8, 0xb5, 0xc6, 0x99, 0xe1, + 0x9b, 0xa7, 0xc7, 0xb1, 0xc6, 0x90, 0xc7, 0xb0, 0xc4, 0xac, 0xc3, 0x90, 0x77, 0xc7, + 0xb8, 0xc6, 0xa9, 0xc7, 0xa7, 0xce, 0x88, 0xe1, 0x9a, 0xa1, 0x36, 0xc4, 0xbb, 0xc4, + 0xa1, 0xc8, 0x8c, 0xc3, 0xb4, 0xc2, 0xa2, 0xe1, 0x9a, 0xb9, 0x68, 0xc7, 0x9a, 0xc5, + 0x9e, 0x75, 0xcd, 0xb5, 0xe1, 0x9b, 0x98, 0xc7, 0x82, 0xce, 0x88, 0xe1, 0x9b, 0x9c, + 0xc5, 0xa6, 0xc7, 0x98, 0xc5, 0xa7, 0x30, 0xc8, 0xbf, 0xcd, 0xb6, 0xc5, 0xbe, 0xc7, + 0x97, 0x6e, 0xc6, 0xab, 0xc8, 0x92, 0xc8, 0x88, 0xc5, 0x87, 0xc7, 0x95, 0xc3, 0x97, + 0xc4, 0xbb, 0xc7, 0x9c, 0xc5, 0x80, 0xc2, 0xb6, + ], + asset_id: [ + 0x8b, 0x7d, 0xde, 0x16, 0x1b, 0xad, 0x63, 0xb2, 0x3f, 0x2a, 0xa4, 0x2d, 0x23, 0xa3, + 0x7b, 0x5e, 0x0e, 0x33, 0x61, 0xa9, 0x85, 0x97, 0x47, 0x96, 0xf7, 0x10, 0xef, 0x46, + 0x4e, 0xa7, 0xa0, 0xaf, + ], + }, + TestVector { + key: [ + 0x4f, 0x50, 0xd9, 0x58, 0xf6, 0xb6, 0x79, 0x91, 0x33, 0x48, 0x49, 0xd1, 0x85, 0xf1, + 0xa3, 0x92, 0x0e, 0xfb, 0x46, 0x35, 0x1c, 0x70, 0x7d, 0xc3, 0x7d, 0x3e, 0xa9, 0xa1, + 0x79, 0xc0, 0x76, 0x27, + ], + description: [ + 0xc7, 0xa3, 0xc8, 0x83, 0xc6, 0xa9, 0xc6, 0x9c, 0xe1, 0x9b, 0x95, 0xc3, 0x94, 0xc2, + 0xa1, 0xc2, 0xa5, 0xc5, 0x92, 0xe2, 0xb1, 0xbe, 0xe1, 0x9a, 0xa9, 0x60, 0xc6, 0xbc, + 0x51, 0xe1, 0x9a, 0xa9, 0xe1, 0x9a, 0xb9, 0xe1, 0x9a, 0xae, 0xc8, 0xb1, 0xcd, 0xb7, + 0xc8, 0x9a, 0xc8, 0xa2, 0xc6, 0x91, 0xc5, 0x90, 0xc5, 0x8a, 0xc8, 0x94, 0xe1, 0x9a, + 0xbe, 0xce, 0x88, 0xc6, 0xb8, 0xc8, 0x8e, 0xc2, 0xbe, 0xce, 0x86, 0xc5, 0xb4, 0xe1, + 0x9a, 0xa1, 0xc5, 0xbe, 0xc2, 0xa1, 0x39, 0xc8, 0xbd, 0xc4, 0xbb, 0xc8, 0x96, 0xe1, + 0x9b, 0x98, 0x72, 0xc3, 0x98, 0xc8, 0x9e, 0x33, 0x40, 0xc3, 0x9c, 0xe1, 0x9b, 0x97, + 0xc8, 0x8e, 0xc7, 0xab, 0x4b, 0xc6, 0xa1, 0xc6, 0x91, 0xc3, 0x90, 0xc7, 0xa5, 0xc4, + 0x88, 0xc5, 0x96, 0xc5, 0xb2, 0xc9, 0x84, 0xc6, 0xa6, 0xe1, 0x9a, 0xb0, 0xe2, 0xb1, + 0xad, 0xc3, 0x99, 0x45, 0xc3, 0x9d, 0xc3, 0xaf, 0xc6, 0xb0, 0xc5, 0x9c, 0xc4, 0x83, + 0xc4, 0x86, 0xc5, 0x91, 0xc7, 0xbe, 0xc4, 0x98, 0xc4, 0xa8, 0x62, 0xc4, 0x9b, 0xc3, + 0xb0, 0xe1, 0x9a, 0xa3, 0xc6, 0xab, 0xc4, 0x95, 0xc8, 0x99, 0xc5, 0xa8, 0xe1, 0x9b, + 0x92, 0xc8, 0xae, 0x4d, 0xe1, 0x9a, 0xae, 0xcd, 0xb2, 0xc3, 0x95, 0xc4, 0x8f, 0xc6, + 0xa9, 0xc5, 0x83, 0xc2, 0xaf, 0xc2, 0xb6, 0x5b, 0xc9, 0x8b, 0xe1, 0x9a, 0xae, 0xc3, + 0x9e, 0xc5, 0xa1, 0xcd, 0xb0, 0xc6, 0x87, 0xe1, 0x9a, 0xaa, 0xe1, 0x9a, 0xb8, 0xc7, + 0x94, 0xc6, 0xbc, 0xc7, 0xb4, 0xe1, 0x9b, 0x98, 0xc3, 0xbf, 0xc4, 0xbc, 0xcd, 0xb6, + 0xc4, 0x9b, 0xc4, 0xb7, 0xc2, 0xa9, 0xc7, 0x8e, 0xc3, 0xa0, 0xc3, 0x82, 0xc8, 0x9a, + 0xce, 0x89, 0xc6, 0xac, 0xc4, 0x94, 0xc3, 0x84, 0xc7, 0xb5, 0xce, 0x85, 0xc8, 0xa8, + 0xc3, 0x8c, 0xc8, 0x8d, 0xc2, 0xa8, 0xc8, 0x9a, 0xc9, 0x8e, 0xc8, 0xaa, 0xc3, 0x90, + 0xc7, 0x9d, 0xc8, 0xb3, 0xc4, 0x92, 0xc6, 0x83, 0x77, 0xc5, 0xa8, 0x52, 0xc4, 0xa4, + 0xc8, 0x91, 0xc6, 0xbd, 0xe1, 0x9a, 0xb6, 0xc7, 0xa8, 0xc3, 0xbf, 0xc7, 0x93, 0xe1, + 0x9b, 0x87, 0xe1, 0x9b, 0xad, 0x6f, 0xc8, 0xaa, 0xc6, 0xbb, 0xc6, 0xa3, 0xc7, 0xbe, + 0xc5, 0xb4, 0xe1, 0x9a, 0xab, 0xc7, 0xaa, 0xc7, 0x88, 0xc8, 0x85, 0xc6, 0xaa, 0xce, + 0x8c, 0xe1, 0x9b, 0x94, 0xc5, 0xb4, 0xc3, 0xa5, 0x66, 0x45, 0xc7, 0x80, 0xc5, 0x8f, + 0xc2, 0xb4, 0xc9, 0x8f, 0x39, 0xc3, 0x90, 0xc5, 0xa8, 0xc3, 0x91, 0xc6, 0x9e, 0xc8, + 0xb5, 0x72, 0xc6, 0x99, 0x5d, 0x2b, 0xc8, 0xb4, 0xc7, 0xbb, 0x79, 0xc5, 0xb8, 0xc6, + 0xb9, 0xc7, 0x9d, 0xc7, 0xb0, 0xe1, 0x9b, 0xa9, 0xe1, 0x9b, 0x92, 0xcd, 0xb6, 0xce, + 0x85, 0x42, 0xc2, 0xba, 0xc7, 0x99, 0xc7, 0x9c, 0xc5, 0x89, 0xc6, 0xbc, 0x29, 0xc2, + 0xb4, 0xc3, 0x8a, 0xc8, 0x81, 0xc3, 0x84, 0xc8, 0x92, 0xc3, 0x97, 0xe1, 0x9b, 0x91, + 0xc8, 0xa7, 0xc6, 0x99, 0xc4, 0x88, 0xe1, 0x9b, 0x9e, 0xc5, 0xab, 0xce, 0x88, 0xc5, + 0x93, 0xcd, 0xb1, 0xe2, 0xb1, 0xbc, 0xc5, 0xa0, 0xe1, 0x9b, 0x83, 0xc9, 0x80, 0xc4, + 0xbb, 0x24, 0xc6, 0x90, 0xc3, 0x8c, 0xc7, 0xa0, 0xc8, 0x9d, 0xc3, 0x8a, 0xc4, 0xa0, + 0xc6, 0xac, 0x72, 0xe1, 0x9b, 0x82, 0xe1, 0x9a, 0xba, 0xc3, 0x8f, 0x6c, 0xe1, 0x9a, + 0xb4, 0xc4, 0xbe, 0xc4, 0xaf, 0xc4, 0x9a, 0xc5, 0xa7, 0x41, 0xe2, 0xb1, 0xbf, 0xe2, + 0xb1, 0xb3, 0xc5, 0x8a, 0xe1, 0x9b, 0xa7, 0xc3, 0xa0, 0xc5, 0xaf, 0xc9, 0x8e, 0x35, + 0x34, 0xc2, 0xa3, 0xc5, 0xa4, 0xc2, 0xb3, 0xcd, 0xb1, 0xc9, 0x85, 0xc4, 0xa3, 0xe1, + 0x9b, 0x9f, 0xe1, 0x9b, 0x84, 0xc7, 0xa6, 0x5a, + ], + asset_id: [ + 0x6e, 0x9c, 0x7f, 0x1a, 0x04, 0x56, 0x32, 0x4e, 0x21, 0x55, 0xab, 0x2b, 0x82, 0xd5, + 0x01, 0x11, 0x4a, 0x02, 0xc2, 0x93, 0x32, 0x96, 0x34, 0x29, 0x8e, 0x73, 0x8a, 0x62, + 0x62, 0x36, 0xb9, 0x9b, + ], + }, + TestVector { + key: [ + 0x42, 0x67, 0x81, 0x37, 0x2b, 0x07, 0xac, 0x22, 0x91, 0x58, 0x7f, 0x9f, 0x81, 0xb5, + 0x4f, 0x8b, 0x96, 0xb4, 0xc8, 0xdd, 0xf8, 0xcd, 0x5b, 0x0d, 0x7d, 0x21, 0xe7, 0xa7, + 0x46, 0xbb, 0x13, 0x3e, + ], + description: [ + 0xc2, 0xbd, 0x65, 0x3c, 0xe1, 0x9a, 0xb6, 0xe1, 0x9a, 0xa2, 0xc7, 0x9e, 0xe1, 0x9a, + 0xb5, 0x5f, 0xe1, 0x9b, 0x97, 0x65, 0xc2, 0xa4, 0xc8, 0xb9, 0xe1, 0x9a, 0xb8, 0xc7, + 0xbf, 0xc3, 0xb9, 0x52, 0x46, 0xc7, 0x9d, 0xc6, 0x9f, 0xe1, 0x9a, 0xbc, 0xc5, 0x9c, + 0xe2, 0xb1, 0xb1, 0xc6, 0x8b, 0xc2, 0xa3, 0xc4, 0xa8, 0xc8, 0x9e, 0xc6, 0xaa, 0xc3, + 0xa2, 0xc3, 0x84, 0xc3, 0x9d, 0xe1, 0x9b, 0x97, 0xc4, 0x81, 0xe2, 0xb1, 0xb0, 0xc5, + 0xb9, 0x29, 0xc9, 0x89, 0x60, 0xe1, 0x9a, 0xbd, 0x5c, 0xc4, 0xbe, 0xc4, 0xb4, 0xc7, + 0xa1, 0xc4, 0x93, 0xc4, 0x8c, 0xe1, 0x9a, 0xb9, 0xc2, 0xb0, 0xcd, 0xbd, 0xce, 0x8c, + 0xc7, 0x88, 0xc6, 0x8c, 0xc6, 0x93, 0xc5, 0xa8, 0xe2, 0xb1, 0xa4, 0xc6, 0x84, 0x39, + 0xc5, 0x81, 0x53, 0xc4, 0xa9, 0xc2, 0xa7, 0xc4, 0x8f, 0xe1, 0x9a, 0xba, 0xc4, 0xaf, + 0xe1, 0x9b, 0x9d, 0xc6, 0xbb, 0xc2, 0xbc, 0xc7, 0x95, 0xc6, 0xb0, 0xe1, 0x9b, 0x8f, + 0x42, 0xc2, 0xbe, 0xc6, 0xa7, 0xc8, 0xbc, 0xcd, 0xb7, 0xc8, 0xa7, 0xc8, 0x8b, 0xc8, + 0xb7, 0xc6, 0xa1, 0xc4, 0x87, 0xc7, 0xa7, 0xc3, 0xb5, 0xe2, 0xb1, 0xa1, 0xc2, 0xb2, + 0xe1, 0x9b, 0xa5, 0xc5, 0x87, 0xe1, 0x9a, 0xb3, 0xc7, 0xb3, 0x7a, 0xc6, 0x8b, 0xc4, + 0xbe, 0xc4, 0x8e, 0x56, 0x2d, 0xc9, 0x84, 0xc4, 0x84, 0xc7, 0xa3, 0xe2, 0xb1, 0xb6, + 0x5e, 0x46, 0xc3, 0x8f, 0xc7, 0x94, 0xc5, 0xa7, 0xc8, 0xa2, 0xc4, 0xa0, 0xc5, 0xa1, + 0xe1, 0x9b, 0xa4, 0xe1, 0x9b, 0x9f, 0xc3, 0x87, 0xc3, 0xb4, 0xc3, 0x81, 0xc4, 0x86, + 0xc7, 0xb7, 0xc4, 0xb3, 0xc2, 0xb5, 0xc6, 0x8c, 0xc8, 0xa0, 0xc4, 0x9c, 0xc7, 0x9e, + 0x30, 0xcd, 0xb4, 0xc3, 0xb7, 0xe1, 0x9a, 0xb1, 0xe1, 0x9b, 0x86, 0xc5, 0xab, 0xc6, + 0xa3, 0xc3, 0x9c, 0xc7, 0xbe, 0xc3, 0xbf, 0xc2, 0xa1, 0xe1, 0x9b, 0x89, 0xe1, 0x9a, + 0xb8, 0xc6, 0xb7, 0xc6, 0x85, 0xc8, 0x93, 0xc3, 0x9f, 0xc7, 0xbe, 0x2e, 0xce, 0x88, + 0xc9, 0x86, 0xe2, 0xb1, 0xa6, 0xc3, 0x94, 0x58, 0xc5, 0x84, 0xc4, 0xa1, 0x7d, 0xc7, + 0x92, 0xe1, 0x9b, 0x81, 0xc7, 0xbc, 0xe1, 0x9b, 0x9d, 0xc4, 0xb8, 0xe1, 0x9a, 0xa9, + 0xe1, 0x9a, 0xa1, 0xc3, 0x8d, 0xc6, 0xb6, 0x51, 0xc4, 0xbc, 0xc5, 0x91, 0xe1, 0x9a, + 0xb4, 0xc9, 0x8d, 0xe1, 0x9a, 0xaf, 0xc9, 0x84, 0xc7, 0xb7, 0xc6, 0x96, 0x38, 0xc3, + 0x89, 0xc6, 0xa6, 0xe1, 0x9b, 0x98, 0xc3, 0x83, 0xc3, 0x99, 0xc6, 0x99, 0xe2, 0xb1, + 0xa1, 0xcd, 0xbd, 0xc3, 0x8d, 0xc9, 0x8f, 0x3a, 0xc4, 0x81, 0xe1, 0x9a, 0xac, 0x4b, + 0xc6, 0x94, 0xc6, 0x9c, 0xe2, 0xb1, 0xaf, 0xe1, 0x9a, 0xb8, 0xc8, 0xb1, 0x6f, 0x70, + 0xc3, 0xae, 0xe1, 0x9b, 0x8a, 0xc7, 0xab, 0xc5, 0xad, 0x57, 0xc3, 0xb2, 0x55, 0xc6, + 0xb1, 0xc6, 0x84, 0xc3, 0xa4, 0x61, 0xc8, 0x9e, 0xc2, 0xb6, 0xc7, 0x8f, 0xc8, 0x95, + 0x30, 0x29, 0xe1, 0x9a, 0xb8, 0xc6, 0xa5, 0xc8, 0x97, 0xc7, 0xa9, 0xc9, 0x8d, 0xc8, + 0xa3, 0xc8, 0x98, 0xc2, 0xb4, 0xc7, 0x8d, 0xc7, 0x8b, 0xc7, 0xbc, 0xe2, 0xb1, 0xbf, + 0xc2, 0xa1, 0x2b, 0xe1, 0x9a, 0xac, 0xc2, 0xb4, 0xc4, 0xa6, 0xc2, 0xa5, 0x6e, 0xc5, + 0xa5, 0xe1, 0x9b, 0x8f, 0x2d, 0xe1, 0x9a, 0xae, 0x2c, 0x61, 0xe1, 0x9b, 0xb0, 0xc7, + 0x84, 0xc4, 0x8e, 0x44, 0xc7, 0xb0, 0xce, 0x86, 0xc6, 0x97, 0xc4, 0xa6, 0xc3, 0x94, + 0xc6, 0xbb, 0x2e, 0xc5, 0x95, 0xc4, 0x86, 0xc8, 0x8f, 0xc7, 0x94, 0xc9, 0x8b, 0x7b, + 0xc4, 0x9c, 0xc5, 0xb2, 0xc5, 0x8a, 0xc5, 0x8d, 0x4a, 0xe1, 0x9a, 0xbe, 0xc8, 0x90, + 0xc8, 0x9f, 0x70, 0xe1, 0x9b, 0x93, 0xc7, 0xbe, + ], + asset_id: [ + 0x54, 0xf5, 0xc9, 0x10, 0x86, 0xc5, 0x19, 0xcf, 0x5a, 0xa9, 0xc7, 0x4f, 0x07, 0x7c, + 0x07, 0xbc, 0xf7, 0xd7, 0x24, 0x35, 0x20, 0xe1, 0x4d, 0x2e, 0x27, 0x12, 0x79, 0x7c, + 0x74, 0xd2, 0x0e, 0x22, + ], + }, + TestVector { + key: [ + 0x76, 0xf4, 0x9c, 0xf8, 0xa3, 0x19, 0x21, 0x85, 0x61, 0x6a, 0x9a, 0x0d, 0xa0, 0xc7, + 0x6e, 0xc2, 0xc2, 0x75, 0x61, 0x59, 0xbc, 0xe1, 0x86, 0xa1, 0x86, 0x2b, 0x6e, 0x6e, + 0x59, 0x44, 0x2d, 0x11, + ], + description: [ + 0xc4, 0xaa, 0xe1, 0x9a, 0xb7, 0xc3, 0x99, 0xc6, 0x90, 0xc6, 0x96, 0xc3, 0x9b, 0x54, + 0xc9, 0x8c, 0xc8, 0x91, 0xc7, 0xba, 0xc2, 0xb9, 0xc7, 0x9b, 0xe2, 0xb1, 0xa8, 0xc3, + 0xa5, 0xc3, 0x87, 0xc9, 0x80, 0xc7, 0xbe, 0xe1, 0x9b, 0x97, 0xc5, 0x92, 0xc7, 0xa5, + 0xc8, 0x8e, 0xc7, 0x97, 0xe2, 0xb1, 0xb9, 0x49, 0xc8, 0xb4, 0xc7, 0xa8, 0x5e, 0xc5, + 0x8d, 0x5d, 0xc8, 0xbb, 0xce, 0x86, 0x29, 0xe2, 0xb1, 0xa3, 0xe1, 0x9b, 0x91, 0xc3, + 0x94, 0x46, 0xc8, 0x9a, 0xce, 0x84, 0xc7, 0x96, 0xe2, 0xb1, 0xb8, 0xc8, 0xa7, 0xc8, + 0xbb, 0xe2, 0xb1, 0xac, 0xe2, 0xb1, 0xbf, 0xc5, 0x80, 0xc2, 0xae, 0xc3, 0x85, 0xc6, + 0xaf, 0xc8, 0xbe, 0xc6, 0xb9, 0xe2, 0xb1, 0xb4, 0x66, 0xe1, 0x9a, 0xa1, 0x36, 0xc5, + 0x95, 0xc3, 0xb5, 0xe2, 0xb1, 0xbe, 0xc7, 0x89, 0xe1, 0x9a, 0xa5, 0xc7, 0xa0, 0x34, + 0xc9, 0x87, 0xe2, 0xb1, 0xac, 0xe2, 0xb1, 0xa9, 0xc7, 0x99, 0xc3, 0xa4, 0xe1, 0x9b, + 0x89, 0xc3, 0x9e, 0xc9, 0x89, 0xc3, 0xa5, 0xc3, 0xb1, 0xc3, 0x9e, 0xe2, 0xb1, 0xb4, + 0xc8, 0x87, 0x69, 0xc8, 0x81, 0xc3, 0x81, 0xc8, 0x9c, 0xc7, 0x80, 0xe1, 0x9b, 0x9a, + 0xe1, 0x9b, 0xa4, 0x49, 0xc7, 0x97, 0x6e, 0x6f, 0xe1, 0x9b, 0x80, 0xc7, 0xa5, 0x5d, + 0x3d, 0xc3, 0xab, 0xc5, 0x88, 0xc3, 0x8c, 0xe2, 0xb1, 0xb5, 0xc4, 0xa2, 0xe2, 0xb1, + 0xa7, 0xe1, 0x9b, 0xad, 0xc6, 0xb0, 0xe1, 0x9b, 0x8f, 0xc6, 0x97, 0xe2, 0xb1, 0xb8, + 0xc2, 0xa9, 0xc7, 0xb0, 0xe2, 0xb1, 0xbd, 0x65, 0xc3, 0xb3, 0xe2, 0xb1, 0xaa, 0xc6, + 0xb3, 0xc5, 0x96, 0xc5, 0xbd, 0xe2, 0xb1, 0xb6, 0xe2, 0xb1, 0xb5, 0xe1, 0x9a, 0xb2, + 0xc5, 0xb5, 0x61, 0x28, 0x58, 0xc5, 0x80, 0x74, 0x5b, 0xc8, 0xa8, 0xe2, 0xb1, 0xb7, + 0x30, 0x6a, 0xc3, 0xaa, 0xe1, 0x9b, 0x9e, 0xc8, 0x9b, 0x33, 0x54, 0xc6, 0xad, 0xc6, + 0x99, 0xc4, 0x9b, 0xc7, 0x87, 0xe1, 0x9b, 0xb0, 0xc7, 0x9a, 0xc7, 0x99, 0xc6, 0xa4, + 0xc6, 0xb8, 0xe2, 0xb1, 0xb7, 0xc7, 0x93, 0x60, 0xe1, 0x9b, 0x9e, 0xc7, 0x98, 0xc8, + 0xa8, 0xce, 0x86, 0xe1, 0x9a, 0xb2, 0xc6, 0xaf, 0xc3, 0xb7, 0xc3, 0x81, 0xc7, 0x89, + 0xc7, 0x93, 0x25, 0xc7, 0xaf, 0xc4, 0x9c, 0xe2, 0xb1, 0xba, 0xe1, 0x9b, 0x90, 0xe1, + 0x9b, 0xa8, 0xc7, 0xbe, 0xc3, 0xb9, 0xc7, 0xb4, 0xc5, 0xb1, 0xe2, 0xb1, 0xa3, 0xcd, + 0xb6, 0xc5, 0x8d, 0x76, 0xc5, 0xb9, 0xe2, 0xb1, 0xae, 0x4e, 0x36, 0xc8, 0xa1, 0x50, + 0xc6, 0x95, 0xc4, 0x84, 0xc8, 0x94, 0xe1, 0x9b, 0x9f, 0xc8, 0x9e, 0xc7, 0x85, 0xcd, + 0xb0, 0xc4, 0xb3, 0x58, 0xc6, 0x98, 0xc4, 0xb0, 0xc8, 0x99, 0xe2, 0xb1, 0xb6, 0xc5, + 0xa4, 0xc6, 0x84, 0xc6, 0xbd, 0xc6, 0x96, 0xe2, 0xb1, 0xb7, 0xc5, 0xb7, 0xc6, 0xaa, + 0xc8, 0x85, 0x70, 0xc7, 0xbe, 0xc4, 0xb4, 0xe1, 0x9a, 0xba, 0x30, 0xc8, 0xae, 0xe2, + 0xb1, 0xb3, 0x32, 0xc3, 0x89, 0xe2, 0xb1, 0xa1, 0xc3, 0x90, 0xc5, 0xba, 0xe1, 0x9b, + 0xa2, 0xc3, 0xb3, 0xe1, 0x9b, 0xa8, 0xce, 0x86, 0xc6, 0xb2, 0x29, 0x5e, 0xc8, 0xb7, + 0xc5, 0x8a, 0xc3, 0xa1, 0xc7, 0xac, 0xc5, 0x96, 0xc3, 0x8c, 0xc2, 0xaa, 0xc6, 0xb0, + 0xc8, 0x84, 0x5d, 0xc8, 0x8a, 0xc2, 0xaf, 0xc5, 0x90, 0x51, 0xe1, 0x9b, 0xa3, 0xc7, + 0x92, 0xc3, 0x9a, 0xc8, 0x81, 0xc8, 0xa5, 0x61, 0xc8, 0x95, 0xc7, 0x96, 0xe2, 0xb1, + 0xa3, 0xc8, 0xb5, 0xe1, 0x9a, 0xa6, 0xc4, 0xb1, 0xe1, 0x9b, 0xac, 0xc7, 0xaf, 0x2b, + 0xe1, 0x9b, 0x8b, 0xc4, 0xa0, 0xc7, 0xa1, 0xc7, 0xb6, 0xc6, 0x81, 0xc3, 0xb5, 0xe2, + 0xb1, 0xb4, 0xc2, 0xa1, 0xe2, 0xb1, 0xb2, 0x5a, + ], + asset_id: [ + 0x9d, 0xf4, 0x24, 0x6f, 0x24, 0x26, 0xa5, 0xd4, 0x87, 0xb1, 0xc9, 0x7d, 0x71, 0x92, + 0xf6, 0x90, 0x79, 0x85, 0x5d, 0x30, 0x08, 0xde, 0x89, 0x7b, 0xf0, 0x57, 0x06, 0xb4, + 0x5b, 0xe3, 0xe3, 0xae, + ], + }, + ] +} diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index 9501a79b1..f1c6126cc 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -2192,9 +2192,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x09, 0xee, 0x7e, 0xf6, 0x3a, 0xb1, 0xcf, 0x24, 0x2b, 0xaa, 0x76, 0xfc, 0xbf, 0xfb, - 0xe5, 0x75, 0x5f, 0x13, 0x14, 0x2b, 0x38, 0xb1, 0xa0, 0x40, 0x4d, 0x7d, 0x5a, 0x3f, - 0x4f, 0x22, 0x1e, 0x96, + 0xba, 0x69, 0x9c, 0xe4, 0x21, 0x41, 0x85, 0x30, 0x94, 0xe2, 0x84, 0x00, 0x50, 0x17, + 0x2c, 0x3b, 0x94, 0x21, 0x3e, 0x86, 0x47, 0x3b, 0x5e, 0x2f, 0xdd, 0x70, 0x97, 0x80, + 0xbc, 0xca, 0x68, 0xb4, ], rho: [ 0xf6, 0x5d, 0x22, 0x96, 0x09, 0x58, 0xd7, 0x28, 0x59, 0x60, 0x9c, 0x99, 0x46, 0xd8, @@ -2314,9 +2314,9 @@ pub(crate) fn test_vectors() -> Vec { 0xfe, 0x3f, 0xbb, 0x0a, 0x4e, 0x48, ], ock: [ - 0x17, 0xeb, 0xb4, 0x82, 0xdf, 0x8d, 0x13, 0xc2, 0x0d, 0x9b, 0x4a, 0x03, 0x9f, 0x40, - 0x5a, 0x93, 0x69, 0x8a, 0xc2, 0x24, 0xf3, 0xea, 0x03, 0xfb, 0x55, 0x8d, 0x5b, 0x53, - 0x11, 0x46, 0xfb, 0xea, + 0xc6, 0x7c, 0x23, 0x33, 0xc3, 0xcf, 0x4a, 0xc4, 0x6e, 0xde, 0x34, 0xe3, 0xe3, 0xe0, + 0xdb, 0xff, 0x1e, 0x96, 0xb7, 0xa7, 0x8f, 0x16, 0xaa, 0xef, 0x1c, 0x74, 0xa3, 0xef, + 0x07, 0xc5, 0x97, 0x16, ], op: [ 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, @@ -2326,12 +2326,12 @@ pub(crate) fn test_vectors() -> Vec { 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, ], c_out: [ - 0x2d, 0x76, 0x57, 0x79, 0x67, 0x44, 0x5f, 0xb9, 0x17, 0xee, 0x72, 0xd3, 0x2d, 0x4b, - 0x75, 0x3b, 0x25, 0x10, 0xd8, 0x05, 0x5d, 0xec, 0x8b, 0xf1, 0x22, 0x0a, 0x75, 0xf0, - 0x65, 0xbd, 0x47, 0xe2, 0xcc, 0xb6, 0x03, 0x98, 0x84, 0x50, 0x23, 0x1b, 0xd3, 0x1c, - 0x15, 0x6f, 0xf2, 0xa7, 0x2a, 0xfd, 0x4a, 0x96, 0x0b, 0x6f, 0x6a, 0x78, 0x84, 0x65, - 0x13, 0x51, 0xe2, 0x4b, 0x47, 0x02, 0x87, 0xd5, 0x83, 0xba, 0x69, 0x71, 0x18, 0xec, - 0x07, 0xf6, 0x59, 0x2c, 0x4c, 0xd7, 0xcd, 0x6a, 0xc7, 0x7e, + 0xe4, 0xba, 0x0e, 0xa2, 0x92, 0x3b, 0x40, 0x19, 0xac, 0x8a, 0xbc, 0xd1, 0x9b, 0xe6, + 0x1c, 0x90, 0xf1, 0x8e, 0xef, 0xae, 0x87, 0xc4, 0xed, 0x8c, 0x76, 0x70, 0x85, 0xba, + 0xa8, 0x3b, 0x4d, 0x61, 0x0c, 0xf3, 0x63, 0x70, 0xda, 0x07, 0x90, 0x1e, 0xad, 0x6d, + 0x4f, 0x4b, 0x71, 0xdc, 0xae, 0x31, 0x1f, 0xa0, 0x36, 0x40, 0x6d, 0x64, 0x7b, 0x7e, + 0xe1, 0x41, 0x1e, 0xf5, 0xae, 0xe0, 0x34, 0x68, 0xb1, 0x09, 0x13, 0xc9, 0x90, 0xcb, + 0x61, 0x61, 0x22, 0xeb, 0xbe, 0x49, 0xda, 0x67, 0x81, 0xc2, ], asset: Some([ 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, @@ -2406,9 +2406,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x54, 0xb6, 0x99, 0x64, 0x13, 0x6b, 0x63, 0xd1, 0x7d, 0x62, 0x44, 0x1a, 0x69, 0x37, - 0x13, 0x9d, 0x2c, 0xe1, 0x4b, 0xb5, 0x5c, 0x42, 0x07, 0xfe, 0x74, 0xd7, 0x70, 0x83, - 0x53, 0x51, 0x5b, 0xa8, + 0x0a, 0x1f, 0x28, 0x15, 0xb7, 0xaf, 0xe2, 0x19, 0x06, 0x87, 0x15, 0xfc, 0x76, 0x6b, + 0x87, 0x2e, 0xf2, 0x17, 0x35, 0x43, 0xac, 0x81, 0x4c, 0x32, 0xb4, 0xb6, 0x9c, 0x9c, + 0x34, 0x5e, 0x46, 0x98, ], rho: [ 0x27, 0x3c, 0x68, 0xd1, 0x9c, 0xda, 0xa8, 0x62, 0x8b, 0xac, 0x37, 0xa2, 0xd4, 0x2c, @@ -2528,9 +2528,9 @@ pub(crate) fn test_vectors() -> Vec { 0x49, 0xaa, 0x90, 0xe6, 0x02, 0xc8, ], ock: [ - 0x59, 0xf9, 0xcc, 0x26, 0x38, 0x4c, 0x6f, 0x73, 0xce, 0xa9, 0xb9, 0xe0, 0x94, 0x40, - 0xf8, 0xf0, 0x4c, 0x40, 0x25, 0xb5, 0x59, 0x04, 0x42, 0x3c, 0x35, 0x39, 0xc6, 0x6c, - 0x75, 0x11, 0x31, 0x23, + 0x2f, 0x88, 0x37, 0x27, 0xb5, 0x4d, 0x06, 0x25, 0xcf, 0xdc, 0x19, 0x5a, 0xce, 0x10, + 0xca, 0xc0, 0x26, 0x8a, 0xba, 0x3d, 0xe2, 0x8a, 0xd6, 0x08, 0x88, 0x06, 0x50, 0x6d, + 0x69, 0xc4, 0xdd, 0x8e, ], op: [ 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, @@ -2540,12 +2540,12 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, ], c_out: [ - 0x21, 0xe3, 0xf8, 0x97, 0xe1, 0xb1, 0x36, 0xe1, 0x74, 0xd7, 0xae, 0x88, 0xd7, 0x85, - 0xa0, 0x61, 0xe6, 0x71, 0xef, 0xf1, 0x81, 0x98, 0x0a, 0x6f, 0xf5, 0x19, 0xb3, 0xbb, - 0x6b, 0xbd, 0xaf, 0xea, 0x9d, 0xf9, 0x92, 0xbc, 0xaa, 0xc0, 0x2b, 0xdb, 0xcd, 0x4d, - 0xb1, 0xc1, 0xd3, 0xf3, 0x2d, 0xef, 0xcd, 0xf7, 0xf4, 0xad, 0x54, 0x1b, 0x6b, 0xee, - 0xe8, 0x27, 0xdd, 0x43, 0x89, 0xb8, 0x57, 0xd1, 0x6d, 0xb8, 0x24, 0xe7, 0x72, 0xba, - 0x5a, 0xb5, 0xe2, 0x8d, 0xd6, 0xe9, 0x80, 0x82, 0x6b, 0xed, + 0x99, 0x96, 0x90, 0xd4, 0xcd, 0xd9, 0xe7, 0x6b, 0x07, 0x2c, 0x3c, 0x4c, 0x41, 0xbf, + 0xc7, 0x9a, 0xaa, 0xc6, 0x7f, 0xdc, 0x0f, 0x41, 0xe8, 0x0e, 0x95, 0x48, 0x80, 0x0e, + 0xef, 0xbc, 0x95, 0x74, 0xf1, 0x5d, 0x64, 0xa6, 0x9e, 0x44, 0x47, 0xc4, 0x5b, 0x07, + 0x0c, 0x6c, 0x9f, 0x50, 0x0a, 0xdd, 0xef, 0x6f, 0x57, 0x14, 0xa5, 0x76, 0x22, 0x1f, + 0x3f, 0xbc, 0x61, 0x22, 0x8d, 0x95, 0xc3, 0xac, 0xe4, 0x21, 0x4b, 0xb6, 0xcf, 0x5b, + 0xd9, 0x69, 0x84, 0xd7, 0x78, 0x96, 0x0d, 0xe9, 0x0c, 0x02, ], asset: Some([ 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, @@ -2620,9 +2620,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x10, 0xb2, 0x33, 0xd2, 0x49, 0x94, 0x68, 0xe0, 0xb0, 0xdf, 0x47, 0x3d, 0x5a, 0x21, - 0xb9, 0x3f, 0x7d, 0x2b, 0x5d, 0x5f, 0x09, 0x95, 0xa9, 0x55, 0xd0, 0x86, 0x8a, 0x27, - 0x45, 0x3f, 0x96, 0x82, + 0xde, 0x2b, 0xfc, 0x89, 0x5b, 0xa8, 0xb5, 0x43, 0x03, 0x93, 0x43, 0x4e, 0x20, 0x92, + 0xce, 0xe7, 0x81, 0xe4, 0x00, 0x28, 0x5c, 0xc6, 0x66, 0xbc, 0x6c, 0x41, 0x89, 0xdb, + 0x2d, 0xda, 0x71, 0x92, ], rho: [ 0xea, 0x1d, 0x9d, 0x26, 0x5e, 0xf4, 0x8a, 0x18, 0x97, 0x89, 0x70, 0xb1, 0x76, 0x7b, @@ -2742,9 +2742,9 @@ pub(crate) fn test_vectors() -> Vec { 0xf1, 0xd7, 0xd3, 0x95, 0x8a, 0x54, ], ock: [ - 0xdb, 0x1e, 0xf1, 0x9a, 0xf6, 0xdd, 0x1b, 0x7b, 0xf0, 0x64, 0x89, 0xe7, 0xdb, 0x86, - 0xca, 0xae, 0x27, 0xf6, 0x70, 0x1e, 0x09, 0x16, 0x8c, 0x6e, 0x0d, 0x2b, 0x89, 0x78, - 0xdf, 0x14, 0xe0, 0x96, + 0x9c, 0xba, 0xd2, 0xf3, 0x8b, 0xf8, 0x8f, 0x39, 0x47, 0xce, 0xf6, 0x4d, 0xe7, 0xa6, + 0xf4, 0x3e, 0x4c, 0xbb, 0x41, 0xe6, 0xe0, 0x37, 0xf1, 0x42, 0x01, 0xae, 0xe8, 0xab, + 0xfd, 0xf8, 0xa2, 0x35, ], op: [ 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, @@ -2754,12 +2754,12 @@ pub(crate) fn test_vectors() -> Vec { 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, ], c_out: [ - 0x55, 0xdd, 0xba, 0xc4, 0x35, 0x64, 0x19, 0x54, 0xbd, 0xb1, 0xc9, 0x43, 0x4c, 0x36, - 0x79, 0x32, 0x19, 0x18, 0xbc, 0x1f, 0x29, 0x90, 0x7a, 0xc4, 0x24, 0x43, 0x55, 0x2d, - 0xfb, 0xe7, 0x05, 0xab, 0x26, 0x19, 0x1b, 0x4e, 0x2b, 0xae, 0xa4, 0xaa, 0xe0, 0x6d, - 0xa9, 0xf1, 0x38, 0x4e, 0x23, 0x7b, 0xee, 0xab, 0xb1, 0xa2, 0xd8, 0x22, 0x99, 0x5e, - 0xe7, 0xb9, 0x41, 0x0d, 0x6b, 0xe7, 0x59, 0x2a, 0xed, 0xa9, 0xf5, 0x2d, 0x56, 0xd8, - 0xc9, 0xf9, 0x3a, 0x0b, 0xe3, 0x8c, 0xfc, 0x8d, 0xc2, 0x94, + 0xf6, 0x25, 0xcd, 0x3d, 0x19, 0x97, 0xb0, 0xd3, 0xf2, 0x29, 0x5a, 0xac, 0xc0, 0x3a, + 0xe0, 0xc9, 0x47, 0x28, 0xb3, 0x3c, 0xc4, 0xf1, 0x6f, 0xd4, 0x28, 0xd6, 0x5f, 0x3c, + 0x78, 0x5e, 0x8c, 0x0b, 0xb4, 0x66, 0xc1, 0x33, 0xd4, 0x83, 0xdf, 0xc5, 0xb1, 0xb3, + 0x15, 0x1d, 0xa2, 0xd5, 0xf2, 0x4a, 0x2b, 0x32, 0x0d, 0x8e, 0x9c, 0xd3, 0x41, 0x5c, + 0x25, 0xb6, 0xf9, 0x76, 0x1f, 0x42, 0x70, 0x04, 0xce, 0xe5, 0x4f, 0x75, 0xf1, 0x25, + 0xbc, 0x50, 0x5e, 0xf6, 0x26, 0xef, 0xc9, 0xdd, 0x63, 0x66, ], asset: Some([ 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, @@ -2834,9 +2834,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x7e, 0xfd, 0xf4, 0x17, 0xcf, 0xd6, 0x44, 0x7d, 0x96, 0x58, 0x1d, 0xd1, 0x7b, 0x82, - 0x12, 0xee, 0x53, 0x7b, 0x13, 0x4b, 0x05, 0xa5, 0x58, 0x67, 0x4a, 0x39, 0xe6, 0x66, - 0x97, 0xe6, 0x3a, 0x29, + 0x45, 0x37, 0x85, 0x3e, 0x18, 0xac, 0x2c, 0xe9, 0x37, 0x79, 0x8c, 0x9b, 0xce, 0xa9, + 0x80, 0x2d, 0x65, 0x00, 0x74, 0xdb, 0xd7, 0xe0, 0x6a, 0x48, 0x98, 0x03, 0x15, 0x30, + 0x78, 0xe9, 0x97, 0x0b, ], rho: [ 0x9a, 0xd0, 0x7f, 0x1c, 0x28, 0x7b, 0xdd, 0x53, 0x4f, 0x6f, 0x7e, 0xae, 0x08, 0xf7, @@ -2956,9 +2956,9 @@ pub(crate) fn test_vectors() -> Vec { 0xcc, 0x22, 0xca, 0x1d, 0x09, 0xd5, ], ock: [ - 0xcf, 0x22, 0xd2, 0x83, 0x95, 0x98, 0x5d, 0x31, 0x6a, 0xf9, 0x50, 0x19, 0x21, 0xba, - 0xc1, 0x52, 0x57, 0x11, 0xbb, 0x3f, 0x3c, 0xc3, 0xc3, 0xc2, 0x82, 0xa3, 0xd1, 0x8e, - 0x43, 0xd4, 0x78, 0x05, + 0x97, 0x9b, 0x31, 0x5d, 0x3e, 0x1f, 0x5c, 0xa1, 0x8a, 0x92, 0x86, 0xd9, 0x2c, 0xc8, + 0x8e, 0x63, 0x62, 0x4b, 0x39, 0x9b, 0x29, 0x19, 0xbf, 0x4e, 0x67, 0xda, 0x7c, 0xd3, + 0x94, 0xf4, 0x5c, 0x49, ], op: [ 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, @@ -2968,12 +2968,12 @@ pub(crate) fn test_vectors() -> Vec { 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, ], c_out: [ - 0x7a, 0xe6, 0x91, 0xd9, 0xbc, 0xd5, 0x38, 0x42, 0x7b, 0x4f, 0x07, 0xe2, 0x38, 0x81, - 0x94, 0x18, 0xbb, 0xb8, 0x18, 0x31, 0x88, 0x89, 0x93, 0x08, 0xfd, 0x6a, 0xab, 0x2b, - 0xf4, 0xf0, 0x69, 0x9c, 0xc5, 0x61, 0x9c, 0x8d, 0x4f, 0xc9, 0x95, 0xc2, 0x11, 0x76, - 0xbf, 0xea, 0x13, 0xee, 0x04, 0x03, 0xc0, 0xce, 0x57, 0x4f, 0xc8, 0xfa, 0x16, 0x81, - 0xb3, 0x76, 0xcf, 0x33, 0xc9, 0xff, 0x27, 0xa5, 0xaa, 0x01, 0x58, 0x24, 0xe6, 0x78, - 0x6e, 0x16, 0xe3, 0x7b, 0x35, 0x5c, 0xf7, 0x54, 0x52, 0xdb, + 0x83, 0xf7, 0xa1, 0xda, 0x72, 0x4d, 0xd1, 0x54, 0xe7, 0xd9, 0x47, 0xc0, 0xfc, 0x83, + 0x42, 0x87, 0xf3, 0x3c, 0xd4, 0xb3, 0x4a, 0xfa, 0xc0, 0xda, 0x55, 0xe4, 0x37, 0xaf, + 0xae, 0x67, 0xa9, 0x9c, 0xbd, 0x89, 0x75, 0xc9, 0x54, 0xcf, 0x41, 0xaa, 0x1e, 0x9a, + 0x8f, 0x99, 0x98, 0x3d, 0x58, 0x6f, 0x5e, 0x35, 0x37, 0xda, 0xb7, 0x2a, 0xe1, 0x82, + 0x7a, 0xa5, 0xdf, 0xc9, 0xdd, 0xad, 0x06, 0x26, 0x78, 0x84, 0x6f, 0xf8, 0x09, 0x3d, + 0xfd, 0x15, 0xf6, 0x3d, 0x47, 0xe5, 0xa3, 0xbb, 0x74, 0x39, ], asset: Some([ 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, @@ -3048,9 +3048,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0xf5, 0xc1, 0xcf, 0xbc, 0xb9, 0x2d, 0x34, 0xe4, 0x66, 0x1d, 0x58, 0x25, 0x42, 0xf7, - 0x0d, 0x05, 0x99, 0x09, 0x15, 0x20, 0xfe, 0x2a, 0xfa, 0xd8, 0xe8, 0x75, 0xca, 0x3b, - 0xcc, 0x70, 0x8a, 0x11, + 0x71, 0x00, 0xa7, 0x52, 0x93, 0xf4, 0xae, 0xfd, 0x89, 0xa1, 0x66, 0xa5, 0xf8, 0x4d, + 0x34, 0xda, 0xf4, 0xe5, 0x98, 0x34, 0xcd, 0x65, 0xd7, 0x9f, 0xfc, 0x41, 0xdd, 0xf0, + 0x68, 0x2d, 0xc2, 0xab, ], rho: [ 0x31, 0x70, 0x5e, 0xfb, 0xf8, 0x0c, 0x7a, 0x7a, 0xb7, 0x81, 0xdf, 0x53, 0x77, 0xf8, @@ -3170,9 +3170,9 @@ pub(crate) fn test_vectors() -> Vec { 0xcc, 0x53, 0x03, 0xc5, 0xf3, 0xf0, ], ock: [ - 0xe3, 0xf2, 0x74, 0x2e, 0xa1, 0x97, 0x55, 0xa7, 0x99, 0x73, 0x1a, 0xcf, 0xe9, 0x98, - 0x86, 0xfb, 0x9f, 0xbb, 0x80, 0x48, 0xb5, 0x3a, 0x77, 0x72, 0xa2, 0x80, 0xd8, 0x17, - 0x19, 0xff, 0xfd, 0x28, + 0x55, 0x0e, 0xbf, 0x98, 0x83, 0x6c, 0xce, 0x43, 0x52, 0x25, 0xa1, 0x4b, 0xa6, 0x52, + 0xa7, 0xd5, 0x58, 0xcf, 0x5f, 0x3f, 0x7a, 0xfb, 0x00, 0xb0, 0x24, 0x70, 0xe8, 0xe4, + 0xd2, 0x6d, 0xb7, 0x9c, ], op: [ 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, @@ -3182,12 +3182,12 @@ pub(crate) fn test_vectors() -> Vec { 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, ], c_out: [ - 0x92, 0xe7, 0x7c, 0x9b, 0x69, 0x92, 0xee, 0x85, 0x06, 0x30, 0x6a, 0x96, 0xc8, 0xa5, - 0x1c, 0xc9, 0xa8, 0x96, 0x18, 0xc6, 0x36, 0x6f, 0xce, 0x78, 0xb2, 0x9a, 0xdb, 0x10, - 0x9b, 0x4a, 0x3b, 0x17, 0x48, 0x49, 0x13, 0x4f, 0x7a, 0xa2, 0x9c, 0x79, 0x1b, 0x91, - 0x5f, 0xd7, 0x5a, 0x6f, 0xfc, 0x57, 0x42, 0x78, 0xef, 0x50, 0x2b, 0x84, 0x02, 0x46, - 0x9a, 0xb5, 0xa7, 0xce, 0x77, 0x2b, 0x52, 0x2c, 0x4b, 0xaa, 0x12, 0x95, 0xd8, 0x8f, - 0x15, 0xdc, 0x75, 0x1d, 0xdf, 0x7d, 0x20, 0x8d, 0xd5, 0x17, + 0x9a, 0x01, 0xb7, 0x5e, 0x27, 0xea, 0x97, 0x51, 0x45, 0x5d, 0x54, 0xf2, 0xa5, 0x2b, + 0x88, 0x4b, 0x45, 0x6a, 0x6f, 0xc3, 0xda, 0xdb, 0xec, 0x79, 0xbf, 0x4d, 0x10, 0xbe, + 0x06, 0x7b, 0xef, 0x3e, 0xa2, 0xa5, 0xc0, 0x59, 0x81, 0xd4, 0x06, 0x05, 0x6a, 0x2f, + 0xf6, 0x4c, 0xb4, 0xc6, 0xfd, 0x46, 0x7d, 0xa8, 0x0b, 0xa1, 0x17, 0x48, 0xe9, 0xe2, + 0xae, 0x07, 0xb7, 0x62, 0xdf, 0x9d, 0x4a, 0x23, 0x58, 0x77, 0xf5, 0x8f, 0x43, 0x24, + 0xd8, 0x00, 0x3c, 0x32, 0x4f, 0xd9, 0xc6, 0x39, 0xbc, 0xa6, ], asset: Some([ 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, @@ -3262,9 +3262,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x65, 0x73, 0x3c, 0x9d, 0x97, 0xea, 0x82, 0xf6, 0xde, 0xf3, 0xde, 0x1f, 0xe8, 0x7e, - 0x12, 0x37, 0x6a, 0x92, 0x49, 0xdc, 0x86, 0x14, 0x67, 0x2d, 0x5e, 0xda, 0x15, 0xf3, - 0xca, 0xf4, 0x5b, 0x8c, + 0x5d, 0xd1, 0x3d, 0xcf, 0x9a, 0xf3, 0x52, 0xf5, 0xfe, 0x0b, 0x2b, 0xcb, 0xd0, 0xdb, + 0xd7, 0xda, 0xfb, 0xbe, 0x53, 0xb0, 0xa9, 0x6b, 0x08, 0x1c, 0x90, 0xba, 0xde, 0xd9, + 0xbe, 0x4b, 0x4f, 0x87, ], rho: [ 0x56, 0xbc, 0x48, 0x21, 0xa5, 0x3d, 0x5e, 0x9e, 0x6d, 0x7a, 0x04, 0x44, 0x44, 0x45, @@ -3384,9 +3384,9 @@ pub(crate) fn test_vectors() -> Vec { 0x71, 0xb8, 0xaa, 0x9f, 0x69, 0xf0, ], ock: [ - 0x42, 0x46, 0x14, 0xa3, 0xb5, 0x79, 0x96, 0xef, 0xb1, 0x24, 0xb7, 0xf4, 0x50, 0xae, - 0x2a, 0xf7, 0xf6, 0xdc, 0x8c, 0x8c, 0xee, 0xa9, 0x4f, 0x17, 0x74, 0x77, 0x72, 0x1b, - 0x84, 0x61, 0x3b, 0x23, + 0x53, 0x29, 0x6e, 0xed, 0x43, 0xb4, 0xeb, 0x30, 0xa4, 0x3d, 0x88, 0x90, 0x2f, 0x74, + 0x04, 0x26, 0x62, 0x1d, 0x85, 0x21, 0x3a, 0x36, 0xc5, 0x20, 0xa1, 0x84, 0xa4, 0x3a, + 0xfb, 0xd4, 0x89, 0x6d, ], op: [ 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, @@ -3396,12 +3396,12 @@ pub(crate) fn test_vectors() -> Vec { 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, ], c_out: [ - 0x8b, 0x94, 0x8b, 0x33, 0xf5, 0x55, 0xcd, 0x45, 0x5f, 0xaa, 0x36, 0x51, 0x7b, 0x8e, - 0xab, 0x29, 0xe1, 0xa5, 0x1f, 0x6c, 0xec, 0x21, 0x79, 0xd9, 0xea, 0xe4, 0xea, 0xca, - 0x92, 0x50, 0xbb, 0x9b, 0x55, 0xe4, 0xb5, 0x49, 0x49, 0x15, 0xc1, 0xf0, 0x01, 0x65, - 0xf8, 0x9d, 0x7c, 0x02, 0xa0, 0x25, 0x45, 0xb9, 0xd5, 0x98, 0x08, 0x6e, 0xeb, 0x96, - 0x1e, 0x58, 0x7e, 0x43, 0xfd, 0xfc, 0x65, 0xfe, 0x52, 0xf1, 0xe0, 0xc6, 0xa0, 0x46, - 0x46, 0x48, 0xcd, 0x1f, 0xc8, 0x9e, 0x80, 0xbd, 0x78, 0x0f, + 0x38, 0xee, 0x14, 0xef, 0xb0, 0x63, 0x94, 0x64, 0x44, 0x6f, 0x5f, 0xb8, 0x79, 0x5d, + 0x23, 0xf8, 0x8c, 0xf5, 0x65, 0x37, 0xe6, 0x4e, 0x1a, 0x46, 0x63, 0x17, 0xb3, 0x6f, + 0x22, 0x2e, 0x00, 0x5b, 0x92, 0x4c, 0xc9, 0x10, 0xd6, 0x29, 0x06, 0x6e, 0x05, 0x07, + 0xcb, 0x91, 0x2b, 0x0b, 0xc1, 0xd3, 0x16, 0xc2, 0x00, 0xb1, 0xa9, 0x56, 0x49, 0xc0, + 0xc5, 0x30, 0xb4, 0xf3, 0xd0, 0x43, 0x06, 0x8e, 0xf6, 0xf4, 0x2d, 0xcb, 0xef, 0xd0, + 0x2a, 0x34, 0x80, 0xe3, 0x2a, 0xa4, 0x5e, 0x33, 0xce, 0x25, ], asset: Some([ 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, @@ -3476,9 +3476,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x81, 0xa8, 0xbb, 0x76, 0xf2, 0x62, 0x73, 0x62, 0x8b, 0x9f, 0x9b, 0x66, 0x04, 0x94, - 0xb3, 0x45, 0xb7, 0x9d, 0x45, 0x16, 0x3c, 0x7b, 0x4c, 0xc5, 0x5a, 0x49, 0xff, 0x3f, - 0xc6, 0xb8, 0x1d, 0xaa, + 0x43, 0x94, 0x47, 0xab, 0x14, 0x5a, 0x6f, 0x0e, 0x5a, 0x3b, 0x43, 0x63, 0x04, 0x4c, + 0x73, 0x07, 0x93, 0xf4, 0x36, 0x33, 0x1f, 0xfe, 0x66, 0x30, 0xc7, 0xca, 0x2d, 0x9b, + 0x23, 0x2a, 0xe1, 0x98, ], rho: [ 0xd6, 0xff, 0xc4, 0x74, 0x88, 0xad, 0x05, 0x93, 0x89, 0x70, 0xc4, 0xb1, 0x56, 0xd0, @@ -3598,9 +3598,9 @@ pub(crate) fn test_vectors() -> Vec { 0xd8, 0x2e, 0x93, 0x3c, 0x89, 0xe1, ], ock: [ - 0x71, 0x5c, 0x9a, 0x01, 0x87, 0xab, 0x90, 0xb2, 0x4d, 0x3c, 0xbb, 0xa3, 0xf1, 0xab, - 0x30, 0x67, 0xc5, 0x63, 0x06, 0x04, 0x48, 0xc0, 0x0e, 0xf2, 0x74, 0xb7, 0xea, 0x66, - 0x11, 0x13, 0x0d, 0x26, + 0x2a, 0x2e, 0x0d, 0x99, 0x69, 0xf0, 0x2e, 0xbd, 0xb6, 0xd9, 0xc8, 0xe7, 0xe6, 0xfd, + 0xde, 0x20, 0x85, 0x12, 0x4b, 0x19, 0xad, 0x70, 0x90, 0xcc, 0x26, 0x15, 0x1d, 0x4d, + 0xa4, 0x2a, 0x00, 0x3e, ], op: [ 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, @@ -3610,12 +3610,12 @@ pub(crate) fn test_vectors() -> Vec { 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, ], c_out: [ - 0x22, 0xce, 0xb6, 0x94, 0x21, 0xab, 0x9e, 0xd0, 0x29, 0x97, 0x3f, 0xf2, 0x2e, 0xc9, - 0x5f, 0x23, 0x36, 0x56, 0xbe, 0x41, 0xd2, 0x25, 0x1a, 0x76, 0x77, 0xce, 0xb0, 0xd3, - 0x14, 0x22, 0x11, 0x6f, 0x8c, 0xa5, 0xf0, 0xae, 0x23, 0x12, 0xd4, 0xec, 0x60, 0x0c, - 0x5d, 0x7c, 0x56, 0x44, 0x5b, 0x6d, 0x8d, 0xc4, 0xb8, 0x0b, 0x47, 0x0b, 0xb1, 0xf6, - 0x51, 0xa5, 0x38, 0x28, 0x0d, 0xaa, 0x94, 0x20, 0x3a, 0xb5, 0x02, 0xa8, 0x15, 0x09, - 0xe4, 0x3a, 0x61, 0xa6, 0x98, 0x56, 0x57, 0xd9, 0xe8, 0x4e, + 0x74, 0x6a, 0xae, 0x9d, 0xa6, 0x1c, 0x02, 0xae, 0xaa, 0x8b, 0xed, 0xbe, 0x2b, 0x6c, + 0x84, 0x1b, 0xc4, 0x36, 0x17, 0x3c, 0x7c, 0x91, 0x13, 0x66, 0x3a, 0x39, 0xc1, 0x74, + 0x69, 0x29, 0x0b, 0xd2, 0x19, 0xea, 0xdc, 0x4a, 0x97, 0x5a, 0xd0, 0x52, 0xd0, 0x5d, + 0xc0, 0xa3, 0x08, 0xf3, 0x63, 0xf9, 0x22, 0x68, 0x2d, 0x75, 0x21, 0x9d, 0xaa, 0x33, + 0x6f, 0x69, 0xb5, 0x9e, 0x86, 0x7c, 0x85, 0xd9, 0x37, 0x34, 0x4c, 0x19, 0xd3, 0x88, + 0x01, 0x63, 0x19, 0xb3, 0xf6, 0x0f, 0x76, 0xd0, 0x28, 0x93, ], asset: Some([ 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, @@ -3690,9 +3690,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x40, 0x21, 0x95, 0x68, 0x0e, 0x02, 0x27, 0x30, 0x2c, 0x3a, 0x75, 0x6a, 0x34, 0xdf, - 0xdb, 0x13, 0x6b, 0xbd, 0x28, 0x7d, 0x7d, 0xc1, 0x25, 0x81, 0xd0, 0x8e, 0x2a, 0x63, - 0xb9, 0xc3, 0x92, 0x3e, + 0xf4, 0x5c, 0xba, 0x14, 0x6a, 0xe7, 0x18, 0x85, 0xfd, 0x61, 0xb4, 0xa0, 0xf3, 0x6b, + 0x95, 0x26, 0xa6, 0xe9, 0x4a, 0x49, 0x70, 0x10, 0xe3, 0x2a, 0x8a, 0x76, 0xbc, 0xdf, + 0xa7, 0x20, 0xb8, 0xa6, ], rho: [ 0x85, 0x2f, 0x5c, 0x39, 0xd3, 0xf3, 0x55, 0xa3, 0x85, 0xe2, 0xab, 0xd2, 0x54, 0x3a, @@ -3812,9 +3812,9 @@ pub(crate) fn test_vectors() -> Vec { 0x7e, 0x44, 0x16, 0x70, 0x64, 0xc9, ], ock: [ - 0xbc, 0x1b, 0xa7, 0xae, 0x73, 0xe7, 0x39, 0x7a, 0x64, 0xe0, 0xbd, 0x98, 0x63, 0xf1, - 0x33, 0x95, 0xdc, 0x0b, 0x15, 0xd4, 0x4e, 0x86, 0x70, 0xf1, 0x85, 0x5b, 0x68, 0xc2, - 0x9f, 0x97, 0x9a, 0xd2, + 0x67, 0x1c, 0xed, 0xd6, 0xf5, 0x73, 0xa4, 0x6f, 0xf1, 0xea, 0xd0, 0x48, 0x21, 0x98, + 0x56, 0x36, 0xe2, 0x3f, 0xb1, 0x5c, 0x6f, 0x48, 0x05, 0xfd, 0x57, 0x63, 0x12, 0xc2, + 0x07, 0x02, 0xa4, 0x24, ], op: [ 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, @@ -3824,12 +3824,12 @@ pub(crate) fn test_vectors() -> Vec { 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, ], c_out: [ - 0xe2, 0x76, 0x3c, 0x2c, 0xd3, 0x04, 0x29, 0x45, 0x25, 0xf6, 0x6d, 0x17, 0xcd, 0xb4, - 0x2a, 0x6d, 0xaf, 0xd7, 0x47, 0x38, 0x37, 0x71, 0x52, 0x35, 0x62, 0xb2, 0x71, 0xbb, - 0xf5, 0xb2, 0x88, 0x41, 0xb5, 0xca, 0x65, 0xfd, 0xd3, 0x42, 0xee, 0x80, 0x2f, 0xee, - 0x12, 0x12, 0x47, 0x22, 0xcf, 0xf5, 0xe1, 0x99, 0xd6, 0xd9, 0x5c, 0x2f, 0x88, 0xc4, - 0xe2, 0x31, 0x31, 0xf4, 0xe7, 0x6b, 0xa7, 0x6b, 0x9d, 0x64, 0x66, 0x78, 0xd8, 0x53, - 0xd1, 0xdc, 0xaf, 0x81, 0xb8, 0x0e, 0x2e, 0xfd, 0xf0, 0x60, + 0x59, 0x97, 0x53, 0xe4, 0x0a, 0xda, 0xea, 0xff, 0x6f, 0xaa, 0xf5, 0xa6, 0xf3, 0x0e, + 0x39, 0x13, 0x8f, 0xde, 0x82, 0x0f, 0x7b, 0xec, 0x7c, 0x8d, 0x0f, 0xd8, 0x4b, 0x48, + 0x36, 0x94, 0xe5, 0x0c, 0x4b, 0xdd, 0xee, 0x2f, 0xb1, 0xa4, 0xf9, 0x95, 0xb1, 0xa3, + 0xba, 0x40, 0xf4, 0x66, 0xb4, 0x2e, 0x8b, 0x5d, 0x01, 0x38, 0xfd, 0x30, 0xbf, 0xf6, + 0xae, 0x8c, 0xb1, 0x55, 0xf4, 0x0c, 0xdc, 0x37, 0x39, 0xfa, 0xbf, 0x2f, 0x00, 0xda, + 0x3a, 0xc6, 0xa7, 0x36, 0x3b, 0xc2, 0xf4, 0xaa, 0x10, 0xfe, ], asset: Some([ 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, @@ -3904,9 +3904,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x50, 0xaf, 0x90, 0x31, 0xf4, 0xe0, 0x4b, 0x79, 0xd7, 0xda, 0xb5, 0xe8, 0x5b, 0x51, - 0xee, 0x9b, 0xea, 0x56, 0xf7, 0xc5, 0x6b, 0x52, 0x22, 0x73, 0xd2, 0x30, 0xaa, 0x51, - 0x2b, 0xa9, 0xe7, 0x06, + 0x1a, 0xa2, 0x3d, 0x96, 0x79, 0xbc, 0x66, 0x04, 0xb6, 0x25, 0x2c, 0x4f, 0x48, 0x1b, + 0x3a, 0x2a, 0xf5, 0x46, 0x32, 0xf8, 0x30, 0x08, 0x14, 0x68, 0x29, 0x65, 0x94, 0x5e, + 0x7e, 0x33, 0x2a, 0x0d, ], rho: [ 0x09, 0x1d, 0x83, 0x73, 0x3a, 0x9f, 0xfb, 0x18, 0xc1, 0x7a, 0xd1, 0x93, 0x8d, 0xd2, @@ -4026,9 +4026,9 @@ pub(crate) fn test_vectors() -> Vec { 0xcc, 0xac, 0xba, 0xd9, 0xa2, 0xfa, ], ock: [ - 0xc7, 0x5b, 0x5b, 0xfa, 0x9f, 0x2e, 0xeb, 0xd9, 0x99, 0x80, 0x78, 0xf1, 0x8f, 0x0e, - 0x9b, 0x79, 0xf1, 0xe2, 0x13, 0xe8, 0x25, 0x61, 0x6f, 0xeb, 0x26, 0x08, 0xe9, 0xc7, - 0x81, 0xb5, 0x00, 0x95, + 0x57, 0x97, 0xef, 0x48, 0x70, 0xb0, 0x86, 0x50, 0xfa, 0x99, 0xad, 0xae, 0x58, 0x85, + 0x19, 0x9e, 0x3b, 0x04, 0x4b, 0x2a, 0x0a, 0x8c, 0xe1, 0x61, 0x43, 0x42, 0xb5, 0xdc, + 0xb2, 0x8e, 0x6e, 0x09, ], op: [ 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, @@ -4038,12 +4038,12 @@ pub(crate) fn test_vectors() -> Vec { 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, ], c_out: [ - 0xca, 0x4d, 0x6e, 0xb3, 0xea, 0x95, 0xc5, 0x5a, 0x91, 0x16, 0x85, 0x66, 0xe6, 0x67, - 0x63, 0xd1, 0x9e, 0x9c, 0x44, 0x33, 0x07, 0x3c, 0x08, 0x9a, 0x7d, 0xb9, 0x5b, 0x93, - 0xc8, 0xc4, 0x55, 0x0e, 0xb0, 0x8e, 0x28, 0xdd, 0xef, 0xba, 0x64, 0xe0, 0x58, 0xac, - 0x68, 0x44, 0xad, 0x77, 0x20, 0x67, 0xa1, 0x7c, 0x32, 0x53, 0xc3, 0x9a, 0x72, 0x4d, - 0xd8, 0x15, 0xf7, 0x29, 0x8c, 0x1d, 0x59, 0x09, 0x1f, 0x1b, 0x38, 0x7a, 0x26, 0x46, - 0xe7, 0xfe, 0x36, 0x3a, 0xde, 0x83, 0x63, 0xa9, 0x2a, 0xde, + 0xb8, 0xb4, 0x6c, 0x7e, 0xc4, 0xa8, 0x74, 0x2a, 0x22, 0xd3, 0xcd, 0x11, 0x74, 0x1c, + 0x23, 0x04, 0x22, 0x1c, 0xa5, 0x97, 0x29, 0x4e, 0x08, 0xa4, 0xc7, 0x1b, 0x17, 0xc7, + 0x26, 0x5d, 0x4d, 0xa7, 0x7c, 0xfe, 0x84, 0xb8, 0x7e, 0x76, 0xed, 0xaa, 0xec, 0xc2, + 0x24, 0xb8, 0x36, 0xde, 0x22, 0x4c, 0x73, 0x58, 0x13, 0x19, 0xa0, 0xba, 0x27, 0x88, + 0xdb, 0xf8, 0x3b, 0xcf, 0x47, 0xa4, 0x8e, 0xeb, 0x02, 0xb4, 0x3a, 0x18, 0x02, 0x7b, + 0x8f, 0x59, 0x11, 0x65, 0xc2, 0x86, 0xe8, 0xb6, 0x54, 0xec, ], asset: Some([ 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, @@ -4118,9 +4118,9 @@ pub(crate) fn test_vectors() -> Vec { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ], cv_net: [ - 0x72, 0xd8, 0x2a, 0xd6, 0x89, 0xd2, 0x9f, 0x9b, 0x18, 0x9d, 0x5b, 0x44, 0x78, 0x9f, - 0x55, 0xfe, 0x1e, 0x9b, 0xab, 0x78, 0x8f, 0xf8, 0x7e, 0xbe, 0x9f, 0xc8, 0x59, 0x50, - 0x4f, 0xb2, 0x3c, 0x8a, + 0x91, 0x6d, 0xc3, 0x82, 0x2a, 0x4e, 0x3b, 0xb4, 0x1f, 0xa8, 0x33, 0xc2, 0x73, 0xa9, + 0xd3, 0x7d, 0x17, 0x17, 0xa4, 0x8d, 0x8f, 0x00, 0x6c, 0x1f, 0xf5, 0x86, 0x21, 0x46, + 0x29, 0x55, 0x39, 0x1c, ], rho: [ 0x57, 0x87, 0x18, 0x97, 0x6d, 0xa3, 0xdc, 0xb4, 0x30, 0x32, 0x71, 0x52, 0x20, 0x72, @@ -4240,9 +4240,9 @@ pub(crate) fn test_vectors() -> Vec { 0xf4, 0x76, 0x11, 0x41, 0xd4, 0xa6, ], ock: [ - 0xdc, 0xf9, 0x34, 0xcf, 0x6a, 0x64, 0x90, 0x3f, 0x2d, 0x99, 0xa3, 0x07, 0xe1, 0x55, - 0xfb, 0x90, 0xe9, 0x7a, 0xc9, 0x0c, 0x38, 0x7f, 0x1b, 0xa5, 0xa6, 0xea, 0x43, 0xb5, - 0x91, 0xb0, 0x5d, 0x69, + 0x95, 0x83, 0xf1, 0x0f, 0xed, 0x70, 0xa4, 0x1e, 0x45, 0x8c, 0x65, 0x5c, 0xc0, 0x14, + 0xe2, 0x35, 0x5a, 0x7f, 0x99, 0xae, 0xbc, 0xfe, 0xf7, 0x4a, 0x55, 0x9a, 0xcd, 0x24, + 0x25, 0xfa, 0x21, 0xcf, ], op: [ 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, @@ -4252,12 +4252,12 @@ pub(crate) fn test_vectors() -> Vec { 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, ], c_out: [ - 0x25, 0xf4, 0xbb, 0x9f, 0xb4, 0x45, 0x06, 0x78, 0x9c, 0xf5, 0x1d, 0xc3, 0xf6, 0x5f, - 0x17, 0xaf, 0xee, 0xe0, 0x34, 0x92, 0x79, 0xc7, 0x89, 0x28, 0x9b, 0x03, 0xd3, 0x8c, - 0x2e, 0x20, 0xd3, 0x12, 0x5d, 0xe7, 0xc5, 0x6e, 0x18, 0x29, 0x2d, 0xec, 0xc6, 0x41, - 0x81, 0xa7, 0xe9, 0xa7, 0xbc, 0x12, 0xeb, 0x97, 0x85, 0xf0, 0xdd, 0x51, 0xd5, 0x88, - 0x62, 0x00, 0xfb, 0x18, 0x7d, 0x2c, 0x16, 0x90, 0x65, 0xaf, 0x84, 0xcc, 0x02, 0x3d, - 0x6d, 0x63, 0xce, 0x05, 0x83, 0x28, 0xe2, 0x47, 0xb5, 0x98, + 0xb8, 0x3b, 0x74, 0x5c, 0x9c, 0x0b, 0x04, 0xdd, 0xc7, 0xf1, 0x38, 0x16, 0x94, 0x38, + 0x99, 0x55, 0x3a, 0x30, 0x6a, 0x4a, 0xd0, 0xf2, 0xf5, 0x70, 0x92, 0x2a, 0x89, 0x9b, + 0xab, 0xb9, 0xda, 0xca, 0xd2, 0xbb, 0xc9, 0x5c, 0xf6, 0x5b, 0x73, 0x08, 0x55, 0x0d, + 0xce, 0xdb, 0x64, 0x9e, 0xf1, 0x5e, 0x0b, 0x1a, 0x09, 0x1f, 0xad, 0x5a, 0x93, 0x92, + 0xd0, 0x71, 0xb7, 0x5a, 0xb5, 0x1a, 0x7e, 0x35, 0x06, 0xad, 0x58, 0xd1, 0x71, 0x95, + 0xc9, 0x9f, 0x29, 0x8a, 0xc3, 0x14, 0xec, 0x05, 0xa6, 0x6a, ], asset: Some([ 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, From babf1da44b91a8030d9eb31f99bb8d22756bb72c Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Wed, 21 Dec 2022 11:40:08 +0200 Subject: [PATCH 15/67] CI-Badge (#37) Added CI badge to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d4ac85eb..f761aa914 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) # +# orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) [![CI checks](https://github.com/QED-it/orchard/actions/workflows/ci.yml/badge.svg?branch=zsa1)](https://github.com/QED-it/orchard/actions/workflows/ci.yml) +# Requires Rust 1.61+. From 4681cc212a78104ea43387b37f85af7a437ca2cf Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 23 Dec 2022 11:29:01 +0100 Subject: [PATCH 16/67] Use different random nullifiers in dummy notes (#39) --- src/builder.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 9dfaa9efb..cd452b946 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -403,10 +403,13 @@ impl Builder { // || SpendInfo::dummy(asset, &mut rng), // |s| s.create_split_spend(), // ); - let dummy_spend = SpendInfo::dummy(asset, &mut rng); + // spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); // Extend the spends and recipients with dummy values. - spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); + spends.extend( + iter::repeat_with(|| SpendInfo::dummy(asset, &mut rng)) + .take(num_actions - num_spends), + ); recipients.extend( iter::repeat_with(|| RecipientInfo::dummy(&mut rng, asset)) From cec48d72a15ad44c0c5a8c6a7846946ba1347e79 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Tue, 31 Jan 2023 15:51:29 +0200 Subject: [PATCH 17/67] V3 encryption (#38) Added `OrchardDomainV3` on top of the encryption generalization (QED-it/librustzcash#18). not for review: note_encryption.rs, note_encryptionv2v3.rs and src/test_vectors/note_encryption.rs. These files represent two possible approaches for backward compatibility and will be finalized down the road. (the files were excluded from the build). --- Cargo.toml | 3 + benches/note_decryption.rs | 8 +- src/action.rs | 4 +- src/builder.rs | 20 +- src/bundle.rs | 18 +- src/bundle/commitments.rs | 6 +- src/issuance.rs | 38 +- src/lib.rs | 3 +- src/note.rs | 27 +- src/note/asset_id.rs | 15 +- src/note_encryption.rs | 328 +- src/note_encryption_v2v3.rs | 717 ++++ src/note_encryption_v3.rs | 634 ++++ src/test_vectors.rs | 1 + src/test_vectors/note_encryption.rs | 2155 +----------- src/test_vectors/note_encryption_v3.rs | 4389 ++++++++++++++++++++++++ src/value.rs | 5 +- tests/builder.rs | 4 +- tests/zsa.rs | 4 +- 19 files changed, 6028 insertions(+), 2351 deletions(-) create mode 100644 src/note_encryption_v2v3.rs create mode 100644 src/note_encryption_v3.rs create mode 100644 src/test_vectors/note_encryption_v3.rs diff --git a/Cargo.toml b/Cargo.toml index cb7508702..b5461be1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -84,3 +84,6 @@ debug = true [profile.bench] debug = true + +[patch.crates-io] +zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", rev = "07c377ddedf71ab7c7a266d284b054a2dafc2ed4" } diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 1417a2b6c..244de4378 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -5,7 +5,7 @@ use orchard::{ circuit::ProvingKey, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey}, note::AssetId, - note_encryption::{CompactAction, OrchardDomain}, + note_encryption_v3::{CompactAction, OrchardDomainV3}, value::NoteValue, Anchor, Bundle, }; @@ -79,7 +79,7 @@ fn bench_note_decryption(c: &mut Criterion) { }; let action = bundle.actions().first(); - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); let compact = { let mut group = c.benchmark_group("note-decryption"); @@ -120,12 +120,12 @@ fn bench_note_decryption(c: &mut Criterion) { let ivks = 2; let valid_ivks = vec![valid_ivk; ivks]; let actions: Vec<_> = (0..100) - .map(|_| (OrchardDomain::for_action(action), action.clone())) + .map(|_| (OrchardDomainV3::for_action(action), action.clone())) .collect(); let compact: Vec<_> = (0..100) .map(|_| { ( - OrchardDomain::for_action(action), + OrchardDomainV3::for_action(action), CompactAction::from(action), ) }) diff --git a/src/action.rs b/src/action.rs index 94fe4f3f4..ed3fe1661 100644 --- a/src/action.rs +++ b/src/action.rs @@ -158,7 +158,7 @@ pub(crate) mod testing { // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], + enc_ciphertext: [0u8; 612], out_ciphertext: [0u8; 80] }; Action { @@ -192,7 +192,7 @@ pub(crate) mod testing { // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], + enc_ciphertext: [0u8; 612], out_ciphertext: [0u8; 80] }; diff --git a/src/builder.rs b/src/builder.rs index cd452b946..d420d742e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -20,7 +20,7 @@ use crate::{ SpendingKey, }, note::{Note, TransmittedNoteCiphertext}, - note_encryption::OrchardNoteEncryption, + note_encryption_v3::OrchardNoteEncryption, primitives::redpallas::{self, Binding, SpendAuth}, tree::{Anchor, MerklePath}, value::{self, NoteValue, OverflowError, ValueCommitTrapdoor, ValueCommitment, ValueSum}, @@ -79,7 +79,12 @@ impl SpendInfo { /// Returns `None` if the `fvk` does not own the `note`. /// /// [`Builder::add_spend`]: Builder::add_spend - pub fn new(fvk: FullViewingKey, note: Note, merkle_path: MerklePath) -> Option { + pub fn new( + fvk: FullViewingKey, + note: Note, + merkle_path: MerklePath, + split_flag: bool, + ) -> Option { let scope = fvk.scope_for_address(¬e.recipient())?; Some(SpendInfo { dummy_sk: None, @@ -87,7 +92,7 @@ impl SpendInfo { scope, note, merkle_path, - split_flag: false, + split_flag, }) } @@ -112,10 +117,7 @@ impl SpendInfo { /// Return a copy of this note with the split flag set to `true`. fn create_split_spend(&self) -> Self { - let mut split_spend = SpendInfo::new(self.fvk.clone(), self.note, self.merkle_path.clone()) - .expect("The spend info is valid"); - split_spend.split_flag = true; - split_spend + SpendInfo::new(self.fvk.clone(), self.note, self.merkle_path.clone(), true).unwrap() } } @@ -224,7 +226,7 @@ impl ActionInfo { let encrypted_note = TransmittedNoteCiphertext { epk_bytes: encryptor.epk().to_bytes().0, - enc_ciphertext: encryptor.encrypt_note_plaintext(), + enc_ciphertext: encryptor.encrypt_note_plaintext().0, out_ciphertext: encryptor.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut rng), }; @@ -278,7 +280,7 @@ impl Builder { /// Returns an error if the given Merkle path does not have the required anchor for /// the given note. /// - /// [`OrchardDomain`]: crate::note_encryption::OrchardDomain + /// [`OrchardDomain`]: crate::note_encryption_v3::OrchardDomainV3 /// [`MerkleHashOrchard`]: crate::tree::MerkleHashOrchard pub fn add_spend( &mut self, diff --git a/src/bundle.rs b/src/bundle.rs index cbc66e796..1d1363daf 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -20,7 +20,7 @@ use crate::{ circuit::{Instance, Proof, VerifyingKey}, keys::{IncomingViewingKey, OutgoingViewingKey, PreparedIncomingViewingKey}, note::Note, - note_encryption::OrchardDomain, + note_encryption_v3::OrchardDomainV3, primitives::redpallas::{self, Binding, SpendAuth}, tree::Anchor, value::{ValueCommitTrapdoor, ValueCommitment, ValueSum}, @@ -305,7 +305,7 @@ impl Bundle { .iter() .enumerate() .filter_map(|(idx, action)| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); prepared_keys.iter().find_map(|(ivk, prepared_ivk)| { try_note_decryption(&domain, prepared_ivk, action) .map(|(n, a, m)| (idx, (*ivk).clone(), n, a, m)) @@ -324,7 +324,7 @@ impl Bundle { ) -> Option<(Note, Address, [u8; 512])> { let prepared_ivk = PreparedIncomingViewingKey::new(key); self.actions.get(action_idx).and_then(move |action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_note_decryption(&domain, &prepared_ivk, action) }) } @@ -341,7 +341,7 @@ impl Bundle { .iter() .enumerate() .filter_map(|(idx, action)| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); keys.iter().find_map(move |key| { try_output_recovery_with_ovk( &domain, @@ -365,7 +365,7 @@ impl Bundle { key: &OutgoingViewingKey, ) -> Option<(Note, Address, [u8; 512])> { self.actions.get(action_idx).and_then(move |action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_output_recovery_with_ovk( &domain, key, @@ -527,7 +527,7 @@ pub mod testing { use super::{Action, Authorization, Authorized, Bundle, Flags}; pub use crate::action::testing::{arb_action, arb_unauthorized_action}; - use crate::note::asset_id::testing::zsa_asset_id; + use crate::note::asset_id::testing::arb_zsa_asset_id; use crate::note::AssetId; use crate::value::testing::arb_value_sum; @@ -591,7 +591,11 @@ pub mod testing { prop_compose! { /// Create an arbitrary vector of assets to burn. - pub fn arb_asset_to_burn()(asset_id in zsa_asset_id(), value in arb_value_sum()) -> (AssetId, ValueSum) { + pub fn arb_asset_to_burn() + ( + asset_id in arb_zsa_asset_id(), + value in arb_value_sum() + ) -> (AssetId, ValueSum) { (asset_id, value) } } diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index 285ba31f7..dc6a0b65a 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -42,13 +42,13 @@ pub(crate) fn hash_bundle_txid_data>( ch.update(&action.nullifier().to_bytes()); ch.update(&action.cmx().to_bytes()); ch.update(&action.encrypted_note().epk_bytes); - ch.update(&action.encrypted_note().enc_ciphertext[..52]); + ch.update(&action.encrypted_note().enc_ciphertext[..84]); // TODO: make sure it is backward compatible with Orchard [..52] - mh.update(&action.encrypted_note().enc_ciphertext[52..564]); + mh.update(&action.encrypted_note().enc_ciphertext[84..596]); nh.update(&action.cv_net().to_bytes()); nh.update(&<[u8; 32]>::from(action.rk())); - nh.update(&action.encrypted_note().enc_ciphertext[564..]); + nh.update(&action.encrypted_note().enc_ciphertext[596..]); nh.update(&action.encrypted_note().out_ciphertext); } diff --git a/src/issuance.rs b/src/issuance.rs index 9f15d638f..74247f928 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -344,7 +344,7 @@ impl IssueBundle { /// * Asset description size is collect. /// * `AssetId` for the `IssueAction` has not been previously finalized. /// * For each `Note` inside an `IssueAction`: -/// * All notes have the same, correct `NoteType`. +/// * All notes have the same, correct `AssetId`. pub fn verify_issue_bundle( bundle: &IssueBundle, sighash: [u8; 32], @@ -356,7 +356,6 @@ pub fn verify_issue_bundle( let s = &mut HashSet::::new(); - // An IssueAction could have just one properly derived AssetId. let newly_finalized = bundle .actions() .iter() @@ -373,7 +372,7 @@ pub fn verify_issue_bundle( return Err(IssueActionPreviouslyFinalizedNoteType(asset)); } - // Add to finalization set, if needed. + // Add to the finalization set, if needed. if action.is_finalized() { newly_finalized.insert(asset); } @@ -1025,30 +1024,31 @@ mod tests { pub mod testing { use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; use crate::keys::testing::{arb_issuance_authorizing_key, arb_issuance_validating_key}; + use crate::note::asset_id::testing::zsa_asset_id; use crate::note::testing::arb_zsa_note; use proptest::collection::vec; use proptest::prelude::*; use proptest::prop_compose; - use proptest::string::string_regex; use rand::{rngs::StdRng, SeedableRng}; prop_compose! { - /// Generate an issue action given note value - pub fn arb_issue_action()( - note in arb_zsa_note(), - asset_descr in string_regex(".{1,512}").unwrap() - ) -> IssueAction { - IssueAction::new(asset_descr, ¬e) + /// Generate an issue action + pub fn arb_issue_action(asset_desc: String) + ( + asset in zsa_asset_id(asset_desc.clone()), + ) + ( + note in arb_zsa_note(asset), + )-> IssueAction { + IssueAction::new(asset_desc.clone(), ¬e) } } prop_compose! { - /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not - /// necessarily respect consensus rules; for that use - /// [`crate::builder::testing::arb_issue_bundle`] + /// Generate an arbitrary issue bundle with fake authorization data. pub fn arb_unathorized_issue_bundle(n_actions: usize) ( - actions in vec(arb_issue_action(), n_actions), + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), ik in arb_issuance_validating_key() ) -> IssueBundle { IssueBundle { @@ -1061,11 +1061,10 @@ pub mod testing { prop_compose! { /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not - /// necessarily respect consensus rules; for that use - /// [`crate::builder::testing::arb_issue_bundle`] + /// necessarily respect consensus rules pub fn arb_prepared_issue_bundle(n_actions: usize) ( - actions in vec(arb_issue_action(), n_actions), + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), ik in arb_issuance_validating_key(), fake_sighash in prop::array::uniform32(prop::num::u8::ANY) ) -> IssueBundle { @@ -1079,11 +1078,10 @@ pub mod testing { prop_compose! { /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not - /// necessarily respect consensus rules; for that use - /// [`crate::builder::testing::arb_issue_bundle`] + /// necessarily respect consensus rules pub fn arb_signed_issue_bundle(n_actions: usize) ( - actions in vec(arb_issue_action(), n_actions), + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), ik in arb_issuance_validating_key(), isk in arb_issuance_authorizing_key(), rng_seed in prop::array::uniform32(prop::num::u8::ANY), diff --git a/src/lib.rs b/src/lib.rs index c0e63ce9b..76d9c41c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,7 +25,8 @@ mod constants; pub mod issuance; pub mod keys; pub mod note; -pub mod note_encryption; +// pub mod note_encryption; // disabled until backward compatability is implemented. +pub mod note_encryption_v3; pub mod primitives; mod spec; pub mod tree; diff --git a/src/note.rs b/src/note.rs index d5a58a838..7eeffe096 100644 --- a/src/note.rs +++ b/src/note.rs @@ -279,7 +279,7 @@ pub struct TransmittedNoteCiphertext { /// The serialization of the ephemeral public key pub epk_bytes: [u8; 32], /// The encrypted note ciphertext - pub enc_ciphertext: [u8; 580], + pub enc_ciphertext: [u8; 612], /// An encrypted value that allows the holder of the outgoing cipher /// key for the note to recover the note plaintext. pub out_ciphertext: [u8; 80], @@ -302,7 +302,7 @@ pub mod testing { use proptest::prelude::*; use crate::note::asset_id::testing::arb_asset_id; - use crate::note::asset_id::testing::zsa_asset_id; + use crate::note::AssetId; use crate::value::testing::arb_note_value; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, @@ -336,13 +336,30 @@ pub mod testing { } prop_compose! { - /// Generate an arbitrary ZSA note - pub fn arb_zsa_note()( + /// Generate an arbitrary native note + pub fn arb_native_note()( + recipient in arb_address(), + value in arb_note_value(), + rho in arb_nullifier(), + rseed in arb_rseed(), + ) -> Note { + Note { + recipient, + value, + asset: AssetId::native(), + rho, + rseed, + } + } + } + + prop_compose! { + /// Generate an arbitrary zsa note + pub fn arb_zsa_note(asset: AssetId)( recipient in arb_address(), value in arb_note_value(), rho in arb_nullifier(), rseed in arb_rseed(), - asset in zsa_asset_id(), ) -> Note { Note { recipient, diff --git a/src/note/asset_id.rs b/src/note/asset_id.rs index 074e59364..93993c47b 100644 --- a/src/note/asset_id.rs +++ b/src/note/asset_id.rs @@ -120,8 +120,8 @@ pub mod testing { } prop_compose! { - /// Generate the ZSA note type - pub fn zsa_asset_id()( + /// Generate an asset ID + pub fn arb_zsa_asset_id()( sk in arb_spending_key(), str in "[A-Za-z]{255}" ) -> AssetId { @@ -130,6 +130,17 @@ pub mod testing { } } + prop_compose! { + /// Generate an asset ID using a specific description + pub fn zsa_asset_id(asset_desc: String)( + sk in arb_spending_key(), + ) -> AssetId { + assert!(super::is_asset_desc_of_valid_size(&asset_desc)); + let isk = IssuanceAuthorizingKey::from(&sk); + AssetId::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) + } + } + #[test] fn test_vectors() { let test_vectors = crate::test_vectors::asset_id::test_vectors(); diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 48456e261..4beb99528 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -1,12 +1,11 @@ //! In-band secret distribution for Orchard bundles. use blake2b_simd::{Hash, Params}; -use core::fmt; use group::ff::PrimeField; +use std::fmt; use zcash_note_encryption::{ - BatchDomain, Domain, EphemeralKeyBytes, NotePlaintextBytes, OutPlaintextBytes, - OutgoingCipherKey, ShieldedOutput, COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE, - OUT_PLAINTEXT_SIZE, + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; use crate::note::AssetId; @@ -24,14 +23,82 @@ use crate::{ const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; -/// The size of the encoding of a ZSA asset type. -const ZSA_TYPE_SIZE: usize = 32; -/// The size of the ZSA variant of COMPACT_NOTE_SIZE. -const COMPACT_ZSA_NOTE_SIZE: usize = COMPACT_NOTE_SIZE + ZSA_TYPE_SIZE; -/// The size of the memo. -const MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_NOTE_SIZE; -/// The size of the ZSA variant of the memo. -const ZSA_MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_ZSA_NOTE_SIZE; +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; + +/// a type to represent the raw bytes of a note plaintext. +#[derive(Clone, Debug)] +pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE_V2]); + +/// a type to represent the raw bytes of an encrypted note plaintext. +#[derive(Clone, Debug)] +pub struct NoteCiphertextBytes(pub [u8; ENC_CIPHERTEXT_SIZE_V2]); + +/// a type to represent the raw bytes of a compact note. +#[derive(Clone, Debug)] +pub struct CompactNotePlaintextBytes(pub [u8; COMPACT_NOTE_SIZE_V2]); + +/// a type to represent the raw bytes of an encrypted compact note. +#[derive(Clone, Debug)] +pub struct CompactNoteCiphertextBytes(pub [u8; COMPACT_NOTE_SIZE_V2]); + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NoteCiphertextBytes(s.try_into().unwrap()) + } +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + CompactNotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. /// @@ -58,59 +125,58 @@ pub(crate) fn prf_ock_orchard( ) } -/// Domain-specific requirements: -/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. +/// note_version will return the version of the note plaintext. +pub fn note_version(plaintext: &[u8]) -> Option { + match plaintext[0] { + 0x02 => Some(0x02), + 0x03 => Some(0x03), + _ => None, + } +} + fn orchard_parse_note_plaintext_without_memo( - domain: &OrchardDomain, - plaintext: &[u8], + domain: &OrchardDomainV2, + plaintext: &[u8], // TODO: replace with CompactNotePlaintextBytes get_validated_pk_d: F, ) -> Option<(Note, Address)> where F: FnOnce(&Diversifier) -> Option, { - assert!(plaintext.len() >= COMPACT_NOTE_SIZE); + assert!(plaintext.len() >= COMPACT_NOTE_SIZE_V2); // Check note plaintext version - // and parse the asset type accordingly. - let asset = parse_version_and_asset_type(plaintext)?; + if note_version(plaintext).unwrap() != 0x02 { + return None; + } // The unwraps below are guaranteed to succeed by the assertion above let diversifier = Diversifier::from_bytes(plaintext[1..12].try_into().unwrap()); let value = NoteValue::from_bytes(plaintext[12..20].try_into().unwrap()); let rseed = Option::from(RandomSeed::from_bytes( - plaintext[20..COMPACT_NOTE_SIZE].try_into().unwrap(), + plaintext[20..COMPACT_NOTE_SIZE_V2].try_into().unwrap(), &domain.rho, ))?; let pk_d = get_validated_pk_d(&diversifier)?; let recipient = Address::from_parts(diversifier, pk_d); - - let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; + let note = Option::from(Note::from_parts( + recipient, + value, + AssetId::native(), //V2 notes are always native. + domain.rho, + rseed, + ))?; Some((note, recipient)) } -fn parse_version_and_asset_type(plaintext: &[u8]) -> Option { - // TODO: make this constant-time? - match plaintext[0] { - 0x02 => Some(AssetId::native()), - 0x03 if plaintext.len() >= COMPACT_ZSA_NOTE_SIZE => { - let bytes = &plaintext[COMPACT_NOTE_SIZE..COMPACT_ZSA_NOTE_SIZE] - .try_into() - .unwrap(); - AssetId::from_bytes(bytes).into() - } - _ => None, - } -} - /// Orchard-specific note encryption logic. #[derive(Debug)] -pub struct OrchardDomain { +pub struct OrchardDomainV2 { rho: Nullifier, } -impl memuse::DynamicUsage for OrchardDomain { +impl memuse::DynamicUsage for OrchardDomainV2 { fn dynamic_usage(&self) -> usize { self.rho.dynamic_usage() } @@ -120,21 +186,21 @@ impl memuse::DynamicUsage for OrchardDomain { } } -impl OrchardDomain { +impl OrchardDomainV2 { /// Constructs a domain that can be used to trial-decrypt this action's output note. pub fn for_action(act: &Action) -> Self { - OrchardDomain { + OrchardDomainV2 { rho: *act.nullifier(), } } /// Constructs a domain from a nullifier. pub fn for_nullifier(nullifier: Nullifier) -> Self { - OrchardDomain { rho: nullifier } + OrchardDomainV2 { rho: nullifier } } } -impl Domain for OrchardDomain { +impl Domain for OrchardDomainV2 { type EphemeralSecretKey = EphemeralSecretKey; type EphemeralPublicKey = EphemeralPublicKey; type PreparedEphemeralPublicKey = PreparedEphemeralPublicKey; @@ -150,6 +216,11 @@ impl Domain for OrchardDomain { type ExtractedCommitmentBytes = [u8; 32]; type Memo = [u8; MEMO_SIZE]; // TODO use a more interesting type + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + fn derive_esk(note: &Self::Note) -> Option { Some(note.esk()) } @@ -192,23 +263,12 @@ impl Domain for OrchardDomain { _: &Self::Recipient, memo: &Self::Memo, ) -> NotePlaintextBytes { - let is_native: bool = note.asset().is_native().into(); - - let mut np = [0; NOTE_PLAINTEXT_SIZE]; - np[0] = if is_native { 0x02 } else { 0x03 }; + let mut np = [0; NOTE_PLAINTEXT_SIZE_V2]; + np[0] = 0x02; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); - // todo: add asset_id np[20..52].copy_from_slice(note.rseed().as_bytes()); - if is_native { - np[52..].copy_from_slice(memo); - } else { - let zsa_type = note.asset().to_bytes(); - np[52..84].copy_from_slice(&zsa_type); - let short_memo = &memo[0..memo.len() - ZSA_TYPE_SIZE]; - np[84..].copy_from_slice(short_memo); - // TODO: handle full-size memo or make short_memo explicit. - }; + np[52..].copy_from_slice(memo); NotePlaintextBytes(np) } @@ -246,9 +306,9 @@ impl Domain for OrchardDomain { fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, - plaintext: &[u8], + plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { - orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + orchard_parse_note_plaintext_without_memo(self, &plaintext.0, |diversifier| { Some(DiversifiedTransmissionKey::derive(ivk, diversifier)) }) } @@ -258,7 +318,7 @@ impl Domain for OrchardDomain { pk_d: &Self::DiversifiedTransmissionKey, esk: &Self::EphemeralSecretKey, ephemeral_key: &EphemeralKeyBytes, - plaintext: &NotePlaintextBytes, + plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { orchard_parse_note_plaintext_without_memo(self, &plaintext.0, |diversifier| { if esk @@ -274,21 +334,12 @@ impl Domain for OrchardDomain { }) } - fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { - let mut memo = [0; MEMO_SIZE]; - match get_note_plaintext_version(plaintext) { - 0x02 => { - let full_memo = &plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; - memo.copy_from_slice(full_memo); - } - 0x03 => { - // ZSA note plaintexts have a shorter memo. - let short_memo = &plaintext.0[COMPACT_ZSA_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; - memo[..ZSA_MEMO_SIZE].copy_from_slice(short_memo); - } - _ => {} - }; - memo + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE_V2); + (compact.try_into().unwrap(), memo.try_into().unwrap()) } fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { @@ -301,7 +352,7 @@ impl Domain for OrchardDomain { } } -impl BatchDomain for OrchardDomain { +impl BatchDomain for OrchardDomainV2 { fn batch_kdf<'a>( items: impl Iterator, &'a EphemeralKeyBytes)>, ) -> Vec> { @@ -316,14 +367,10 @@ impl BatchDomain for OrchardDomain { } } -fn get_note_plaintext_version(plaintext: &NotePlaintextBytes) -> u8 { - plaintext.0[0] -} - /// Implementation of in-band secret distribution for Orchard bundles. -pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; +pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; -impl ShieldedOutput for Action { +impl ShieldedOutput for Action { fn ephemeral_key(&self) -> EphemeralKeyBytes { EphemeralKeyBytes(self.encrypted_note().epk_bytes) } @@ -332,8 +379,16 @@ impl ShieldedOutput for Action { self.cmx().to_bytes() } - fn enc_ciphertext(&self) -> &[u8; ENC_CIPHERTEXT_SIZE] { - &self.encrypted_note().enc_ciphertext + fn enc_ciphertext(&self) -> Option { + Some(NoteCiphertextBytes(self.encrypted_note().enc_ciphertext)) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes( + self.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + ) } } @@ -342,7 +397,7 @@ pub struct CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; COMPACT_NOTE_SIZE], + enc_ciphertext: CompactNoteCiphertextBytes, } impl fmt::Debug for CompactAction { @@ -351,20 +406,25 @@ impl fmt::Debug for CompactAction { } } -impl From<&Action> for CompactAction { +impl From<&Action> for CompactAction +where + Action: ShieldedOutput, +{ fn from(action: &Action) -> Self { CompactAction { nullifier: *action.nullifier(), cmx: *action.cmx(), ephemeral_key: action.ephemeral_key(), - enc_ciphertext: action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE] - .try_into() - .unwrap(), + enc_ciphertext: CompactNoteCiphertextBytes( + action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + ), } } } -impl ShieldedOutput for CompactAction { +impl ShieldedOutput for CompactAction { fn ephemeral_key(&self) -> EphemeralKeyBytes { EphemeralKeyBytes(self.ephemeral_key.0) } @@ -373,8 +433,12 @@ impl ShieldedOutput for CompactAction { self.cmx.to_bytes() } - fn enc_ciphertext(&self) -> &[u8; COMPACT_NOTE_SIZE] { - &self.enc_ciphertext + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + self.enc_ciphertext.clone() } } @@ -384,7 +448,7 @@ impl CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; 52], + enc_ciphertext: CompactNoteCiphertextBytes, ) -> Self { Self { nullifier, @@ -402,14 +466,14 @@ impl CompactAction { #[cfg(test)] mod tests { - use proptest::prelude::*; + use proptest::proptest; use rand::rngs::OsRng; use zcash_note_encryption::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; - use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use super::{prf_ock_orchard, CompactAction, OrchardDomainV2, OrchardNoteEncryption}; use crate::note::AssetId; use crate::{ action::Action, @@ -418,53 +482,46 @@ mod tests { OutgoingViewingKey, PreparedIncomingViewingKey, }, note::{ - testing::arb_note, ExtractedNoteCommitment, Nullifier, RandomSeed, + testing::arb_native_note, ExtractedNoteCommitment, Nullifier, RandomSeed, TransmittedNoteCiphertext, }, + note_encryption::{ + note_version, orchard_parse_note_plaintext_without_memo, NoteCiphertextBytes, + }, primitives::redpallas, value::{NoteValue, ValueCommitment}, Address, Note, }; - use super::{get_note_plaintext_version, orchard_parse_note_plaintext_without_memo}; - proptest! { - #[test] - fn test_encoding_roundtrip( - note in arb_note(NoteValue::from_raw(10)), - ) { - let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; - - // Encode. - let plaintext = OrchardDomain::note_plaintext_bytes(¬e, ¬e.recipient(), memo); - - // Decode. - let domain = OrchardDomain { rho: note.rho() }; - let parsed_version = get_note_plaintext_version(&plaintext); - let parsed_memo = domain.extract_memo(&plaintext); - - let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &plaintext.0, - |diversifier| { - assert_eq!(diversifier, ¬e.recipient().diversifier()); - Some(*note.recipient().pk_d()) - } - ).expect("Plaintext parsing failed"); - - // Check. - assert_eq!(parsed_note, note); - assert_eq!(parsed_recipient, note.recipient()); + #[test] + fn test_encoding_roundtrip( + note in arb_native_note(), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomainV2::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomainV2 { rho: note.rho() }; + let parsed_version = note_version(plaintext.as_mut()).unwrap(); + let (compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact.0, + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); - if parsed_note.asset().is_native().into() { - assert_eq!(parsed_version, 0x02); + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); assert_eq!(&parsed_memo, memo); - } else { - assert_eq!(parsed_version, 0x03); - let mut short_memo = *memo; - short_memo[512 - 32..].copy_from_slice(&[0; 32]); - assert_eq!(parsed_memo, short_memo); + assert_eq!(parsed_version, 0x02); } } - } #[test] fn test_vectors() { @@ -509,13 +566,7 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); - - let asset = match tv.asset { - None => AssetId::native(), - Some(type_bytes) => AssetId::from_bytes(&type_bytes).unwrap(), - }; - - let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); + let note = Note::from_parts(recipient, value, AssetId::native(), rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( @@ -538,7 +589,7 @@ mod tests { // (Tested first because it only requires immutable references.) // - let domain = OrchardDomain { rho }; + let domain = OrchardDomainV2 { rho }; match try_note_decryption(&domain, &ivk, &action) { Some((decrypted_note, decrypted_to, decrypted_memo)) => { @@ -554,8 +605,7 @@ mod tests { assert_eq!(decrypted_note, note); assert_eq!(decrypted_to, recipient); } - None => assert!(tv.asset.is_some(), "Compact note decryption failed"), - // Ignore that ZSA notes are not detected in compact decryption. + None => panic!("Compact note decryption failed"), } match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { diff --git a/src/note_encryption_v2v3.rs b/src/note_encryption_v2v3.rs new file mode 100644 index 000000000..bef34e06e --- /dev/null +++ b/src/note_encryption_v2v3.rs @@ -0,0 +1,717 @@ +//! In-band secret distribution for Orchard bundles. + +use blake2b_simd::{Hash, Params}; +use core::fmt; +use group::ff::PrimeField; +use zcash_note_encryption::{ + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, +}; + +use crate::note::AssetId; +use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralPublicKey, EphemeralSecretKey, + IncomingViewingKey, OutgoingViewingKey, SharedSecret, + }, + note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, + spec::diversify_hash, + value::{NoteValue, ValueCommitment}, + Address, Note, +}; + +const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; + +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; + +/// The size of the encoding of a ZSA asset id. +const ZSA_ASSET_SIZE: usize = 32; +/// The size of a v3 compact note. +const COMPACT_NOTE_SIZE_V3: usize = COMPACT_NOTE_SIZE_V2 + ZSA_ASSET_SIZE; +/// The size of [`NotePlaintextBytes`] for V3. +const NOTE_PLAINTEXT_SIZE_V3: usize = COMPACT_NOTE_SIZE_V3 + MEMO_SIZE; +/// The size of the encrypted ciphertext of the ZSA variant of a note. +const ENC_CIPHERTEXT_SIZE_V3: usize = NOTE_PLAINTEXT_SIZE_V3 + AEAD_TAG_SIZE; + +/// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. +/// +/// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs +pub(crate) fn prf_ock_orchard( + ovk: &OutgoingViewingKey, + cv: &ValueCommitment, + cmx_bytes: &[u8; 32], + ephemeral_key: &EphemeralKeyBytes, +) -> OutgoingCipherKey { + OutgoingCipherKey( + Params::new() + .hash_length(32) + .personal(PRF_OCK_ORCHARD_PERSONALIZATION) + .to_state() + .update(ovk.as_ref()) + .update(&cv.to_bytes()) + .update(cmx_bytes) + .update(ephemeral_key.as_ref()) + .finalize() + .as_bytes() + .try_into() + .unwrap(), + ) +} + +// TODO: VA: Needs updating +/// Domain-specific requirements: +/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. +fn orchard_parse_note_plaintext_without_memo( + domain: &OrchardDomain, + plaintext: &CompactNotePlaintextBytes, + get_validated_pk_d: F, +) -> Option<(Note, Address)> +where + F: FnOnce(&Diversifier) -> Option, +{ + // Check note plaintext version + // and parse the asset type accordingly. + let asset = parse_version_and_asset_type(plaintext)?; + + let mut plaintext_inner = [0u8; COMPACT_NOTE_SIZE_V2]; + match plaintext { + CompactNotePlaintextBytes::V2(x) => { + plaintext_inner.copy_from_slice(&x[..COMPACT_NOTE_SIZE_V2]) + } + CompactNotePlaintextBytes::V3(x) => { + plaintext_inner.copy_from_slice(&x[..COMPACT_NOTE_SIZE_V2]) + } + } + + // The unwraps below are guaranteed to succeed by the assertion above + let diversifier = Diversifier::from_bytes(plaintext_inner[1..12].try_into().unwrap()); + let value = NoteValue::from_bytes(plaintext_inner[12..20].try_into().unwrap()); + let rseed = Option::from(RandomSeed::from_bytes( + plaintext_inner[20..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + &domain.rho, + ))?; + + let pk_d = get_validated_pk_d(&diversifier)?; + + let recipient = Address::from_parts(diversifier, pk_d); + let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; + Some((note, recipient)) +} + +fn parse_version_and_asset_type(plaintext: &CompactNotePlaintextBytes) -> Option { + match plaintext { + CompactNotePlaintextBytes::V2(x) if x[0] == 0x02 => Some(AssetId::native()), + CompactNotePlaintextBytes::V3(x) if x[0] == 0x03 => { + let bytes = x[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(); + AssetId::from_bytes(bytes).into() + } + _ => None, + } +} + +/// Orchard-specific note encryption logic. +#[derive(Debug)] +pub struct OrchardDomain { + rho: Nullifier, +} + +/// Newtype for encoding the note plaintext post ZSA. +// pub struct NotePlaintextZSA (pub [u8; ZSA_NOTE_PLAINTEXT_SIZE]); +#[derive(Clone, Debug)] +pub enum NotePlaintextBytes { + /// Variant for old note plaintexts. + V2([u8; NOTE_PLAINTEXT_SIZE_V2]), + /// Variant for the new note plaintexts post ZSA. + V3([u8; NOTE_PLAINTEXT_SIZE_V3]), +} + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + match self { + NotePlaintextBytes::V2(x) => x.as_mut(), + NotePlaintextBytes::V3(x) => x.as_mut(), + } + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + NOTE_PLAINTEXT_SIZE_V2 => NotePlaintextBytes::V2(s.try_into().unwrap()), + NOTE_PLAINTEXT_SIZE_V3 => NotePlaintextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid note plaintext size"), + } + } +} + +/// Newtype for encoding the encrypted note ciphertext post ZSA. +// pub struct EncNoteCiphertextZSA (pub [u8; ZSA_ENC_CIPHERTEXT_SIZE]); +#[derive(Clone, Debug)] +pub enum NoteCiphertextBytes { + /// Variant for old encrypted note ciphertexts. + V2([u8; ENC_CIPHERTEXT_SIZE_V2]), + /// Variant for new encrypted note ciphertexts post ZSA. + V3([u8; ENC_CIPHERTEXT_SIZE_V3]), +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + match self { + NoteCiphertextBytes::V2(x) => x, + NoteCiphertextBytes::V3(x) => x, + } + } +} + +/// Panics if the given slice is not `ENC_CIPHERTEXT_SIZE_V2` or `ENC_CIPHERTEXT_SIZE_V3` bytes long. +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + ENC_CIPHERTEXT_SIZE_V2 => NoteCiphertextBytes::V2(s.try_into().unwrap()), + ENC_CIPHERTEXT_SIZE_V3 => NoteCiphertextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid length for compact note plaintext"), + } + } +} + +/// Newtype for encoding a compact note +#[derive(Clone, Debug)] +pub enum CompactNotePlaintextBytes { + /// Variant for old compact notes. + V2([u8; COMPACT_NOTE_SIZE_V2]), + /// Variant for new compact notes post ZSA. + V3([u8; COMPACT_NOTE_SIZE_V3]), +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + match self { + CompactNotePlaintextBytes::V2(x) => x, + CompactNotePlaintextBytes::V3(x) => x, + } + } +} + +/// Panics if the given slice is not `COMPACT_NOTE_SIZE_V2` or `COMPACT_NOTE_SIZE_V3` bytes long. +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + COMPACT_NOTE_SIZE_V2 => CompactNotePlaintextBytes::V2(s.try_into().unwrap()), + COMPACT_NOTE_SIZE_V3 => CompactNotePlaintextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid length for compact note plaintext"), + } + } +} + +/// Newtype for encoding a compact note +#[derive(Clone, Debug)] +pub enum CompactNoteCiphertextBytes { + /// Variant for old compact notes. + V2([u8; COMPACT_NOTE_SIZE_V2]), + /// Variant for new compact notes post ZSA. + V3([u8; COMPACT_NOTE_SIZE_V3]), +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + match self { + CompactNoteCiphertextBytes::V2(x) => x, + CompactNoteCiphertextBytes::V3(x) => x, + } + } +} + +impl OrchardDomain { + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_action(act: &Action) -> Self { + OrchardDomain { + rho: *act.nullifier(), + } + } + + /// Constructs a domain from a nullifier. + pub fn for_nullifier(nullifier: Nullifier) -> Self { + OrchardDomain { rho: nullifier } + } +} + +impl Domain for OrchardDomain { + type EphemeralSecretKey = EphemeralSecretKey; + type EphemeralPublicKey = EphemeralPublicKey; + type PreparedEphemeralPublicKey = EphemeralPublicKey; + type SharedSecret = SharedSecret; + type SymmetricKey = Hash; + type Note = Note; + type Recipient = Address; + type DiversifiedTransmissionKey = DiversifiedTransmissionKey; + type IncomingViewingKey = IncomingViewingKey; + type OutgoingViewingKey = OutgoingViewingKey; + type ValueCommitment = ValueCommitment; + type ExtractedCommitment = ExtractedNoteCommitment; + type ExtractedCommitmentBytes = [u8; 32]; + type Memo = [u8; MEMO_SIZE]; // TODO use a more interesting type + + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + + fn derive_esk(note: &Self::Note) -> Option { + Some(note.esk()) + } + + fn get_pk_d(note: &Self::Note) -> Self::DiversifiedTransmissionKey { + *note.recipient().pk_d() + } + + fn prepare_epk(epk: Self::EphemeralPublicKey) -> Self::PreparedEphemeralPublicKey { + epk + } + + fn ka_derive_public( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> Self::EphemeralPublicKey { + esk.derive_public(note.recipient().g_d()) + } + + fn ka_agree_enc( + esk: &Self::EphemeralSecretKey, + pk_d: &Self::DiversifiedTransmissionKey, + ) -> Self::SharedSecret { + esk.agree(pk_d) + } + + fn ka_agree_dec( + ivk: &Self::IncomingViewingKey, + epk: &Self::PreparedEphemeralPublicKey, + ) -> Self::SharedSecret { + epk.agree(ivk) + } + + fn kdf(secret: Self::SharedSecret, ephemeral_key: &EphemeralKeyBytes) -> Self::SymmetricKey { + secret.kdf_orchard(ephemeral_key) + } + + fn note_plaintext_bytes( + note: &Self::Note, + _: &Self::Recipient, + memo: &Self::Memo, + ) -> NotePlaintextBytes { + let mut np = [0u8; NOTE_PLAINTEXT_SIZE_V3]; + np[0] = 0x03; + np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); + np[12..20].copy_from_slice(¬e.value().to_bytes()); + np[20..52].copy_from_slice(note.rseed().as_bytes()); + let zsa_type = note.asset().to_bytes(); + np[52..84].copy_from_slice(&zsa_type); + np[84..].copy_from_slice(memo); + NotePlaintextBytes::V3(np) + } + + fn derive_ock( + ovk: &Self::OutgoingViewingKey, + cv: &Self::ValueCommitment, + cmstar_bytes: &Self::ExtractedCommitmentBytes, + ephemeral_key: &EphemeralKeyBytes, + ) -> OutgoingCipherKey { + prf_ock_orchard(ovk, cv, cmstar_bytes, ephemeral_key) + } + + fn outgoing_plaintext_bytes( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> OutPlaintextBytes { + let mut op = [0; OUT_PLAINTEXT_SIZE]; + op[..32].copy_from_slice(¬e.recipient().pk_d().to_bytes()); + op[32..].copy_from_slice(&esk.0.to_repr()); + OutPlaintextBytes(op) + } + + fn epk_bytes(epk: &Self::EphemeralPublicKey) -> EphemeralKeyBytes { + epk.to_bytes() + } + + fn epk(ephemeral_key: &EphemeralKeyBytes) -> Option { + EphemeralPublicKey::from_bytes(&ephemeral_key.0).into() + } + + fn cmstar(note: &Self::Note) -> Self::ExtractedCommitment { + note.commitment().into() + } + + fn parse_note_plaintext_without_memo_ivk( + &self, + ivk: &Self::IncomingViewingKey, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + Some(DiversifiedTransmissionKey::derive(ivk, diversifier)) + }) + } + + fn parse_note_plaintext_without_memo_ovk( + &self, + pk_d: &Self::DiversifiedTransmissionKey, + esk: &Self::EphemeralSecretKey, + ephemeral_key: &EphemeralKeyBytes, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + if esk + .derive_public(diversify_hash(diversifier.as_array())) + .to_bytes() + .0 + == ephemeral_key.0 + { + Some(*pk_d) + } else { + None + } + }) + } + + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + match plaintext { + NotePlaintextBytes::V2(np) => { + let (compact, memo) = np.split_at(COMPACT_NOTE_SIZE_V2); + ( + CompactNotePlaintextBytes::V2(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + NotePlaintextBytes::V3(np) => { + let (compact, memo) = np.split_at(COMPACT_NOTE_SIZE_V3); + ( + CompactNotePlaintextBytes::V3(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + } + } + + fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { + DiversifiedTransmissionKey::from_bytes(out_plaintext.0[0..32].try_into().unwrap()).into() + } + + fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option { + EphemeralSecretKey::from_bytes(out_plaintext.0[32..OUT_PLAINTEXT_SIZE].try_into().unwrap()) + .into() + } +} + +impl BatchDomain for OrchardDomain { + fn batch_kdf<'a>( + items: impl Iterator, &'a EphemeralKeyBytes)>, + ) -> Vec> { + let (shared_secrets, ephemeral_keys): (Vec<_>, Vec<_>) = items.unzip(); + + SharedSecret::batch_to_affine(shared_secrets) + .zip(ephemeral_keys.into_iter()) + .map(|(secret, ephemeral_key)| { + secret.map(|dhsecret| SharedSecret::kdf_orchard_inner(dhsecret, ephemeral_key)) + }) + .collect() + } +} + + +/// Implementation of in-band secret distribution for Orchard bundles. +pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; + +impl ShieldedOutput for Action { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.encrypted_note().epk_bytes) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx().to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + let result = self.encrypted_note().enc_ciphertext.clone(); + Some(result) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + match self.encrypted_note().enc_ciphertext { + NoteCiphertextBytes::V2(ncx) => { + CompactNoteCiphertextBytes::V2(ncx[..COMPACT_NOTE_SIZE_V2].try_into().unwrap()) + } + NoteCiphertextBytes::V3(ncx) => { + CompactNoteCiphertextBytes::V3(ncx[..COMPACT_NOTE_SIZE_V3].try_into().unwrap()) + } + } + } +} + +/// A compact Action for light clients. +pub struct CompactAction { + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, +} + +impl fmt::Debug for CompactAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CompactAction") + } +} + +impl From<&Action> for CompactAction { + fn from(action: &Action) -> Self { + let comp_ciphertext: CompactNoteCiphertextBytes = + match action.encrypted_note().enc_ciphertext { + NoteCiphertextBytes::V2(ncx) => { + CompactNoteCiphertextBytes::V2(ncx[..COMPACT_NOTE_SIZE_V2].try_into().unwrap()) + } + NoteCiphertextBytes::V3(ncx) => { + CompactNoteCiphertextBytes::V3(ncx[..COMPACT_NOTE_SIZE_V3].try_into().unwrap()) + } + }; + CompactAction { + nullifier: *action.nullifier(), + cmx: *action.cmx(), + ephemeral_key: action.ephemeral_key(), + enc_ciphertext: comp_ciphertext, + } + } +} + +impl ShieldedOutput for CompactAction { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.ephemeral_key.0) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx.to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + &self.enc_ciphertext + } +} + +impl CompactAction { + /// Create a CompactAction from its constituent parts + pub fn from_parts( + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, + ) -> Self { + Self { + nullifier, + cmx, + ephemeral_key, + enc_ciphertext, + } + } + + ///Returns the nullifier of the note being spent. + pub fn nullifier(&self) -> Nullifier { + self.nullifier + } +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use rand::rngs::OsRng; + use zcash_note_encryption::{ + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, + EphemeralKeyBytes, + }; + + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use crate::note::AssetId; + use crate::note_encryption::NoteCiphertextBytes; + use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, + OutgoingViewingKey, + }, + note::{ + testing::arb_note, ExtractedNoteCommitment, Nullifier, RandomSeed, + TransmittedNoteCiphertext, + }, + primitives::redpallas, + value::{NoteValue, ValueCommitment}, + Address, Note, + }; + + use super::{version, orchard_parse_note_plaintext_without_memo}; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(100)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomain::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomain { rho: note.rho() }; + let parsed_version = version(plaintext.as_mut()).unwrap(); + let (mut compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact.as_mut(), + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + assert_eq!(&parsed_memo, memo); + assert_eq!(parsed_version, 0x03); + } + } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::note_encryption::test_vectors(); + + for tv in test_vectors { + // + // Load the test vector components + // + + // Recipient key material + let ivk = IncomingViewingKey::from_bytes(&tv.incoming_viewing_key).unwrap(); + let ovk = OutgoingViewingKey::from(tv.ovk); + let d = Diversifier::from_bytes(tv.default_d); + let pk_d = DiversifiedTransmissionKey::from_bytes(&tv.default_pk_d).unwrap(); + + // Received Action + let cv_net = ValueCommitment::from_bytes(&tv.cv_net).unwrap(); + let rho = Nullifier::from_bytes(&tv.rho).unwrap(); + let cmx = ExtractedNoteCommitment::from_bytes(&tv.cmx).unwrap(); + + let esk = EphemeralSecretKey::from_bytes(&tv.esk).unwrap(); + let ephemeral_key = EphemeralKeyBytes(tv.ephemeral_key); + + // Details about the expected note + let value = NoteValue::from_raw(tv.v); + let rseed = RandomSeed::from_bytes(tv.rseed, &rho).unwrap(); + + // + // Test the individual components + // + + let shared_secret = esk.agree(&pk_d); + assert_eq!(shared_secret.to_bytes(), tv.shared_secret); + + let k_enc = shared_secret.kdf_orchard(&ephemeral_key); + assert_eq!(k_enc.as_bytes(), tv.k_enc); + + let ock = prf_ock_orchard(&ovk, &cv_net, &cmx.to_bytes(), &ephemeral_key); + assert_eq!(ock.as_ref(), tv.ock); + + let recipient = Address::from_parts(d, pk_d); + + let asset = match tv.asset { + None => AssetId::native(), + Some(type_bytes) => AssetId::from_bytes(&type_bytes).unwrap(), + }; + + let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); + assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); + + let action = Action::from_parts( + // rho is the nullifier in the receiving Action. + rho, + // We don't need a valid rk for this test. + redpallas::VerificationKey::dummy(), + cmx, + TransmittedNoteCiphertext { + epk_bytes: ephemeral_key.0, + enc_ciphertext: NoteCiphertextBytes::V3(tv.c_enc), // TODO: VA: Would need a mix of V2 and V3 eventually + out_ciphertext: tv.c_out, + }, + cv_net.clone(), + (), + ); + + // + // Test decryption + // (Tested first because it only requires immutable references.) + // + + let domain = OrchardDomain { rho }; + + match try_note_decryption(&domain, &ivk, &action) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Note decryption failed"), + } + + match try_compact_note_decryption(&domain, &ivk, &CompactAction::from(&action)) { + Some((decrypted_note, decrypted_to)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + } + None => panic!("Compact note decryption failed"), + } + + match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Output recovery failed"), + } + + // + // Test encryption + // + + let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, recipient, tv.memo); + + // assert_eq!(ne.encrypt_note_plaintext().as_ref(), &tv.c_enc[..]); + assert_eq!( + &ne.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut OsRng)[..], + &tv.c_out[..] + ); + } + } +} diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs new file mode 100644 index 000000000..c8a772ffe --- /dev/null +++ b/src/note_encryption_v3.rs @@ -0,0 +1,634 @@ +//! In-band secret distribution for Orchard bundles. + +use blake2b_simd::{Hash, Params}; +use core::fmt; +use group::ff::PrimeField; +use zcash_note_encryption::{ + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, +}; + +use crate::note::AssetId; +use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralPublicKey, EphemeralSecretKey, + OutgoingViewingKey, PreparedEphemeralPublicKey, PreparedIncomingViewingKey, SharedSecret, + }, + note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, + spec::diversify_hash, + value::{NoteValue, ValueCommitment}, + Address, Note, +}; + +const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; + +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. + +/// The size of the encoding of a ZSA asset id. +const ZSA_ASSET_SIZE: usize = 32; +/// The size of a v3 compact note. +pub const COMPACT_NOTE_SIZE_V3: usize = COMPACT_NOTE_SIZE_V2 + ZSA_ASSET_SIZE; +/// The size of [`NotePlaintextBytes`] for V3. +pub const NOTE_PLAINTEXT_SIZE_V3: usize = COMPACT_NOTE_SIZE_V3 + MEMO_SIZE; +/// The size of the encrypted ciphertext of the ZSA variant of a note. +pub const ENC_CIPHERTEXT_SIZE_V3: usize = NOTE_PLAINTEXT_SIZE_V3 + AEAD_TAG_SIZE; + +/// a type to represent the raw bytes of a note plaintext. +#[derive(Clone, Debug)] +pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE_V3]); + +/// a type to represent the raw bytes of an encrypted note plaintext. +#[derive(Clone, Debug)] +pub struct NoteCiphertextBytes(pub [u8; ENC_CIPHERTEXT_SIZE_V3]); + +/// a type to represent the raw bytes of a compact note. +#[derive(Clone, Debug)] +pub struct CompactNotePlaintextBytes(pub [u8; COMPACT_NOTE_SIZE_V3]); + +/// a type to represent the raw bytes of an encrypted compact note. +#[derive(Clone, Debug)] +pub struct CompactNoteCiphertextBytes(pub [u8; COMPACT_NOTE_SIZE_V3]); + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NoteCiphertextBytes(s.try_into().unwrap()) + } +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + CompactNotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +/// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. +/// +/// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs +pub(crate) fn prf_ock_orchard( + ovk: &OutgoingViewingKey, + cv: &ValueCommitment, + cmx_bytes: &[u8; 32], + ephemeral_key: &EphemeralKeyBytes, +) -> OutgoingCipherKey { + OutgoingCipherKey( + Params::new() + .hash_length(32) + .personal(PRF_OCK_ORCHARD_PERSONALIZATION) + .to_state() + .update(ovk.as_ref()) + .update(&cv.to_bytes()) + .update(cmx_bytes) + .update(ephemeral_key.as_ref()) + .finalize() + .as_bytes() + .try_into() + .unwrap(), + ) +} + +/// note_version will return the version of the note plaintext. +pub fn note_version(plaintext: &[u8]) -> Option { + match plaintext[0] { + 0x02 => Some(0x02), + 0x03 => Some(0x03), + _ => None, + } +} + +/// Domain-specific requirements: +/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. +fn orchard_parse_note_plaintext_without_memo( + domain: &OrchardDomainV3, + plaintext: &CompactNotePlaintextBytes, + get_validated_pk_d: F, +) -> Option<(Note, Address)> +where + F: FnOnce(&Diversifier) -> Option, +{ + // The unwraps below are guaranteed to succeed by the assertion above + let diversifier = Diversifier::from_bytes(plaintext.0[1..12].try_into().unwrap()); + let value = NoteValue::from_bytes(plaintext.0[12..20].try_into().unwrap()); + let rseed = Option::from(RandomSeed::from_bytes( + plaintext.0[20..COMPACT_NOTE_SIZE_V2].try_into().unwrap(), + &domain.rho, + ))?; + let pk_d = get_validated_pk_d(&diversifier)?; + let recipient = Address::from_parts(diversifier, pk_d); + + let asset = match note_version(plaintext.0.as_ref())? { + 0x02 => AssetId::native(), + 0x03 => { + let bytes = plaintext.0[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(); + AssetId::from_bytes(bytes).unwrap() + } + _ => panic!("invalid note version"), + }; + + let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; + Some((note, recipient)) +} + +/// Orchard-specific note encryption logic. +#[derive(Debug)] +pub struct OrchardDomainV3 { + rho: Nullifier, +} + +impl OrchardDomainV3 { + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_action(act: &Action) -> Self { + OrchardDomainV3 { + rho: *act.nullifier(), + } + } + + /// Constructs a domain from a nullifier. + pub fn for_nullifier(nullifier: Nullifier) -> Self { + OrchardDomainV3 { rho: nullifier } + } +} + +impl Domain for OrchardDomainV3 { + type EphemeralSecretKey = EphemeralSecretKey; + type EphemeralPublicKey = EphemeralPublicKey; + type PreparedEphemeralPublicKey = PreparedEphemeralPublicKey; + type SharedSecret = SharedSecret; + type SymmetricKey = Hash; + type Note = Note; + type Recipient = Address; + type DiversifiedTransmissionKey = DiversifiedTransmissionKey; + type IncomingViewingKey = PreparedIncomingViewingKey; + type OutgoingViewingKey = OutgoingViewingKey; + type ValueCommitment = ValueCommitment; + type ExtractedCommitment = ExtractedNoteCommitment; + type ExtractedCommitmentBytes = [u8; 32]; + type Memo = [u8; MEMO_SIZE]; + + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + + fn derive_esk(note: &Self::Note) -> Option { + Some(note.esk()) + } + + fn get_pk_d(note: &Self::Note) -> Self::DiversifiedTransmissionKey { + *note.recipient().pk_d() + } + + fn prepare_epk(epk: Self::EphemeralPublicKey) -> Self::PreparedEphemeralPublicKey { + PreparedEphemeralPublicKey::new(epk) + } + + fn ka_derive_public( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> Self::EphemeralPublicKey { + esk.derive_public(note.recipient().g_d()) + } + + fn ka_agree_enc( + esk: &Self::EphemeralSecretKey, + pk_d: &Self::DiversifiedTransmissionKey, + ) -> Self::SharedSecret { + esk.agree(pk_d) + } + + fn ka_agree_dec( + ivk: &Self::IncomingViewingKey, + epk: &Self::PreparedEphemeralPublicKey, + ) -> Self::SharedSecret { + epk.agree(ivk) + } + + fn kdf(secret: Self::SharedSecret, ephemeral_key: &EphemeralKeyBytes) -> Self::SymmetricKey { + secret.kdf_orchard(ephemeral_key) + } + + fn note_plaintext_bytes( + note: &Self::Note, + _: &Self::Recipient, + memo: &Self::Memo, + ) -> NotePlaintextBytes { + let mut np = [0u8; NOTE_PLAINTEXT_SIZE_V3]; + np[0] = 0x03; + np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); + np[12..20].copy_from_slice(¬e.value().to_bytes()); + np[20..52].copy_from_slice(note.rseed().as_bytes()); + np[52..84].copy_from_slice(¬e.asset().to_bytes()); + np[84..].copy_from_slice(memo); + NotePlaintextBytes(np) + } + + fn derive_ock( + ovk: &Self::OutgoingViewingKey, + cv: &Self::ValueCommitment, + cmstar_bytes: &Self::ExtractedCommitmentBytes, + ephemeral_key: &EphemeralKeyBytes, + ) -> OutgoingCipherKey { + prf_ock_orchard(ovk, cv, cmstar_bytes, ephemeral_key) + } + + fn outgoing_plaintext_bytes( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> OutPlaintextBytes { + let mut op = [0; OUT_PLAINTEXT_SIZE]; + op[..32].copy_from_slice(¬e.recipient().pk_d().to_bytes()); + op[32..].copy_from_slice(&esk.0.to_repr()); + OutPlaintextBytes(op) + } + + fn epk_bytes(epk: &Self::EphemeralPublicKey) -> EphemeralKeyBytes { + epk.to_bytes() + } + + fn epk(ephemeral_key: &EphemeralKeyBytes) -> Option { + EphemeralPublicKey::from_bytes(&ephemeral_key.0).into() + } + + fn cmstar(note: &Self::Note) -> Self::ExtractedCommitment { + note.commitment().into() + } + + fn parse_note_plaintext_without_memo_ivk( + &self, + ivk: &Self::IncomingViewingKey, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + Some(DiversifiedTransmissionKey::derive(ivk, diversifier)) + }) + } + + fn parse_note_plaintext_without_memo_ovk( + &self, + pk_d: &Self::DiversifiedTransmissionKey, + esk: &Self::EphemeralSecretKey, + ephemeral_key: &EphemeralKeyBytes, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + if esk + .derive_public(diversify_hash(diversifier.as_array())) + .to_bytes() + .0 + == ephemeral_key.0 + { + Some(*pk_d) + } else { + None + } + }) + } + + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE_V3); + ( + CompactNotePlaintextBytes(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + + fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { + DiversifiedTransmissionKey::from_bytes(out_plaintext.0[0..32].try_into().unwrap()).into() + } + + fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option { + EphemeralSecretKey::from_bytes(out_plaintext.0[32..OUT_PLAINTEXT_SIZE].try_into().unwrap()) + .into() + } +} + +impl BatchDomain for OrchardDomainV3 { + fn batch_kdf<'a>( + items: impl Iterator, &'a EphemeralKeyBytes)>, + ) -> Vec> { + let (shared_secrets, ephemeral_keys): (Vec<_>, Vec<_>) = items.unzip(); + + SharedSecret::batch_to_affine(shared_secrets) + .zip(ephemeral_keys.into_iter()) + .map(|(secret, ephemeral_key)| { + secret.map(|dhsecret| SharedSecret::kdf_orchard_inner(dhsecret, ephemeral_key)) + }) + .collect() + } +} + +/// Implementation of in-band secret distribution for Orchard bundles. +pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; + +impl ShieldedOutput for Action { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.encrypted_note().epk_bytes) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx().to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + Some(NoteCiphertextBytes(self.encrypted_note().enc_ciphertext)) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes( + self.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(), + ) + } +} + +/// A compact Action for light clients. +pub struct CompactAction { + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, +} + +impl fmt::Debug for CompactAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CompactAction") + } +} + +impl From<&Action> for CompactAction +where + Action: ShieldedOutput, +{ + fn from(action: &Action) -> Self { + CompactAction { + nullifier: *action.nullifier(), + cmx: *action.cmx(), + ephemeral_key: action.ephemeral_key(), + enc_ciphertext: CompactNoteCiphertextBytes( + action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(), + ), + } + } +} + +impl ShieldedOutput for CompactAction { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.ephemeral_key.0) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx.to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + self.enc_ciphertext.clone() + } +} + +impl CompactAction { + /// Create a CompactAction from its constituent parts + pub fn from_parts( + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, + ) -> Self { + Self { + nullifier, + cmx, + ephemeral_key, + enc_ciphertext, + } + } + + ///Returns the nullifier of the note being spent. + pub fn nullifier(&self) -> Nullifier { + self.nullifier + } +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use rand::rngs::OsRng; + use zcash_note_encryption::{ + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, + EphemeralKeyBytes, + }; + + use super::{ + note_version, orchard_parse_note_plaintext_without_memo, prf_ock_orchard, CompactAction, + OrchardDomainV3, OrchardNoteEncryption, + }; + use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, + OutgoingViewingKey, PreparedIncomingViewingKey, + }, + note::{ + testing::arb_note, AssetId, ExtractedNoteCommitment, Nullifier, RandomSeed, + TransmittedNoteCiphertext, + }, + primitives::redpallas, + value::{NoteValue, ValueCommitment}, + Address, Note, + }; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(100)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomainV3::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomainV3 { rho: note.rho() }; + let parsed_version = note_version(plaintext.as_mut()).unwrap(); + let (compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact, + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + assert_eq!(&parsed_memo, memo); + assert_eq!(parsed_version, 0x03); + } + } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::note_encryption_v3::test_vectors(); + + for tv in test_vectors { + // + // Load the test vector components + // + + // Recipient key material + let ivk = PreparedIncomingViewingKey::new( + &IncomingViewingKey::from_bytes(&tv.incoming_viewing_key).unwrap(), + ); + let ovk = OutgoingViewingKey::from(tv.ovk); + let d = Diversifier::from_bytes(tv.default_d); + let pk_d = DiversifiedTransmissionKey::from_bytes(&tv.default_pk_d).unwrap(); + + // Received Action + let cv_net = ValueCommitment::from_bytes(&tv.cv_net).unwrap(); + let rho = Nullifier::from_bytes(&tv.rho).unwrap(); + let cmx = ExtractedNoteCommitment::from_bytes(&tv.cmx).unwrap(); + + let esk = EphemeralSecretKey::from_bytes(&tv.esk).unwrap(); + let ephemeral_key = EphemeralKeyBytes(tv.ephemeral_key); + + // Details about the expected note + let value = NoteValue::from_raw(tv.v); + let rseed = RandomSeed::from_bytes(tv.rseed, &rho).unwrap(); + + // + // Test the individual components + // + + let shared_secret = esk.agree(&pk_d); + assert_eq!(shared_secret.to_bytes(), tv.shared_secret); + + let k_enc = shared_secret.kdf_orchard(&ephemeral_key); + assert_eq!(k_enc.as_bytes(), tv.k_enc); + + let ock = prf_ock_orchard(&ovk, &cv_net, &cmx.to_bytes(), &ephemeral_key); + assert_eq!(ock.as_ref(), tv.ock); + + let recipient = Address::from_parts(d, pk_d); + + let asset = AssetId::from_bytes(&tv.asset).unwrap(); + + let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); + assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); + + let action = Action::from_parts( + // rho is the nullifier in the receiving Action. + rho, + // We don't need a valid rk for this test. + redpallas::VerificationKey::dummy(), + cmx, + TransmittedNoteCiphertext { + epk_bytes: ephemeral_key.0, + enc_ciphertext: tv.c_enc, + out_ciphertext: tv.c_out, + }, + cv_net.clone(), + (), + ); + + // + // Test decryption + // (Tested first because it only requires immutable references.) + // + + let domain = OrchardDomainV3 { rho }; + + match try_note_decryption(&domain, &ivk, &action) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Note decryption failed"), + } + + match try_compact_note_decryption(&domain, &ivk, &CompactAction::from(&action)) { + Some((decrypted_note, decrypted_to)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + } + None => panic!("Compact note decryption failed"), + } + + match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Output recovery failed"), + } + + // + // Test encryption + // + + let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, recipient, tv.memo); + + assert_eq!(ne.encrypt_note_plaintext().as_ref(), &tv.c_enc[..]); + assert_eq!( + &ne.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut OsRng)[..], + &tv.c_out[..] + ); + } + } +} diff --git a/src/test_vectors.rs b/src/test_vectors.rs index b70b56e56..945cfc2b7 100644 --- a/src/test_vectors.rs +++ b/src/test_vectors.rs @@ -3,3 +3,4 @@ pub(crate) mod commitment_tree; pub(crate) mod keys; pub(crate) mod merkle_path; pub(crate) mod note_encryption; +pub(crate) mod note_encryption_v3; diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index f1c6126cc..7a5a73a56 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -1,6 +1,5 @@ -// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_note_encryption) - pub(crate) struct TestVector { + // make all fields public so we can use them in the test pub(crate) incoming_viewing_key: [u8; 64], pub(crate) ovk: [u8; 32], pub(crate) default_d: [u8; 11], @@ -20,9 +19,9 @@ pub(crate) struct TestVector { pub(crate) ock: [u8; 32], pub(crate) op: [u8; 64], pub(crate) c_out: [u8; 80], - pub(crate) asset: Option<[u8; 32]>, } +// From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_note_encryption.py pub(crate) fn test_vectors() -> Vec { vec![ TestVector { @@ -233,7 +232,6 @@ pub(crate) fn test_vectors() -> Vec { 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -443,7 +441,6 @@ pub(crate) fn test_vectors() -> Vec { 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -653,7 +650,6 @@ pub(crate) fn test_vectors() -> Vec { 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -863,7 +859,6 @@ pub(crate) fn test_vectors() -> Vec { 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -1073,7 +1068,6 @@ pub(crate) fn test_vectors() -> Vec { 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -1283,7 +1277,6 @@ pub(crate) fn test_vectors() -> Vec { 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -1493,7 +1486,6 @@ pub(crate) fn test_vectors() -> Vec { 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -1703,7 +1695,6 @@ pub(crate) fn test_vectors() -> Vec { 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -1913,7 +1904,6 @@ pub(crate) fn test_vectors() -> Vec { 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, ], - asset: None, }, TestVector { incoming_viewing_key: [ @@ -2123,2147 +2113,6 @@ pub(crate) fn test_vectors() -> Vec { 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, ], - asset: None, - }, - TestVector { - incoming_viewing_key: [ - 0xdc, 0x10, 0x95, 0x20, 0x57, 0xc4, 0xbe, 0xaa, 0xd8, 0xaf, 0x37, 0xce, 0x4e, 0xee, - 0x9b, 0x10, 0xed, 0x84, 0xf4, 0x6b, 0xad, 0xd4, 0x8e, 0x0a, 0x22, 0x9b, 0xe8, 0x41, - 0x54, 0xa9, 0xbf, 0x75, 0x6b, 0xe0, 0x2e, 0xcf, 0xa9, 0xad, 0x6d, 0x9c, 0x02, 0xc8, - 0xf9, 0x54, 0xcb, 0x15, 0x71, 0x7b, 0x79, 0x46, 0x1f, 0x00, 0x4b, 0xf1, 0xbc, 0x5c, - 0x7e, 0x3f, 0xda, 0x73, 0x53, 0x7c, 0x1a, 0x0a, - ], - ovk: [ - 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, - 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, - 0x0f, 0x26, 0x3b, 0x35, - ], - default_d: [ - 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, - ], - default_pk_d: [ - 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, - 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, - 0xe6, 0x84, 0x45, 0xbb, - ], - v: 2111628168871420429, - rseed: [ - 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, - 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, - 0x3b, 0xd5, 0xbc, 0x87, - ], - memo: [ - 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, - 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, - 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, - 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, - 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, - 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, - 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, - 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, - 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, - 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, - 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, - 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, - 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, - 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, - 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, - 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, - 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, - 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, - 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, - 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, - 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, - 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, - 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, - 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, - 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, - 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, - 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, - 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, - 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, - 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, - 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, - 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, - 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, - 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, - 0xd8, 0x02, 0xf7, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0xba, 0x69, 0x9c, 0xe4, 0x21, 0x41, 0x85, 0x30, 0x94, 0xe2, 0x84, 0x00, 0x50, 0x17, - 0x2c, 0x3b, 0x94, 0x21, 0x3e, 0x86, 0x47, 0x3b, 0x5e, 0x2f, 0xdd, 0x70, 0x97, 0x80, - 0xbc, 0xca, 0x68, 0xb4, - ], - rho: [ - 0xf6, 0x5d, 0x22, 0x96, 0x09, 0x58, 0xd7, 0x28, 0x59, 0x60, 0x9c, 0x99, 0x46, 0xd8, - 0xa9, 0x4a, 0x06, 0x04, 0xb8, 0x00, 0x6c, 0xc7, 0x94, 0xbc, 0xab, 0x57, 0x73, 0x49, - 0xbc, 0xf8, 0x63, 0x37, - ], - cmx: [ - 0x85, 0xec, 0x16, 0xe8, 0x78, 0x77, 0x33, 0x37, 0x07, 0x9a, 0xec, 0xf3, 0x2c, 0x45, - 0x5e, 0xbf, 0x16, 0x96, 0x8d, 0xa1, 0xd4, 0x34, 0x51, 0xb7, 0xa3, 0x06, 0x87, 0x6c, - 0xa3, 0x08, 0xea, 0x3c, - ], - esk: [ - 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, 0x39, 0x16, 0x0f, 0xe5, - 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, 0xe0, 0xd2, 0x9b, 0x35, - 0x9a, 0xc4, 0xfa, 0x2c, - ], - ephemeral_key: [ - 0x10, 0x0d, 0xf0, 0x1d, 0x49, 0x86, 0x01, 0x21, 0x8a, 0x28, 0x6b, 0x8f, 0x4e, 0x54, - 0xda, 0x9b, 0x3f, 0x14, 0x5c, 0x34, 0x70, 0xa9, 0xdb, 0xc4, 0x14, 0x48, 0x0a, 0xa8, - 0xf2, 0xf4, 0x90, 0x9c, - ], - shared_secret: [ - 0x93, 0x68, 0xdd, 0x4f, 0x2a, 0xf6, 0x23, 0x34, 0xb8, 0x85, 0xb9, 0x6b, 0xc4, 0xc3, - 0x8f, 0x10, 0x3a, 0xec, 0x25, 0x6b, 0xed, 0xc2, 0x8b, 0x5e, 0x2e, 0x10, 0x36, 0x4c, - 0xdd, 0xf3, 0x84, 0xa4, - ], - k_enc: [ - 0x7a, 0xff, 0xfc, 0x6e, 0xae, 0x5d, 0x56, 0xb2, 0x7b, 0x86, 0xdb, 0x9e, 0xc8, 0xae, - 0xc2, 0x70, 0xbb, 0x0a, 0xb7, 0x31, 0x23, 0xfd, 0x2a, 0x0b, 0x83, 0xf4, 0xef, 0x84, - 0xc6, 0x98, 0xe1, 0x67, - ], - p_enc: [ - 0x03, 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, 0x0d, 0x22, - 0x4a, 0xb7, 0xa1, 0x02, 0x4e, 0x1d, 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, - 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, - 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, 0x3b, 0xd5, 0xbc, 0x87, 0xa9, 0x71, 0x5e, 0x65, - 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, - 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, - 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, - 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, - 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, - 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, - 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, - 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, - 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, - 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, - 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, - 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, - 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, - 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, - 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, - 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, - 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, - 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, - 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, - 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, - 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, - 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, - 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, - 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, - 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, - 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, - 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, - 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, - 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, - 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, - 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, - 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, - 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, - 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, - 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, - 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, - 0xd8, 0x02, 0xf7, 0x73, - ], - c_enc: [ - 0x45, 0x6b, 0x2b, 0xb8, 0x03, 0xc7, 0xdf, 0xf7, 0xac, 0x82, 0xe6, 0x42, 0xf4, 0xd8, - 0x46, 0x1e, 0x0b, 0x7a, 0x3b, 0x3c, 0x95, 0xa4, 0xcb, 0xf1, 0xc0, 0x6f, 0xeb, 0x93, - 0xa1, 0x8b, 0xeb, 0xa2, 0x9f, 0x2b, 0x8f, 0x12, 0x1a, 0x61, 0x5c, 0xa5, 0x3f, 0xc2, - 0xa7, 0x60, 0x63, 0xb8, 0x0d, 0xaa, 0x71, 0x01, 0x8b, 0x66, 0x3b, 0x7c, 0x46, 0x6d, - 0xb2, 0x63, 0xf9, 0x04, 0x27, 0xd0, 0x11, 0x7f, 0x0b, 0x89, 0x90, 0x6e, 0x98, 0x41, - 0x7f, 0x3e, 0xe8, 0x5a, 0xcc, 0xed, 0xb1, 0x41, 0xfb, 0x10, 0x26, 0xa3, 0xb3, 0xf7, - 0xa4, 0xfd, 0x10, 0x24, 0xf9, 0xc8, 0x08, 0x9a, 0x2e, 0xbe, 0x1a, 0x27, 0x82, 0xf8, - 0xb0, 0xbf, 0x5c, 0x40, 0xb6, 0xd5, 0x2f, 0xfe, 0x38, 0x37, 0xf4, 0xe4, 0x42, 0x52, - 0x13, 0x41, 0xc2, 0x4d, 0x3e, 0x89, 0x55, 0x95, 0x08, 0x86, 0x27, 0x85, 0xea, 0x63, - 0x56, 0xb4, 0xe4, 0x66, 0xc3, 0x25, 0x9c, 0xeb, 0x0d, 0x28, 0x2e, 0x07, 0xbb, 0x35, - 0xdc, 0xf2, 0xd9, 0xa8, 0x62, 0xc7, 0x47, 0x58, 0xd3, 0x83, 0xaa, 0xa2, 0x82, 0xfa, - 0xc4, 0xfa, 0xcf, 0xe5, 0x39, 0xe4, 0xe1, 0xbb, 0xd5, 0x46, 0x8a, 0xcf, 0x25, 0xec, - 0x2b, 0x4b, 0xa5, 0x11, 0x9d, 0xea, 0xed, 0x01, 0x1d, 0x4f, 0x30, 0xb0, 0xc5, 0x82, - 0x01, 0xfe, 0xe1, 0xc6, 0xe4, 0xf6, 0xb5, 0x2e, 0x41, 0xad, 0xfa, 0x5d, 0x6f, 0xda, - 0x94, 0xa5, 0x23, 0x20, 0xe8, 0x3b, 0x80, 0xc6, 0xfc, 0xee, 0xb8, 0x97, 0x89, 0xd8, - 0x79, 0x94, 0xb7, 0xa0, 0x16, 0xec, 0x64, 0xe4, 0x70, 0x78, 0x07, 0xf8, 0xf2, 0xd2, - 0x30, 0x63, 0x10, 0x74, 0x10, 0x9f, 0xc5, 0x9d, 0xe3, 0xe4, 0x37, 0x10, 0xca, 0xe8, - 0x9c, 0xb1, 0x89, 0xa0, 0xa4, 0x64, 0x8b, 0x37, 0x54, 0x5d, 0x25, 0x49, 0x47, 0x95, - 0xa8, 0xdf, 0x3f, 0xfc, 0x7a, 0x3a, 0x21, 0xe3, 0xb9, 0x1c, 0x95, 0x96, 0xe0, 0xd5, - 0x10, 0x5d, 0xf8, 0xad, 0xa9, 0xcf, 0xe9, 0x31, 0x10, 0xb1, 0x9f, 0xf2, 0xaf, 0x83, - 0x03, 0xb5, 0xd2, 0x79, 0x3f, 0xff, 0xd0, 0x4d, 0x8e, 0x02, 0xf7, 0xb9, 0x30, 0x14, - 0x80, 0xdf, 0xd9, 0x35, 0x50, 0x2d, 0x98, 0xe2, 0xf3, 0xc3, 0xe9, 0xe9, 0x5e, 0x64, - 0xe4, 0x96, 0xeb, 0x7d, 0x15, 0xcf, 0x2c, 0x70, 0x11, 0x94, 0xe6, 0x25, 0xde, 0x52, - 0x1a, 0x02, 0x55, 0x20, 0xdf, 0x67, 0xac, 0x2b, 0xa4, 0x3b, 0x9c, 0x4a, 0x6d, 0x77, - 0xb8, 0x6a, 0x40, 0x18, 0x2d, 0x70, 0x31, 0x8b, 0x8f, 0xa3, 0x48, 0xb1, 0x86, 0x47, - 0xd8, 0x4e, 0x0e, 0xe5, 0xf0, 0x56, 0x07, 0xa2, 0xb8, 0xf2, 0x69, 0xe1, 0x86, 0xc7, - 0x94, 0x28, 0xbe, 0xa6, 0x7c, 0xbf, 0x71, 0xda, 0xcc, 0x98, 0xe9, 0xcc, 0x72, 0x5e, - 0x50, 0x53, 0xa4, 0x40, 0xca, 0xa6, 0xca, 0xd2, 0x41, 0xa5, 0x06, 0x28, 0x18, 0x3a, - 0xe9, 0xef, 0x9f, 0x0c, 0xbd, 0xfe, 0xf7, 0x0a, 0x42, 0xe5, 0xb7, 0x97, 0xbc, 0x99, - 0xd9, 0x22, 0xfc, 0xc2, 0x81, 0x37, 0x84, 0xea, 0xe4, 0x48, 0x60, 0x18, 0x0e, 0xf8, - 0xe8, 0x1f, 0x7b, 0x94, 0xf2, 0xad, 0x62, 0x12, 0x8b, 0xb6, 0x1f, 0x10, 0xd5, 0x0c, - 0x9c, 0xad, 0x9d, 0x80, 0x48, 0xd9, 0x78, 0x01, 0x8a, 0x1f, 0x3b, 0xc9, 0x24, 0x28, - 0xf8, 0x9d, 0x7d, 0xdc, 0xe5, 0x45, 0x4b, 0xc4, 0x49, 0x1f, 0xb4, 0xc2, 0xcb, 0x66, - 0x88, 0x35, 0xb2, 0x2f, 0xcc, 0x4d, 0xf2, 0x08, 0xf2, 0x16, 0x64, 0xf7, 0x12, 0x94, - 0xc5, 0xce, 0xd3, 0x3c, 0x8e, 0x11, 0xd4, 0x25, 0xd1, 0x39, 0x85, 0x23, 0xc2, 0x79, - 0x88, 0x3a, 0x38, 0x2f, 0x70, 0xfe, 0xfe, 0xc8, 0x25, 0xc5, 0xe3, 0x50, 0x85, 0xaf, - 0x82, 0xd0, 0xa0, 0xa9, 0xbf, 0x45, 0x11, 0x65, 0x0a, 0x2b, 0xfb, 0xf0, 0xb2, 0x18, - 0x82, 0x10, 0x5e, 0xc6, 0xe5, 0x99, 0x74, 0xd8, 0xd6, 0xce, 0x73, 0x07, 0x8f, 0xb4, - 0xb5, 0x63, 0x4e, 0x85, 0xd7, 0xe2, 0x0a, 0x97, 0xff, 0xb6, 0x5d, 0x4f, 0x5e, 0xaf, - 0x42, 0x63, 0x9b, 0x09, 0xf5, 0xed, 0xa5, 0x9a, 0xb1, 0x04, 0x97, 0x69, 0x95, 0x41, - 0xd1, 0xc8, 0x22, 0x8e, 0xb5, 0xdf, 0x47, 0xa6, 0x67, 0xc4, 0x6d, 0x4c, 0xff, 0xeb, - 0xfe, 0x3f, 0xbb, 0x0a, 0x4e, 0x48, - ], - ock: [ - 0xc6, 0x7c, 0x23, 0x33, 0xc3, 0xcf, 0x4a, 0xc4, 0x6e, 0xde, 0x34, 0xe3, 0xe3, 0xe0, - 0xdb, 0xff, 0x1e, 0x96, 0xb7, 0xa7, 0x8f, 0x16, 0xaa, 0xef, 0x1c, 0x74, 0xa3, 0xef, - 0x07, 0xc5, 0x97, 0x16, - ], - op: [ - 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, - 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, - 0xe6, 0x84, 0x45, 0xbb, 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, - 0x39, 0x16, 0x0f, 0xe5, 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, - 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, - ], - c_out: [ - 0xe4, 0xba, 0x0e, 0xa2, 0x92, 0x3b, 0x40, 0x19, 0xac, 0x8a, 0xbc, 0xd1, 0x9b, 0xe6, - 0x1c, 0x90, 0xf1, 0x8e, 0xef, 0xae, 0x87, 0xc4, 0xed, 0x8c, 0x76, 0x70, 0x85, 0xba, - 0xa8, 0x3b, 0x4d, 0x61, 0x0c, 0xf3, 0x63, 0x70, 0xda, 0x07, 0x90, 0x1e, 0xad, 0x6d, - 0x4f, 0x4b, 0x71, 0xdc, 0xae, 0x31, 0x1f, 0xa0, 0x36, 0x40, 0x6d, 0x64, 0x7b, 0x7e, - 0xe1, 0x41, 0x1e, 0xf5, 0xae, 0xe0, 0x34, 0x68, 0xb1, 0x09, 0x13, 0xc9, 0x90, 0xcb, - 0x61, 0x61, 0x22, 0xeb, 0xbe, 0x49, 0xda, 0x67, 0x81, 0xc2, - ], - asset: Some([ - 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, - 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, - 0x4f, 0x95, 0x22, 0xb2, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0xb6, 0x6c, 0x73, 0x33, 0x75, 0xda, 0xc6, 0xff, 0xcc, 0x98, 0xf5, 0x0f, 0x3a, 0xf0, - 0xb0, 0x76, 0x05, 0x53, 0xfe, 0x98, 0xed, 0x61, 0xff, 0xa4, 0x93, 0xea, 0xe6, 0x8d, - 0xf0, 0xb3, 0x33, 0x4e, 0xe8, 0xd4, 0x39, 0x37, 0xb7, 0xdb, 0x8e, 0xbb, 0xfe, 0xbd, - 0x54, 0x8a, 0x28, 0x02, 0x51, 0xea, 0x87, 0xaa, 0x5d, 0x8c, 0xa5, 0x36, 0x86, 0x1b, - 0x38, 0x4f, 0x20, 0x86, 0x9f, 0x8f, 0xe8, 0x01, - ], - ovk: [ - 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, 0x3f, 0x38, 0x0a, 0x4d, - 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, 0x3d, 0x73, 0x45, 0x9a, - 0xfe, 0x24, 0x1f, 0x72, - ], - default_d: [ - 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, - ], - default_pk_d: [ - 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, - 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, - 0x25, 0xc8, 0xd6, 0xae, - ], - v: 16065731808124965111, - rseed: [ - 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, - 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, - 0x71, 0x8c, 0x29, 0xdd, - ], - memo: [ - 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, - 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, - 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, - 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, - 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, - 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, - 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, - 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, - 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, - 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, - 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, - 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, - 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, - 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, - 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, - 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, - 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, - 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, - 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, - 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, - 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, - 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, - 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, - 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, - 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, - 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, - 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, - 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, - 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, - 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, - 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, - 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, - 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, - 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, - 0xb6, 0x50, 0x82, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x0a, 0x1f, 0x28, 0x15, 0xb7, 0xaf, 0xe2, 0x19, 0x06, 0x87, 0x15, 0xfc, 0x76, 0x6b, - 0x87, 0x2e, 0xf2, 0x17, 0x35, 0x43, 0xac, 0x81, 0x4c, 0x32, 0xb4, 0xb6, 0x9c, 0x9c, - 0x34, 0x5e, 0x46, 0x98, - ], - rho: [ - 0x27, 0x3c, 0x68, 0xd1, 0x9c, 0xda, 0xa8, 0x62, 0x8b, 0xac, 0x37, 0xa2, 0xd4, 0x2c, - 0x51, 0x1c, 0x9b, 0xab, 0x65, 0xb6, 0xd8, 0xd5, 0xc5, 0xbd, 0x1e, 0x32, 0x77, 0x1a, - 0xb6, 0xf6, 0x4c, 0x26, - ], - cmx: [ - 0x40, 0x8f, 0x59, 0x4f, 0xdd, 0xc5, 0x0c, 0x67, 0xf5, 0x47, 0xe1, 0xeb, 0x3e, 0xa2, - 0x99, 0xa3, 0x1f, 0x69, 0xf5, 0x7f, 0xc9, 0x92, 0x03, 0x01, 0x42, 0x90, 0x35, 0xa6, - 0xc2, 0x49, 0x79, 0x1a, - ], - esk: [ - 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, 0xef, 0x08, 0xbd, 0xf6, - 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, 0xf5, 0x3b, 0x57, 0xc3, - 0x45, 0xa9, 0x87, 0x2f, - ], - ephemeral_key: [ - 0xa5, 0xc8, 0x0a, 0x29, 0xf2, 0xec, 0xdd, 0xd7, 0x01, 0x96, 0xef, 0x45, 0x9e, 0xd5, - 0x03, 0xc4, 0xb3, 0xc2, 0x22, 0x8d, 0x10, 0xcc, 0xbc, 0xad, 0x9a, 0x28, 0x23, 0x30, - 0x07, 0x7b, 0xca, 0x0c, - ], - shared_secret: [ - 0x37, 0x14, 0x15, 0xfc, 0x1e, 0x98, 0x42, 0xa1, 0x26, 0xa3, 0x7a, 0xa7, 0x7b, 0x8f, - 0x0f, 0x1a, 0xb6, 0x48, 0xa3, 0xf7, 0x43, 0x57, 0x34, 0x89, 0x6f, 0x07, 0x59, 0x52, - 0xe7, 0xd1, 0x60, 0x17, - ], - k_enc: [ - 0xd7, 0x36, 0xf0, 0x3c, 0x81, 0x2d, 0x9b, 0xf9, 0x54, 0xff, 0xd2, 0x41, 0x84, 0x07, - 0xf3, 0x36, 0xa5, 0xf9, 0x69, 0x8b, 0x62, 0x85, 0x23, 0x2f, 0x5c, 0x85, 0xf0, 0xd1, - 0x1d, 0x5e, 0x9d, 0x0a, - ], - p_enc: [ - 0x03, 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, 0xf7, 0x90, - 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, - 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, - 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, 0xdf, 0xfd, 0x79, 0xa9, - 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, - 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, - 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, - 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, - 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, - 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, - 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, - 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, - 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, - 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, - 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, - 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, - 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, - 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, - 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, - 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, - 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, - 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, - 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, - 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, - 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, - 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, - 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, - 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, - 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, - 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, - 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, - 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, - 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, - 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, - 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, - 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, - 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, - 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, - 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, - 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, - 0xb6, 0x50, 0x82, 0xa6, - ], - c_enc: [ - 0xfc, 0x90, 0xcb, 0xe1, 0xcd, 0x9f, 0x59, 0x9a, 0x1a, 0x24, 0xc7, 0xa3, 0xea, 0xf6, - 0x07, 0xd9, 0x13, 0xbf, 0x48, 0xbd, 0xc1, 0xa4, 0x6d, 0xf7, 0xb1, 0x74, 0x7f, 0x12, - 0x60, 0x64, 0x49, 0x4b, 0xf5, 0x39, 0x61, 0xe9, 0xa5, 0xa2, 0xb9, 0x69, 0x80, 0x57, - 0x63, 0x44, 0x2e, 0x2c, 0x38, 0x8d, 0x21, 0x2d, 0x74, 0x84, 0x6e, 0x57, 0x27, 0x87, - 0x2d, 0x06, 0x3f, 0xc9, 0x94, 0xa4, 0x4f, 0x9e, 0xb6, 0x55, 0x25, 0xd6, 0x8f, 0x98, - 0x24, 0xa6, 0x03, 0x75, 0xfe, 0x43, 0xc0, 0x5f, 0x08, 0xfe, 0x45, 0x42, 0xa7, 0xe4, - 0x0c, 0x03, 0x8d, 0xe7, 0x10, 0x85, 0x01, 0x17, 0x95, 0x1b, 0x9a, 0x32, 0x1e, 0xea, - 0x4f, 0x8c, 0x91, 0xc0, 0x1d, 0x39, 0xdb, 0xb5, 0xd4, 0x12, 0x40, 0xf8, 0xb1, 0xb1, - 0xdb, 0xb3, 0x3f, 0x45, 0x87, 0x87, 0xdb, 0x8c, 0xda, 0x06, 0x9b, 0x64, 0x5a, 0x76, - 0x38, 0xc2, 0xec, 0xca, 0xd3, 0xd9, 0xa7, 0x39, 0xd6, 0x4c, 0x9a, 0xd5, 0xd5, 0xb3, - 0xa0, 0x24, 0x55, 0xa4, 0xec, 0xd6, 0x96, 0x7c, 0xf3, 0xb3, 0x3b, 0xf0, 0x4e, 0xf6, - 0xdd, 0x88, 0x10, 0xe1, 0x0c, 0x25, 0x86, 0xf7, 0x89, 0x32, 0x44, 0xea, 0x72, 0x80, - 0xd1, 0x34, 0xcf, 0x37, 0xb3, 0xdc, 0x0c, 0x32, 0x82, 0x3b, 0x1a, 0x29, 0xc5, 0x0c, - 0xa6, 0x48, 0x31, 0xd8, 0x4e, 0xbd, 0xf5, 0xe0, 0x1c, 0x14, 0xca, 0x36, 0x05, 0xbe, - 0x02, 0xf1, 0x5f, 0x31, 0x57, 0x90, 0xf7, 0x4e, 0x20, 0x57, 0x7f, 0x92, 0x39, 0x51, - 0x2f, 0xbd, 0xdd, 0x67, 0x63, 0x77, 0xae, 0x50, 0xc3, 0xfe, 0x71, 0xc9, 0x30, 0xa8, - 0x29, 0x57, 0xd1, 0x54, 0x70, 0xeb, 0x1b, 0x55, 0xb2, 0x0c, 0xe5, 0x02, 0x35, 0x64, - 0xfe, 0xa7, 0xe1, 0x81, 0xbe, 0x04, 0xa9, 0x33, 0xa7, 0xa3, 0xa1, 0x11, 0x89, 0x4d, - 0xec, 0xf7, 0x2a, 0x56, 0x54, 0xcb, 0x4e, 0xac, 0x32, 0xe1, 0xd5, 0x96, 0xad, 0x99, - 0x1a, 0x2f, 0x4c, 0x62, 0xe8, 0xe2, 0x82, 0x57, 0x13, 0x7b, 0xcb, 0xa5, 0x03, 0xdc, - 0x91, 0xed, 0x9e, 0x90, 0xb3, 0x08, 0xcd, 0xa5, 0xcc, 0xcc, 0xc9, 0xd1, 0x4e, 0xa6, - 0xd0, 0x3b, 0x3d, 0xec, 0xa1, 0x57, 0xd5, 0x30, 0xde, 0x63, 0x1e, 0x1e, 0x45, 0x8f, - 0x6a, 0x60, 0x8e, 0x1f, 0x9d, 0x57, 0x9b, 0x6e, 0xe6, 0x00, 0x5c, 0xd0, 0xa8, 0xc3, - 0xe2, 0xdf, 0x89, 0x46, 0x8a, 0xcf, 0xb4, 0x36, 0xcb, 0x59, 0x84, 0x56, 0xf0, 0x38, - 0x95, 0x5d, 0xc6, 0xb4, 0x07, 0xec, 0x33, 0x00, 0xa5, 0xcf, 0xcd, 0xc8, 0x45, 0x47, - 0xe3, 0xef, 0xe9, 0xfc, 0xa1, 0x7e, 0xd2, 0xc2, 0x74, 0xf0, 0x03, 0x0b, 0x63, 0xcc, - 0x42, 0xe2, 0x38, 0x94, 0xa5, 0xf2, 0x53, 0x66, 0xcb, 0xc3, 0xbf, 0xcb, 0x77, 0x2d, - 0x04, 0x17, 0xf6, 0x24, 0x4b, 0x2f, 0xd8, 0x17, 0xc4, 0xc6, 0x79, 0x06, 0xc3, 0x38, - 0x4d, 0x69, 0xd7, 0x93, 0xef, 0xca, 0x6e, 0x5d, 0x6a, 0xf2, 0x5e, 0x4e, 0xbc, 0x0f, - 0x53, 0x56, 0xeb, 0x74, 0x28, 0x85, 0x19, 0xe8, 0xf4, 0x49, 0x38, 0xeb, 0xf9, 0xb2, - 0x5b, 0xe5, 0x85, 0xe1, 0x35, 0x1f, 0x62, 0x59, 0x6c, 0x31, 0x79, 0xca, 0xe4, 0x5e, - 0x75, 0x49, 0xd7, 0xfb, 0xb5, 0x91, 0x3b, 0xe9, 0xc3, 0xba, 0xa5, 0x7c, 0xab, 0x7c, - 0xd4, 0xb5, 0x67, 0x12, 0x8d, 0x1b, 0xa5, 0x20, 0x31, 0xd7, 0xd5, 0xa5, 0xbd, 0x69, - 0xde, 0x61, 0x4a, 0xbb, 0x8c, 0xa3, 0x8a, 0x94, 0x51, 0xcd, 0x1b, 0xad, 0xd9, 0x71, - 0xb3, 0xf1, 0xb0, 0xb5, 0x0c, 0x7f, 0x21, 0xbf, 0xc4, 0x23, 0x04, 0xa4, 0xa5, 0x3e, - 0x0d, 0x55, 0x92, 0x0d, 0xa0, 0x53, 0x27, 0x14, 0x79, 0x13, 0x45, 0xfb, 0x07, 0x4c, - 0x66, 0xc4, 0xb7, 0xc9, 0x89, 0x28, 0x30, 0xf9, 0x62, 0x09, 0xb8, 0x1c, 0x26, 0xd1, - 0x74, 0xf8, 0xa9, 0x33, 0xc3, 0x77, 0x9d, 0x97, 0x88, 0x55, 0x3f, 0x6e, 0xeb, 0x21, - 0xf7, 0xdb, 0x57, 0x78, 0xf4, 0xf8, 0x17, 0x4c, 0xb4, 0x6f, 0x71, 0xfd, 0xdc, 0x4b, - 0xe4, 0xd8, 0x70, 0x3e, 0xbf, 0xbc, 0xd2, 0xa7, 0x72, 0x89, 0xee, 0xfa, 0x72, 0x76, - 0x56, 0x74, 0xdb, 0xf0, 0xe0, 0x65, 0xff, 0xcb, 0xf6, 0xbb, 0xa0, 0x18, 0x09, 0x1e, - 0x49, 0xaa, 0x90, 0xe6, 0x02, 0xc8, - ], - ock: [ - 0x2f, 0x88, 0x37, 0x27, 0xb5, 0x4d, 0x06, 0x25, 0xcf, 0xdc, 0x19, 0x5a, 0xce, 0x10, - 0xca, 0xc0, 0x26, 0x8a, 0xba, 0x3d, 0xe2, 0x8a, 0xd6, 0x08, 0x88, 0x06, 0x50, 0x6d, - 0x69, 0xc4, 0xdd, 0x8e, - ], - op: [ - 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, - 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, - 0x25, 0xc8, 0xd6, 0xae, 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, - 0xef, 0x08, 0xbd, 0xf6, 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, - 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, - ], - c_out: [ - 0x99, 0x96, 0x90, 0xd4, 0xcd, 0xd9, 0xe7, 0x6b, 0x07, 0x2c, 0x3c, 0x4c, 0x41, 0xbf, - 0xc7, 0x9a, 0xaa, 0xc6, 0x7f, 0xdc, 0x0f, 0x41, 0xe8, 0x0e, 0x95, 0x48, 0x80, 0x0e, - 0xef, 0xbc, 0x95, 0x74, 0xf1, 0x5d, 0x64, 0xa6, 0x9e, 0x44, 0x47, 0xc4, 0x5b, 0x07, - 0x0c, 0x6c, 0x9f, 0x50, 0x0a, 0xdd, 0xef, 0x6f, 0x57, 0x14, 0xa5, 0x76, 0x22, 0x1f, - 0x3f, 0xbc, 0x61, 0x22, 0x8d, 0x95, 0xc3, 0xac, 0xe4, 0x21, 0x4b, 0xb6, 0xcf, 0x5b, - 0xd9, 0x69, 0x84, 0xd7, 0x78, 0x96, 0x0d, 0xe9, 0x0c, 0x02, - ], - asset: Some([ - 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, - 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, - 0xfd, 0x7d, 0x05, 0x8a, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0x8c, 0x45, 0x43, 0xe1, 0x1f, 0x9f, 0x30, 0x7e, 0xc9, 0x04, 0x31, 0x61, 0x29, 0x46, - 0xfb, 0x01, 0x81, 0xb3, 0x6e, 0x1b, 0x52, 0xdb, 0x43, 0x1e, 0x6d, 0xf9, 0x38, 0x8c, - 0xac, 0xd3, 0x08, 0xe8, 0x99, 0xd9, 0x3f, 0x70, 0xad, 0x2a, 0xea, 0xec, 0x99, 0x5e, - 0xcc, 0xe1, 0x80, 0x1c, 0x61, 0x56, 0xe2, 0x3e, 0xc4, 0x1b, 0x1a, 0xe1, 0xcd, 0x2f, - 0xd6, 0xe3, 0x9b, 0x69, 0x98, 0x2f, 0x46, 0x33, - ], - ovk: [ - 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, 0xda, 0x57, 0x96, 0xfa, 0xae, - 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, 0x09, 0x3e, 0x2c, 0x1f, 0x3a, - 0xe8, 0x55, 0xf6, 0x5a, - ], - default_d: [ - 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, - ], - default_pk_d: [ - 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, - 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, - 0x36, 0x34, 0xb0, 0x23, - ], - v: 3775288302605163507, - rseed: [ - 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, - 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, - 0x3e, 0xcd, 0xd7, 0x99, - ], - memo: [ - 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, - 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, - 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, - 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, - 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, - 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, - 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, - 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, - 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, - 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, - 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, - 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, - 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, - 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, - 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, - 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, - 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, - 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, - 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, - 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, - 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, - 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, - 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, - 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, - 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, - 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, - 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, - 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, - 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, - 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, - 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, - 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, - 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, - 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, - 0x6e, 0x67, 0x57, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0xde, 0x2b, 0xfc, 0x89, 0x5b, 0xa8, 0xb5, 0x43, 0x03, 0x93, 0x43, 0x4e, 0x20, 0x92, - 0xce, 0xe7, 0x81, 0xe4, 0x00, 0x28, 0x5c, 0xc6, 0x66, 0xbc, 0x6c, 0x41, 0x89, 0xdb, - 0x2d, 0xda, 0x71, 0x92, - ], - rho: [ - 0xea, 0x1d, 0x9d, 0x26, 0x5e, 0xf4, 0x8a, 0x18, 0x97, 0x89, 0x70, 0xb1, 0x76, 0x7b, - 0xe0, 0xe8, 0x14, 0x11, 0x94, 0x7e, 0x9e, 0x69, 0xb7, 0x19, 0xfa, 0xb7, 0x41, 0x72, - 0x1d, 0x40, 0x9b, 0x33, - ], - cmx: [ - 0x9e, 0x3d, 0x61, 0x35, 0x6b, 0x0d, 0x88, 0x95, 0x9e, 0x3f, 0x0f, 0xcc, 0x4a, 0x93, - 0x2e, 0x93, 0x2e, 0xac, 0xbc, 0x80, 0x1d, 0x48, 0xc0, 0x19, 0x5b, 0x9c, 0x8b, 0xd1, - 0x05, 0x5a, 0x8e, 0x2e, - ], - esk: [ - 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, 0xa9, 0x19, 0xa2, 0x06, - 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, 0x25, 0xec, 0xff, 0x47, - 0x72, 0x16, 0x8c, 0x05, - ], - ephemeral_key: [ - 0xc1, 0xce, 0x25, 0xfb, 0x89, 0xe5, 0xca, 0x89, 0x97, 0xf9, 0xb4, 0xbb, 0x0e, 0x1e, - 0xfb, 0xcc, 0x1a, 0x8c, 0xbf, 0x44, 0xec, 0xfd, 0x33, 0x2c, 0x6c, 0x5c, 0x17, 0x3b, - 0xb1, 0x1f, 0xb5, 0x87, - ], - shared_secret: [ - 0x2e, 0xe5, 0x69, 0xce, 0xb3, 0xfd, 0xb8, 0x67, 0xa5, 0xd8, 0x4c, 0x92, 0x68, 0x24, - 0xef, 0x54, 0x9f, 0x2d, 0xd2, 0x8f, 0x8b, 0x04, 0x8d, 0x67, 0xd0, 0x28, 0x81, 0x7d, - 0xbf, 0xf5, 0xd2, 0xb1, - ], - k_enc: [ - 0x41, 0x4d, 0x80, 0x67, 0xc9, 0xfe, 0xbd, 0x5e, 0xbc, 0xd9, 0xae, 0x8c, 0x05, 0x99, - 0x4e, 0x3b, 0x06, 0x85, 0xc8, 0x86, 0x6f, 0x88, 0x95, 0x94, 0xc3, 0x74, 0xb3, 0x75, - 0xac, 0x2c, 0x6d, 0x24, - ], - p_enc: [ - 0x03, 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, 0xf3, 0xdb, - 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, - 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, - 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0xa6, 0x33, 0x05, 0x44, - 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, 0xf6, 0x2e, - 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, 0x42, 0x68, 0x3c, - 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, - 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, - 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, - 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, - 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, - 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, - 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, - 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, - 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, - 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, - 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, - 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, - 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, - 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, - 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, - 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, - 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, - 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, - 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, - 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, - 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, - 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, - 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, - 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, - 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, - 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, - 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, - 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, - 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, - 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, - 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, - 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, - 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, - 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, - 0x6e, 0x67, 0x57, 0x61, - ], - c_enc: [ - 0xbc, 0x8a, 0x16, 0xfd, 0x57, 0xbc, 0x03, 0x60, 0x59, 0xe5, 0x4d, 0xc2, 0xbc, 0xfa, - 0xad, 0x9c, 0xc1, 0xfa, 0xe8, 0xcb, 0x2b, 0xe2, 0xa0, 0xc8, 0x5e, 0x81, 0x6c, 0x67, - 0xfd, 0xcd, 0x0b, 0x93, 0xe6, 0xa1, 0xed, 0xc8, 0x3b, 0xfa, 0xc4, 0x1e, 0xb4, 0x19, - 0x1c, 0x56, 0x4b, 0xac, 0x58, 0x01, 0x62, 0x92, 0x2d, 0x88, 0x25, 0x30, 0x28, 0xeb, - 0x88, 0xed, 0x46, 0xbf, 0x24, 0x2d, 0x82, 0x28, 0x6c, 0xb0, 0xa5, 0x66, 0xce, 0x01, - 0x18, 0x09, 0x4c, 0x90, 0x8f, 0xc2, 0x68, 0xb3, 0x2b, 0xcb, 0xdc, 0x4c, 0x22, 0x82, - 0xc5, 0x24, 0x2a, 0x65, 0x15, 0x48, 0x8b, 0x83, 0x3d, 0x29, 0x8e, 0x49, 0xda, 0x33, - 0x3a, 0xdd, 0x96, 0xc9, 0x9b, 0x98, 0xac, 0x06, 0x7f, 0x21, 0x41, 0x28, 0x9a, 0xcd, - 0x89, 0x49, 0x64, 0xfc, 0xf8, 0x94, 0xc9, 0x26, 0xf1, 0x81, 0xb1, 0x19, 0x85, 0x68, - 0xb1, 0xdd, 0x6f, 0x5e, 0xd1, 0x22, 0xdc, 0x70, 0x44, 0xad, 0x96, 0x76, 0xa7, 0xc5, - 0xae, 0x8e, 0xa9, 0x0f, 0x64, 0xbc, 0x59, 0x09, 0x36, 0xe0, 0xdf, 0x53, 0x1c, 0x1b, - 0x94, 0xb7, 0x35, 0xcd, 0x7b, 0x18, 0x73, 0xc8, 0x51, 0x6f, 0xea, 0x83, 0x64, 0x91, - 0x40, 0xbc, 0xbb, 0x9b, 0x42, 0xea, 0x6c, 0xb7, 0xaf, 0x67, 0xdc, 0x2d, 0xdb, 0xb4, - 0x7a, 0xb2, 0x25, 0xe7, 0x98, 0x29, 0xcd, 0xaf, 0x77, 0x04, 0xfb, 0x56, 0x5b, 0x43, - 0x91, 0x76, 0xf3, 0x35, 0xe4, 0x2b, 0x64, 0xc1, 0x6d, 0xdf, 0xe0, 0x88, 0x45, 0x38, - 0xbf, 0x43, 0x33, 0xe3, 0x2c, 0xa1, 0xe6, 0x27, 0x41, 0xc3, 0xe7, 0x4c, 0x8f, 0xaa, - 0xde, 0x0d, 0x89, 0xfa, 0x10, 0x30, 0xcd, 0x8e, 0xfd, 0x20, 0x22, 0x3e, 0x41, 0xc3, - 0xfc, 0xca, 0xaa, 0xe7, 0x76, 0xe6, 0x8e, 0xe8, 0x40, 0x56, 0x6f, 0x4d, 0x13, 0xc1, - 0xc9, 0xd5, 0xcb, 0xbe, 0xcf, 0xa7, 0x49, 0x9d, 0x43, 0x12, 0x7c, 0xe8, 0xfd, 0x83, - 0xdb, 0x6e, 0x89, 0x67, 0x90, 0x32, 0x25, 0x24, 0x87, 0x21, 0x40, 0x0d, 0x5e, 0x3e, - 0xc0, 0xc1, 0x8e, 0x10, 0xf5, 0xe6, 0x6e, 0x10, 0x17, 0x0c, 0xb3, 0x74, 0x48, 0x22, - 0x4a, 0xde, 0x39, 0x9f, 0x1d, 0x74, 0xa2, 0x16, 0x7d, 0x9f, 0xdb, 0xfe, 0x36, 0xe1, - 0x28, 0xe4, 0x8c, 0x01, 0x62, 0x61, 0x16, 0xc1, 0xa2, 0xdf, 0x3c, 0xb0, 0x23, 0xd8, - 0x0a, 0xed, 0x9b, 0xfc, 0x02, 0x71, 0xb8, 0x1f, 0xf9, 0x79, 0x81, 0x01, 0x6f, 0xff, - 0x19, 0x61, 0x08, 0x88, 0x8b, 0xcb, 0xca, 0x84, 0x5b, 0x5d, 0x97, 0x1b, 0xd5, 0x4f, - 0x49, 0x7d, 0x3f, 0x3a, 0x09, 0x29, 0x9e, 0x56, 0x50, 0xd3, 0x26, 0xd8, 0x9b, 0x9a, - 0x5e, 0xff, 0x3e, 0xbd, 0x27, 0x39, 0x34, 0xc4, 0x9f, 0x81, 0x46, 0x7e, 0xb8, 0x4f, - 0x56, 0x98, 0x90, 0xcf, 0x89, 0x05, 0xb7, 0x4c, 0xd3, 0xed, 0xa6, 0x3c, 0x53, 0x88, - 0xd5, 0x51, 0x5e, 0x3f, 0xd8, 0x1c, 0x70, 0xc1, 0x5e, 0x2a, 0x98, 0x2d, 0x59, 0x0e, - 0x87, 0xb8, 0x64, 0x45, 0x4b, 0xcd, 0xf5, 0xf8, 0x4d, 0x9f, 0x11, 0xcb, 0x9c, 0xf2, - 0xb5, 0xde, 0x3c, 0x5e, 0x0e, 0x2a, 0x6c, 0x48, 0x16, 0x61, 0x64, 0x96, 0x6f, 0xb9, - 0x0d, 0xac, 0xf8, 0x67, 0x4f, 0x9f, 0x1a, 0x34, 0xd2, 0xcd, 0xc7, 0xc9, 0x48, 0xab, - 0x99, 0xc3, 0x58, 0xa1, 0x95, 0x47, 0x0a, 0xdd, 0x06, 0x5e, 0xaf, 0x79, 0x24, 0xfa, - 0xed, 0x63, 0x27, 0xa6, 0x10, 0xf5, 0x2e, 0xd5, 0xd3, 0xa8, 0x7e, 0x11, 0xb5, 0x97, - 0x4f, 0xa0, 0x60, 0x45, 0xa4, 0x08, 0x95, 0xcd, 0xad, 0x60, 0x1c, 0xae, 0x01, 0xed, - 0xda, 0x17, 0x52, 0x81, 0x62, 0xd7, 0x21, 0x24, 0xf2, 0x05, 0x6b, 0x9a, 0xb8, 0xc0, - 0xc0, 0xf5, 0xc6, 0xdd, 0xaa, 0x0f, 0x5e, 0x33, 0xfb, 0x04, 0x23, 0x0b, 0x61, 0x1b, - 0xff, 0xd8, 0xbd, 0xdc, 0x63, 0x4c, 0x79, 0x60, 0xa3, 0xd4, 0xe6, 0x8f, 0x21, 0xe7, - 0x83, 0x04, 0xe4, 0xc4, 0xd2, 0xdc, 0xd6, 0xa1, 0x9c, 0xfc, 0x04, 0x57, 0x97, 0x09, - 0xf0, 0x33, 0xf1, 0x95, 0x78, 0xae, 0x7f, 0x0b, 0xc6, 0x46, 0x32, 0xa6, 0xd7, 0xda, - 0x40, 0xdc, 0x0c, 0x38, 0x3b, 0xca, 0xa8, 0x68, 0x6a, 0xc8, 0x49, 0x3b, 0x2c, 0xb8, - 0xf1, 0xd7, 0xd3, 0x95, 0x8a, 0x54, - ], - ock: [ - 0x9c, 0xba, 0xd2, 0xf3, 0x8b, 0xf8, 0x8f, 0x39, 0x47, 0xce, 0xf6, 0x4d, 0xe7, 0xa6, - 0xf4, 0x3e, 0x4c, 0xbb, 0x41, 0xe6, 0xe0, 0x37, 0xf1, 0x42, 0x01, 0xae, 0xe8, 0xab, - 0xfd, 0xf8, 0xa2, 0x35, - ], - op: [ - 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, - 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, - 0x36, 0x34, 0xb0, 0x23, 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, - 0xa9, 0x19, 0xa2, 0x06, 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, - 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, - ], - c_out: [ - 0xf6, 0x25, 0xcd, 0x3d, 0x19, 0x97, 0xb0, 0xd3, 0xf2, 0x29, 0x5a, 0xac, 0xc0, 0x3a, - 0xe0, 0xc9, 0x47, 0x28, 0xb3, 0x3c, 0xc4, 0xf1, 0x6f, 0xd4, 0x28, 0xd6, 0x5f, 0x3c, - 0x78, 0x5e, 0x8c, 0x0b, 0xb4, 0x66, 0xc1, 0x33, 0xd4, 0x83, 0xdf, 0xc5, 0xb1, 0xb3, - 0x15, 0x1d, 0xa2, 0xd5, 0xf2, 0x4a, 0x2b, 0x32, 0x0d, 0x8e, 0x9c, 0xd3, 0x41, 0x5c, - 0x25, 0xb6, 0xf9, 0x76, 0x1f, 0x42, 0x70, 0x04, 0xce, 0xe5, 0x4f, 0x75, 0xf1, 0x25, - 0xbc, 0x50, 0x5e, 0xf6, 0x26, 0xef, 0xc9, 0xdd, 0x63, 0x66, - ], - asset: Some([ - 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, - 0x5a, 0x31, 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, - 0xb4, 0x42, 0x68, 0x3c, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0x47, 0x30, 0x68, 0xbf, 0x68, 0xe5, 0x0b, 0xe3, 0x85, 0x7d, 0xec, 0xb2, 0xef, 0xd5, - 0xde, 0x20, 0xea, 0xc8, 0x1b, 0x37, 0x5b, 0xd0, 0xbb, 0xe8, 0x36, 0x86, 0x6e, 0x99, - 0x36, 0x3b, 0x37, 0x50, 0x9d, 0x53, 0x8f, 0xcc, 0xa9, 0x33, 0x37, 0xad, 0xbc, 0x24, - 0x81, 0xe2, 0x70, 0x26, 0x18, 0x4c, 0x3f, 0x4f, 0x48, 0xcc, 0x5d, 0x5a, 0x0e, 0x4a, - 0x4c, 0xfa, 0x4d, 0x6a, 0x24, 0x7f, 0x2e, 0x39, - ], - ovk: [ - 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, 0x66, 0x46, 0x61, 0x9a, 0xf0, 0x24, 0x56, - 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, - 0xd3, 0x33, 0xe1, 0x84, - ], - default_d: [ - 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, - ], - default_pk_d: [ - 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, - 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, - 0x34, 0xeb, 0x90, 0x2c, - ], - v: 15119422206032203650, - rseed: [ - 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, - 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, - 0x2d, 0x9b, 0x4c, 0x8f, - ], - memo: [ - 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, - 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, - 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, - 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, - 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, - 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, - 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, - 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, - 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, - 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, - 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, - 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, - 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, - 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, - 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, - 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, - 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, - 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, - 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, - 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, - 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, - 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, - 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, - 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, - 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, - 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, - 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, - 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, - 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, - 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, - 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, - 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, - 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, - 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, - 0x08, 0x74, 0x86, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x45, 0x37, 0x85, 0x3e, 0x18, 0xac, 0x2c, 0xe9, 0x37, 0x79, 0x8c, 0x9b, 0xce, 0xa9, - 0x80, 0x2d, 0x65, 0x00, 0x74, 0xdb, 0xd7, 0xe0, 0x6a, 0x48, 0x98, 0x03, 0x15, 0x30, - 0x78, 0xe9, 0x97, 0x0b, - ], - rho: [ - 0x9a, 0xd0, 0x7f, 0x1c, 0x28, 0x7b, 0xdd, 0x53, 0x4f, 0x6f, 0x7e, 0xae, 0x08, 0xf7, - 0x85, 0x72, 0xa3, 0x05, 0xfa, 0x3b, 0x70, 0x68, 0xa3, 0x78, 0x38, 0x27, 0xaf, 0xe2, - 0x14, 0x7a, 0x27, 0x10, - ], - cmx: [ - 0xf2, 0x04, 0x22, 0x51, 0xa0, 0x59, 0xa2, 0xf5, 0x8a, 0xb8, 0xe9, 0x0b, 0x52, 0x64, - 0xd0, 0xa4, 0x3f, 0x96, 0xd7, 0x7e, 0xdd, 0x54, 0xf8, 0x0f, 0xf4, 0x9d, 0x43, 0x86, - 0x81, 0x4d, 0x73, 0x2e, - ], - esk: [ - 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, 0x1d, 0xa4, 0xb1, 0x44, - 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, 0xaf, 0x2b, 0xd1, 0xa0, - 0x8c, 0x67, 0xd9, 0x3f, - ], - ephemeral_key: [ - 0x46, 0x73, 0x1f, 0xff, 0xc5, 0x9a, 0xf4, 0xc1, 0x28, 0x82, 0xbc, 0xca, 0xea, 0xa7, - 0xb8, 0xed, 0x39, 0x0b, 0x14, 0x66, 0x72, 0xe1, 0x36, 0x51, 0xc3, 0x2e, 0x57, 0x80, - 0x62, 0x68, 0x65, 0xa7, - ], - shared_secret: [ - 0x9d, 0x56, 0xbd, 0x96, 0x00, 0x39, 0x62, 0x5e, 0x11, 0x7d, 0x7b, 0xfe, 0xd4, 0x3a, - 0x57, 0x3b, 0x11, 0x51, 0x7f, 0xfa, 0x76, 0x14, 0xea, 0x2d, 0xa7, 0x7e, 0xdf, 0x62, - 0x7f, 0x6f, 0x13, 0xaa, - ], - k_enc: [ - 0x04, 0x2f, 0x92, 0x82, 0x13, 0x44, 0xde, 0x97, 0x7c, 0xee, 0x89, 0x9e, 0xd2, 0x1b, - 0xc8, 0x48, 0xf5, 0xc4, 0xfe, 0xdc, 0x39, 0xf2, 0xdf, 0xed, 0xad, 0x62, 0xcc, 0x7a, - 0x92, 0x7f, 0x74, 0xfd, - ], - p_enc: [ - 0x03, 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, 0x82, 0xcf, - 0xb3, 0xe7, 0x63, 0xfa, 0xd2, 0xd1, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, - 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, - 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0x61, 0x16, 0xcf, 0xec, - 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, - 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, - 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, - 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, - 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, - 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, - 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, - 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, - 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, - 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, - 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, - 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, - 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, - 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, - 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, - 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, - 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, - 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, - 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, - 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, - 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, - 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, - 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, - 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, - 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, - 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, - 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, - 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, - 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, - 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, - 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, - 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, - 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, - 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, - 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, - 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, - 0x08, 0x74, 0x86, 0x9c, - ], - c_enc: [ - 0x16, 0x76, 0x72, 0x3a, 0x18, 0xff, 0x58, 0x77, 0x70, 0x15, 0x8d, 0x6b, 0x85, 0x09, - 0x3c, 0x49, 0x20, 0x16, 0xf8, 0x7e, 0xc3, 0xfa, 0xe8, 0xb0, 0xb4, 0x7c, 0xd9, 0x29, - 0x8f, 0xa2, 0x07, 0xc4, 0xb6, 0x09, 0xc6, 0x92, 0xdd, 0xb9, 0x10, 0x19, 0x72, 0xc9, - 0x4c, 0x71, 0x87, 0x84, 0x85, 0x42, 0x1e, 0xfb, 0x70, 0x1c, 0xf5, 0x15, 0xa2, 0x3f, - 0xbf, 0x36, 0xfe, 0x93, 0x54, 0x0d, 0x82, 0xd6, 0x9a, 0x72, 0x62, 0x4e, 0x25, 0x4f, - 0xe3, 0xa0, 0x11, 0xc5, 0xdb, 0xdb, 0xd2, 0xbd, 0xff, 0xb8, 0x83, 0x8a, 0xf3, 0x7d, - 0x03, 0xce, 0x69, 0x12, 0x6b, 0x2f, 0x68, 0x21, 0x25, 0xb7, 0xa9, 0xb2, 0xa3, 0xee, - 0x11, 0x8a, 0xe5, 0xad, 0xb4, 0x60, 0xa4, 0x68, 0x7c, 0x24, 0x30, 0x18, 0x7b, 0xfd, - 0x0f, 0x6c, 0x2a, 0x3d, 0x5d, 0x74, 0x30, 0x1c, 0xbd, 0x8f, 0xd0, 0x26, 0xc8, 0x64, - 0x4f, 0xbf, 0xa2, 0x65, 0x69, 0x88, 0xe9, 0x58, 0x59, 0x0b, 0x81, 0x6a, 0x1e, 0x64, - 0x0e, 0x46, 0x71, 0x0e, 0x46, 0xfa, 0x15, 0x94, 0xff, 0x2a, 0x61, 0xd6, 0xf6, 0xe7, - 0xb4, 0xa9, 0xf6, 0xe0, 0xde, 0x68, 0x3d, 0x95, 0xe5, 0x9d, 0x43, 0x57, 0xf7, 0x9a, - 0xc4, 0x93, 0x86, 0x6d, 0xab, 0x06, 0x57, 0x76, 0xc0, 0xb1, 0x43, 0x6b, 0x8e, 0x04, - 0x47, 0x68, 0x43, 0xc2, 0x8b, 0x48, 0x45, 0xea, 0xff, 0x17, 0x83, 0xa8, 0x50, 0xc2, - 0x4a, 0x90, 0x65, 0xc3, 0x36, 0x51, 0xc4, 0xb3, 0xdd, 0x19, 0x92, 0xf4, 0xf2, 0x08, - 0xb8, 0x51, 0xbf, 0xff, 0xe9, 0xb7, 0xbb, 0x7a, 0xad, 0x76, 0x7c, 0x23, 0x60, 0xb0, - 0x5c, 0x11, 0x23, 0x09, 0x66, 0xda, 0x55, 0x7e, 0x31, 0x3a, 0xe6, 0x1c, 0x95, 0x42, - 0x97, 0x66, 0x10, 0x6b, 0x4b, 0x1b, 0x35, 0x47, 0x64, 0xe4, 0xe1, 0xe4, 0xdf, 0x90, - 0xc1, 0x2d, 0x24, 0x37, 0x9d, 0x67, 0xba, 0xc6, 0x66, 0x97, 0xaf, 0x23, 0x44, 0x97, - 0xf2, 0xd6, 0xf9, 0xa6, 0x12, 0x85, 0x0d, 0xd7, 0x1d, 0x1c, 0x98, 0xce, 0x65, 0xd8, - 0x50, 0x7f, 0xa3, 0x46, 0x35, 0x83, 0x12, 0x39, 0xe2, 0x10, 0xf7, 0xdb, 0xb3, 0x05, - 0x04, 0x2d, 0x47, 0x50, 0xd9, 0x5a, 0xdf, 0xff, 0xc9, 0x8d, 0xeb, 0x0f, 0x17, 0x13, - 0xbc, 0x01, 0xaf, 0x5d, 0xb5, 0x99, 0x29, 0x89, 0x76, 0xab, 0xba, 0xdb, 0x0f, 0x4d, - 0xed, 0x1a, 0x2f, 0xe4, 0xcf, 0x90, 0x60, 0x0e, 0x0d, 0x28, 0xd3, 0x07, 0xc6, 0x41, - 0xf7, 0x52, 0x3c, 0x16, 0x66, 0x40, 0x1d, 0x78, 0x6f, 0xd2, 0x4a, 0xe1, 0x68, 0x0f, - 0xe9, 0x26, 0x70, 0x4c, 0xb6, 0xe2, 0xaf, 0x80, 0x1a, 0x0d, 0x82, 0x75, 0x9d, 0xd8, - 0x7a, 0x8c, 0xd8, 0x7b, 0x85, 0xbb, 0x07, 0x51, 0xa7, 0x08, 0xc9, 0xf4, 0xa7, 0xd3, - 0x24, 0xe5, 0xc9, 0x3a, 0xd2, 0x2b, 0x86, 0x43, 0xdf, 0xfa, 0x5f, 0x50, 0x79, 0xfc, - 0x6f, 0x01, 0x6d, 0x94, 0x3c, 0x99, 0x09, 0x27, 0x5c, 0x96, 0xf5, 0xfe, 0x7b, 0x56, - 0x33, 0x3c, 0x24, 0x01, 0x99, 0x73, 0xd9, 0x4f, 0x06, 0xeb, 0xf6, 0xc0, 0xf6, 0xef, - 0xdd, 0x42, 0xea, 0xb0, 0x63, 0x49, 0xd5, 0xe8, 0xb9, 0x60, 0xba, 0x8c, 0x68, 0xee, - 0xfd, 0x44, 0x49, 0x99, 0xf6, 0xfa, 0x3d, 0x6a, 0x3a, 0xe3, 0x1a, 0xe8, 0x54, 0x6e, - 0xdc, 0x62, 0x78, 0x25, 0x63, 0x7e, 0x1e, 0x86, 0x39, 0x8d, 0x0e, 0xd3, 0xd8, 0x8b, - 0xfa, 0xea, 0x8b, 0x4b, 0x08, 0x50, 0xd8, 0xa8, 0x28, 0x6e, 0xa9, 0xf3, 0xd1, 0x3f, - 0xa8, 0xf4, 0x16, 0x53, 0x45, 0x1b, 0x97, 0xb3, 0x8b, 0x06, 0x3a, 0x5f, 0xc6, 0xdb, - 0xe4, 0xe9, 0x19, 0x94, 0x87, 0xc9, 0x73, 0xef, 0x8f, 0x2c, 0x26, 0x3f, 0x85, 0x05, - 0xf4, 0xc3, 0xbe, 0xc9, 0xd1, 0x79, 0xbb, 0xd6, 0x5d, 0x1e, 0xdc, 0x58, 0x95, 0xa1, - 0x6c, 0xc7, 0x98, 0x6b, 0xcf, 0xc4, 0xba, 0xe8, 0x7e, 0xc0, 0xb2, 0x9b, 0xf1, 0xb3, - 0x97, 0x61, 0x5c, 0x95, 0x13, 0xfa, 0x52, 0xeb, 0xe1, 0xe9, 0xfc, 0xfb, 0xf1, 0x92, - 0xed, 0x49, 0x26, 0x27, 0x27, 0xa0, 0x8a, 0xd3, 0xc2, 0x95, 0x5b, 0x3d, 0xf2, 0xee, - 0xad, 0x30, 0x24, 0x3e, 0x06, 0x66, 0xf2, 0x3c, 0x7f, 0x97, 0xe7, 0x84, 0xbe, 0x68, - 0xcc, 0x22, 0xca, 0x1d, 0x09, 0xd5, - ], - ock: [ - 0x97, 0x9b, 0x31, 0x5d, 0x3e, 0x1f, 0x5c, 0xa1, 0x8a, 0x92, 0x86, 0xd9, 0x2c, 0xc8, - 0x8e, 0x63, 0x62, 0x4b, 0x39, 0x9b, 0x29, 0x19, 0xbf, 0x4e, 0x67, 0xda, 0x7c, 0xd3, - 0x94, 0xf4, 0x5c, 0x49, - ], - op: [ - 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, - 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, - 0x34, 0xeb, 0x90, 0x2c, 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, - 0x1d, 0xa4, 0xb1, 0x44, 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, - 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, - ], - c_out: [ - 0x83, 0xf7, 0xa1, 0xda, 0x72, 0x4d, 0xd1, 0x54, 0xe7, 0xd9, 0x47, 0xc0, 0xfc, 0x83, - 0x42, 0x87, 0xf3, 0x3c, 0xd4, 0xb3, 0x4a, 0xfa, 0xc0, 0xda, 0x55, 0xe4, 0x37, 0xaf, - 0xae, 0x67, 0xa9, 0x9c, 0xbd, 0x89, 0x75, 0xc9, 0x54, 0xcf, 0x41, 0xaa, 0x1e, 0x9a, - 0x8f, 0x99, 0x98, 0x3d, 0x58, 0x6f, 0x5e, 0x35, 0x37, 0xda, 0xb7, 0x2a, 0xe1, 0x82, - 0x7a, 0xa5, 0xdf, 0xc9, 0xdd, 0xad, 0x06, 0x26, 0x78, 0x84, 0x6f, 0xf8, 0x09, 0x3d, - 0xfd, 0x15, 0xf6, 0x3d, 0x47, 0xe5, 0xa3, 0xbb, 0x74, 0x39, - ], - asset: Some([ - 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, - 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, - 0x38, 0xe1, 0x73, 0x29, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0xfc, 0x8c, 0x64, 0x1c, 0x0b, 0x28, 0xbe, 0xbf, 0x85, 0x24, 0x25, 0xae, 0x95, 0x5f, - 0xe6, 0x40, 0x1c, 0xfd, 0x9e, 0x60, 0x63, 0xf2, 0x50, 0x11, 0x3d, 0xa0, 0xb5, 0x8b, - 0x2a, 0x0f, 0x49, 0xb9, 0x12, 0x0b, 0x89, 0x9f, 0x08, 0x10, 0x6b, 0x30, 0x86, 0xb2, - 0xf4, 0x11, 0x63, 0x6f, 0x50, 0xab, 0x48, 0x7c, 0xfb, 0x28, 0x81, 0x89, 0x77, 0x8f, - 0xe4, 0xe5, 0xa1, 0x91, 0x8b, 0x98, 0xd5, 0x0a, - ], - ovk: [ - 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, 0x17, 0xdb, 0xbc, - 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, 0x27, 0x00, 0x2c, - 0xe2, 0x1c, 0x02, 0x14, - ], - default_d: [ - 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, - ], - default_pk_d: [ - 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, - 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, - 0x89, 0xcf, 0xf9, 0x1e, - ], - v: 7555450289479839818, - rseed: [ - 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, - 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, - 0x03, 0xaa, 0xe0, 0x4b, - ], - memo: [ - 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, - 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, - 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, - 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, - 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, - 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, - 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, - 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, - 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, - 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, - 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, - 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, - 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, - 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, - 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, - 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, - 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, - 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, - 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, - 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, - 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, - 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, - 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, - 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, - 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, - 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, - 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, - 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, - 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, - 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, - 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, - 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, - 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, - 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, - 0x6b, 0x21, 0x43, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x71, 0x00, 0xa7, 0x52, 0x93, 0xf4, 0xae, 0xfd, 0x89, 0xa1, 0x66, 0xa5, 0xf8, 0x4d, - 0x34, 0xda, 0xf4, 0xe5, 0x98, 0x34, 0xcd, 0x65, 0xd7, 0x9f, 0xfc, 0x41, 0xdd, 0xf0, - 0x68, 0x2d, 0xc2, 0xab, - ], - rho: [ - 0x31, 0x70, 0x5e, 0xfb, 0xf8, 0x0c, 0x7a, 0x7a, 0xb7, 0x81, 0xdf, 0x53, 0x77, 0xf8, - 0x4d, 0x4b, 0x32, 0x36, 0xdb, 0x1f, 0x32, 0xac, 0xa7, 0x94, 0x5c, 0xf2, 0x6e, 0xc8, - 0xb9, 0xd0, 0xb7, 0x32, - ], - cmx: [ - 0xe1, 0xc7, 0x67, 0xf3, 0x30, 0x15, 0xb5, 0xe2, 0x4a, 0x9a, 0xa5, 0x8b, 0x64, 0x7b, - 0x6b, 0x61, 0x32, 0x3c, 0xd3, 0x47, 0xe7, 0x21, 0x4c, 0x29, 0x1d, 0x09, 0x95, 0xc0, - 0xf5, 0xa6, 0x93, 0x2f, - ], - esk: [ - 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, 0x58, 0x93, 0x20, 0x26, - 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, 0x44, 0x72, 0x83, 0xf9, - 0x4e, 0xd5, 0x95, 0x3d, - ], - ephemeral_key: [ - 0xce, 0x67, 0x94, 0x31, 0x5f, 0x46, 0x2d, 0xed, 0xf3, 0xc5, 0x77, 0x4a, 0xac, 0x7f, - 0x3c, 0x7b, 0x70, 0xba, 0x7d, 0x72, 0x43, 0xbb, 0x0c, 0xc3, 0xb0, 0x67, 0xdc, 0x28, - 0x38, 0xf1, 0x11, 0xa3, - ], - shared_secret: [ - 0xea, 0x22, 0x6b, 0x69, 0xec, 0x2d, 0x9f, 0xcf, 0x91, 0x9c, 0xe5, 0x70, 0x06, 0x09, - 0x89, 0x94, 0xf7, 0x14, 0xb3, 0x9c, 0x34, 0x61, 0x52, 0xbc, 0x11, 0x51, 0xa0, 0xc6, - 0x9e, 0xe0, 0x04, 0x06, - ], - k_enc: [ - 0xb4, 0x56, 0x1b, 0xdb, 0xe0, 0xea, 0x44, 0x20, 0x75, 0xe7, 0xe6, 0x6f, 0xb3, 0xc0, - 0xfa, 0xd3, 0xaf, 0xc2, 0x85, 0x6e, 0xf4, 0xf3, 0x61, 0xb4, 0xac, 0x33, 0xaa, 0xe0, - 0x15, 0x52, 0xfd, 0x49, - ], - p_enc: [ - 0x03, 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, 0x4a, 0x70, - 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, - 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, - 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, 0x03, 0xaa, 0xe0, 0x4b, 0x29, 0x8a, 0xc0, 0xaf, - 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, - 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, - 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, - 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, - 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, - 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, - 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, - 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, - 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, - 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, - 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, - 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, - 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, - 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, - 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, - 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, - 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, - 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, - 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, - 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, - 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, - 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, - 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, - 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, - 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, - 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, - 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, - 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, - 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, - 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, - 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, - 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, - 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, - 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, - 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, - 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, - 0x6b, 0x21, 0x43, 0x0f, - ], - c_enc: [ - 0x59, 0x9a, 0x4d, 0x9f, 0x53, 0x3c, 0x46, 0xa9, 0x6f, 0x92, 0xaf, 0x8c, 0x08, 0xae, - 0x59, 0x71, 0x10, 0x23, 0x0e, 0xb8, 0x41, 0xc2, 0xf7, 0xc9, 0xd4, 0xf1, 0x45, 0x87, - 0x76, 0x36, 0xc8, 0x9d, 0xd8, 0xf3, 0x84, 0xa9, 0x40, 0xdc, 0x89, 0x72, 0x55, 0x53, - 0x57, 0xbc, 0x07, 0x48, 0x2a, 0x0a, 0x32, 0x3d, 0x87, 0xae, 0x10, 0xeb, 0x99, 0x82, - 0x5a, 0xe4, 0xe0, 0x06, 0x0e, 0x25, 0x6c, 0x3c, 0x3b, 0xeb, 0xa3, 0x2f, 0xa2, 0xb2, - 0xd2, 0x7f, 0x04, 0x6f, 0x7a, 0x93, 0x6d, 0xf8, 0xa9, 0x61, 0xc8, 0x18, 0x4e, 0xe3, - 0xc6, 0x8e, 0xbc, 0xe9, 0x80, 0x64, 0x45, 0xb4, 0x3e, 0x66, 0x67, 0x19, 0x95, 0xa2, - 0x43, 0x7a, 0x7f, 0x70, 0x91, 0x47, 0x14, 0x8a, 0x76, 0x03, 0x6d, 0x25, 0x5e, 0xba, - 0xc4, 0xd0, 0xd8, 0x34, 0x82, 0x93, 0x23, 0x9a, 0x78, 0x64, 0xe7, 0x9b, 0xef, 0xf7, - 0x6f, 0x61, 0x50, 0xe0, 0xc4, 0xf4, 0x7a, 0x85, 0x26, 0xe3, 0xed, 0x06, 0x75, 0xfa, - 0xc6, 0xac, 0xcc, 0x30, 0xa4, 0xd6, 0x73, 0xca, 0x80, 0x85, 0x95, 0x96, 0xfe, 0xc9, - 0xcd, 0x6a, 0x93, 0xfb, 0xa0, 0xe8, 0x9e, 0xf5, 0x3f, 0x3e, 0x26, 0x74, 0xd3, 0x2a, - 0x4b, 0x43, 0xf9, 0xa4, 0x38, 0x7d, 0xce, 0x33, 0xac, 0xa1, 0xe4, 0xff, 0xdc, 0x6d, - 0x2d, 0x31, 0x89, 0xc6, 0x23, 0xca, 0x56, 0x4d, 0x03, 0xac, 0x5b, 0x35, 0xb1, 0xa7, - 0x47, 0xff, 0x44, 0x6b, 0xc2, 0x5e, 0xd2, 0x2d, 0x09, 0x68, 0x2c, 0xef, 0x3a, 0x30, - 0xff, 0xa5, 0xc4, 0x0e, 0x27, 0x70, 0xf1, 0x84, 0x98, 0xb1, 0x2f, 0x86, 0x8b, 0xa9, - 0x2a, 0x13, 0xaa, 0x4f, 0xa2, 0x14, 0xb0, 0x62, 0xe3, 0x64, 0x9c, 0xf9, 0xc8, 0x5e, - 0x7a, 0x8a, 0x55, 0xf5, 0xf3, 0xdd, 0x68, 0x84, 0x2a, 0xea, 0x7c, 0x92, 0x79, 0x2a, - 0x52, 0x60, 0x0f, 0x86, 0x6c, 0x34, 0xa1, 0x0c, 0x51, 0x14, 0x13, 0x62, 0x02, 0x24, - 0xfb, 0x85, 0xaf, 0xc6, 0x06, 0xdd, 0x4f, 0x7b, 0x2f, 0x76, 0xbe, 0x76, 0x0c, 0xa1, - 0x94, 0xb6, 0xd4, 0x88, 0x2e, 0x5a, 0x4a, 0x76, 0x3d, 0x75, 0x0d, 0xb7, 0xe1, 0x68, - 0xa4, 0x18, 0x11, 0x92, 0x35, 0xda, 0xf9, 0xcb, 0x1b, 0xdb, 0x07, 0xff, 0x46, 0x83, - 0x3a, 0x87, 0xa3, 0x92, 0x6b, 0x14, 0xa5, 0x26, 0x4f, 0x10, 0x4f, 0x7f, 0x89, 0xf7, - 0x6f, 0x10, 0x10, 0x8f, 0x2b, 0x6e, 0xa5, 0x05, 0xd4, 0xf0, 0xd2, 0x6d, 0x58, 0x31, - 0x1c, 0xc7, 0x21, 0x9c, 0x6b, 0xc4, 0x38, 0xd0, 0xe1, 0xb3, 0x17, 0x60, 0x18, 0x73, - 0x9e, 0x6f, 0x75, 0xd0, 0x73, 0x59, 0xf5, 0xe8, 0x95, 0x7e, 0x12, 0xc3, 0x03, 0xaa, - 0x52, 0x9b, 0x11, 0xa1, 0x81, 0x66, 0x25, 0xa1, 0x20, 0xf3, 0x6d, 0xcd, 0xdd, 0xff, - 0x9c, 0x65, 0xbc, 0xac, 0x8f, 0x10, 0x67, 0xc7, 0xfe, 0x88, 0xf6, 0x44, 0x85, 0x94, - 0xcf, 0x1d, 0xff, 0x8e, 0x29, 0x00, 0xae, 0x84, 0xd2, 0xa7, 0xc8, 0x1b, 0x90, 0x6d, - 0xd0, 0xbc, 0x86, 0x96, 0xe3, 0x70, 0x98, 0x07, 0x4b, 0x75, 0xd8, 0x38, 0xd8, 0xab, - 0xdc, 0x90, 0x46, 0x08, 0x2b, 0xe4, 0xa6, 0x09, 0x95, 0xc4, 0xf4, 0xed, 0x80, 0xe2, - 0xd7, 0x87, 0x38, 0x25, 0x77, 0x3b, 0xa6, 0x3e, 0xe4, 0xcb, 0x97, 0x36, 0x9a, 0x50, - 0x70, 0xb5, 0x72, 0x5c, 0x5f, 0xeb, 0x32, 0x62, 0x45, 0x87, 0x80, 0x1e, 0x5a, 0xc0, - 0x30, 0xe6, 0x45, 0xbd, 0xf2, 0xe5, 0x86, 0xcf, 0x98, 0x66, 0xea, 0xfb, 0x76, 0xf5, - 0x59, 0x76, 0xa3, 0x3d, 0x62, 0xae, 0xdc, 0x76, 0x27, 0x78, 0x3b, 0x48, 0x48, 0x93, - 0x61, 0xf9, 0x9c, 0xae, 0xb1, 0xb1, 0x9c, 0x55, 0x22, 0x58, 0x9f, 0xd2, 0x1d, 0x51, - 0x45, 0x49, 0xd7, 0x4a, 0xb1, 0x92, 0x25, 0xed, 0x6e, 0x4c, 0x20, 0x3a, 0xdd, 0xfa, - 0x55, 0xfc, 0x9e, 0xc9, 0x89, 0xb6, 0x69, 0x02, 0x3c, 0xf3, 0x05, 0xb4, 0x2b, 0x33, - 0x0f, 0xc2, 0x30, 0x80, 0xab, 0xe4, 0x25, 0x01, 0xe5, 0x9c, 0x85, 0x1c, 0x54, 0xc7, - 0x49, 0x66, 0xf6, 0x0b, 0xe9, 0xdc, 0x56, 0x1a, 0x2d, 0x91, 0xf5, 0xd3, 0x2a, 0xdd, - 0x19, 0xb8, 0x9a, 0xca, 0x7a, 0x73, 0x85, 0x39, 0x59, 0x33, 0x48, 0x6f, 0xab, 0x00, - 0xcc, 0x53, 0x03, 0xc5, 0xf3, 0xf0, - ], - ock: [ - 0x55, 0x0e, 0xbf, 0x98, 0x83, 0x6c, 0xce, 0x43, 0x52, 0x25, 0xa1, 0x4b, 0xa6, 0x52, - 0xa7, 0xd5, 0x58, 0xcf, 0x5f, 0x3f, 0x7a, 0xfb, 0x00, 0xb0, 0x24, 0x70, 0xe8, 0xe4, - 0xd2, 0x6d, 0xb7, 0x9c, - ], - op: [ - 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, - 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, - 0x89, 0xcf, 0xf9, 0x1e, 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, - 0x58, 0x93, 0x20, 0x26, 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, - 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, - ], - c_out: [ - 0x9a, 0x01, 0xb7, 0x5e, 0x27, 0xea, 0x97, 0x51, 0x45, 0x5d, 0x54, 0xf2, 0xa5, 0x2b, - 0x88, 0x4b, 0x45, 0x6a, 0x6f, 0xc3, 0xda, 0xdb, 0xec, 0x79, 0xbf, 0x4d, 0x10, 0xbe, - 0x06, 0x7b, 0xef, 0x3e, 0xa2, 0xa5, 0xc0, 0x59, 0x81, 0xd4, 0x06, 0x05, 0x6a, 0x2f, - 0xf6, 0x4c, 0xb4, 0xc6, 0xfd, 0x46, 0x7d, 0xa8, 0x0b, 0xa1, 0x17, 0x48, 0xe9, 0xe2, - 0xae, 0x07, 0xb7, 0x62, 0xdf, 0x9d, 0x4a, 0x23, 0x58, 0x77, 0xf5, 0x8f, 0x43, 0x24, - 0xd8, 0x00, 0x3c, 0x32, 0x4f, 0xd9, 0xc6, 0x39, 0xbc, 0xa6, - ], - asset: Some([ - 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, - 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, - 0x82, 0x1a, 0x41, 0x84, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0x53, 0x3d, 0xc3, 0xd4, 0x93, 0xf2, 0xb8, 0x7a, 0x03, 0x3d, 0xf5, 0x07, 0x05, 0xf2, - 0x90, 0x54, 0x16, 0x38, 0xe9, 0x08, 0x7d, 0xcd, 0xbc, 0xfe, 0x52, 0x7e, 0x77, 0x5a, - 0xaf, 0x09, 0x30, 0x29, 0xac, 0xec, 0x74, 0xdd, 0xe6, 0x02, 0xfc, 0x7c, 0x73, 0xcb, - 0x38, 0x50, 0xbd, 0xfb, 0xf2, 0x61, 0x79, 0x4c, 0x9c, 0x29, 0x9d, 0x0b, 0x98, 0xee, - 0x0f, 0x20, 0x71, 0xd6, 0xd4, 0xe3, 0x7b, 0x05, - ], - ovk: [ - 0x32, 0x4d, 0xce, 0x2a, 0x1e, 0xa1, 0xe4, 0x30, 0x4f, 0x49, 0xe4, 0x3a, 0xe0, 0x65, - 0xe3, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, 0xd1, - 0x8d, 0xea, 0x5f, 0xb6, - ], - default_d: [ - 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, - ], - default_pk_d: [ - 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, - 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, - 0xab, 0x00, 0xa0, 0x28, - ], - v: 12711846894898776584, - rseed: [ - 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, - 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, - 0xad, 0xe8, 0x24, 0xf3, - ], - memo: [ - 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, - 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, - 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, - 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, - 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, - 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, - 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, - 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, - 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, - 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, - 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, - 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, - 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, - 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, - 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, - 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, - 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, - 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, - 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, - 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, - 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, - 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, - 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, - 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, - 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, - 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, - 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, - 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, - 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, - 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, - 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, - 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, - 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, - 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, - 0x66, 0x17, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x5d, 0xd1, 0x3d, 0xcf, 0x9a, 0xf3, 0x52, 0xf5, 0xfe, 0x0b, 0x2b, 0xcb, 0xd0, 0xdb, - 0xd7, 0xda, 0xfb, 0xbe, 0x53, 0xb0, 0xa9, 0x6b, 0x08, 0x1c, 0x90, 0xba, 0xde, 0xd9, - 0xbe, 0x4b, 0x4f, 0x87, - ], - rho: [ - 0x56, 0xbc, 0x48, 0x21, 0xa5, 0x3d, 0x5e, 0x9e, 0x6d, 0x7a, 0x04, 0x44, 0x44, 0x45, - 0x4f, 0xfb, 0xc2, 0x36, 0x9c, 0xb1, 0x48, 0xeb, 0x76, 0xf1, 0xed, 0xf1, 0xb5, 0xc7, - 0x41, 0x84, 0x28, 0x2a, - ], - cmx: [ - 0xd7, 0x60, 0xac, 0xdb, 0xca, 0xda, 0xd1, 0x88, 0x08, 0x4f, 0xe4, 0x1a, 0x5c, 0x03, - 0xc2, 0xc8, 0xce, 0x34, 0xe1, 0x5f, 0x9d, 0xf4, 0x7b, 0x86, 0x9c, 0x44, 0xc7, 0x21, - 0x13, 0xa4, 0x0c, 0x3d, - ], - esk: [ - 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, 0xdf, 0x7c, 0xe2, 0xd2, - 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, 0x86, 0x48, 0x56, 0x2c, - 0xbd, 0x86, 0x3f, 0x09, - ], - ephemeral_key: [ - 0x5a, 0x48, 0x58, 0x15, 0xc4, 0xa7, 0x47, 0x06, 0xe9, 0xde, 0x87, 0xfa, 0x60, 0xa2, - 0x81, 0x6f, 0x89, 0x0b, 0xe3, 0xdb, 0x54, 0xeb, 0x3f, 0x4b, 0xaf, 0x37, 0xdb, 0xc9, - 0xbd, 0xe5, 0xfe, 0x9d, - ], - shared_secret: [ - 0x96, 0x8d, 0xf2, 0xe8, 0x5d, 0x7b, 0xd1, 0x08, 0xf5, 0x72, 0x12, 0x53, 0x93, 0x76, - 0xaf, 0x25, 0x83, 0x2e, 0xf4, 0xdb, 0xd6, 0x40, 0x2a, 0x41, 0x4d, 0x73, 0xc5, 0x6b, - 0xee, 0xe4, 0xf2, 0xa8, - ], - k_enc: [ - 0xf7, 0x73, 0x91, 0x24, 0x3f, 0xdb, 0x35, 0xb2, 0x26, 0x94, 0xdb, 0x91, 0xde, 0xbd, - 0x78, 0x55, 0x79, 0x3c, 0xa7, 0x1e, 0x82, 0xbd, 0xc2, 0xee, 0x74, 0xc9, 0xb7, 0xb6, - 0x97, 0xc0, 0x24, 0x71, - ], - p_enc: [ - 0x03, 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, 0x08, 0x0a, - 0x98, 0x91, 0x66, 0x8d, 0x69, 0xb0, 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, - 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, - 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0xf9, 0x78, 0x1e, 0xbe, - 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, - 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, - 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, - 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, - 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, - 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, - 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, - 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, - 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, - 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, - 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, - 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, - 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, - 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, - 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, - 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, - 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, - 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, - 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, - 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, - 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, - 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, - 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, - 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, - 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, - 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, - 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, - 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, - 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, - 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, - 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, - 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, - 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, - 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, - 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, - 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, - 0x66, 0x17, 0x00, 0x8c, - ], - c_enc: [ - 0xf9, 0x09, 0x97, 0x73, 0x8b, 0x14, 0xd8, 0xa8, 0x4e, 0x32, 0x74, 0xbb, 0x70, 0x76, - 0x31, 0x15, 0xb7, 0x2e, 0x0a, 0x3d, 0xde, 0x8e, 0xa4, 0x70, 0x91, 0x1f, 0xb4, 0x58, - 0x70, 0xb0, 0x14, 0x8e, 0x7d, 0x37, 0x2b, 0xf2, 0x26, 0x8b, 0x3e, 0xe8, 0xda, 0xe5, - 0xfd, 0xe5, 0xea, 0x9b, 0x61, 0x59, 0x8e, 0xf1, 0x1b, 0x73, 0x14, 0x4f, 0x75, 0x53, - 0xb2, 0x13, 0xa0, 0x4c, 0x85, 0xf2, 0x5c, 0x54, 0x6c, 0x8a, 0x38, 0xa6, 0x0e, 0x50, - 0x86, 0x08, 0xb9, 0xca, 0x59, 0x3b, 0x94, 0xd8, 0x68, 0x8d, 0x6e, 0xff, 0xa5, 0x36, - 0x04, 0xd4, 0xdb, 0xc0, 0xf3, 0x45, 0x03, 0xaa, 0xe4, 0x6f, 0x3c, 0x8a, 0x8d, 0x2e, - 0x46, 0xa8, 0x1f, 0x09, 0x12, 0x6c, 0x45, 0x36, 0xfd, 0x02, 0x58, 0xf5, 0x97, 0x40, - 0xad, 0x0d, 0xb8, 0x02, 0xcc, 0x02, 0x42, 0x53, 0x4d, 0xdf, 0x52, 0xa6, 0xbf, 0x6a, - 0x03, 0x4d, 0xe6, 0x26, 0xf0, 0x18, 0x84, 0x4a, 0xdc, 0xb2, 0x6d, 0xcd, 0xc2, 0x85, - 0x16, 0x37, 0x16, 0xdd, 0x54, 0x65, 0x1c, 0x88, 0x73, 0x53, 0xf1, 0xff, 0xef, 0xa0, - 0x37, 0x71, 0x2a, 0xc0, 0xdf, 0x3a, 0x92, 0x98, 0x19, 0x06, 0x87, 0x54, 0x9d, 0x79, - 0xc6, 0xa3, 0x60, 0x0c, 0xc1, 0xc7, 0x29, 0xa3, 0x93, 0xd4, 0x4f, 0xec, 0xe5, 0x7f, - 0xd4, 0xcb, 0x0c, 0x0f, 0xb0, 0xc7, 0x86, 0x1b, 0x92, 0x5b, 0x94, 0xcd, 0x6a, 0x26, - 0x90, 0xf0, 0x02, 0xc4, 0x3a, 0x16, 0x6e, 0x56, 0x77, 0x72, 0x9f, 0x35, 0x52, 0xae, - 0xe0, 0xf2, 0xc1, 0x95, 0xaa, 0x91, 0xb2, 0xdd, 0xe3, 0x65, 0xdd, 0x14, 0xf2, 0xf0, - 0x7b, 0x3c, 0x38, 0x34, 0x7f, 0x6c, 0x0d, 0xab, 0x82, 0x84, 0x1e, 0xba, 0xde, 0x1e, - 0xf8, 0x13, 0xf2, 0xcd, 0x88, 0x5b, 0x57, 0x84, 0x37, 0x44, 0x45, 0x24, 0x93, 0x6a, - 0x65, 0x46, 0xc4, 0x55, 0xd6, 0xc9, 0x2e, 0x6d, 0x3d, 0xc5, 0x38, 0xb6, 0xcd, 0x9f, - 0x6d, 0x4c, 0xc0, 0xd7, 0x4d, 0x7b, 0xc2, 0x46, 0x7e, 0x21, 0x5b, 0xe8, 0xc3, 0xd4, - 0xff, 0x91, 0x8a, 0x2d, 0x98, 0x71, 0x00, 0xff, 0x34, 0x02, 0x4c, 0x88, 0x62, 0x79, - 0xd6, 0x4c, 0xaf, 0xdf, 0xd9, 0x0f, 0x1c, 0x04, 0xc4, 0x6b, 0xc9, 0xd5, 0xe9, 0xe2, - 0xaf, 0xd0, 0x3a, 0xb7, 0x55, 0xe4, 0x0f, 0x08, 0x7e, 0xb5, 0x1e, 0xe3, 0xd1, 0x02, - 0xb6, 0xb0, 0x69, 0xb6, 0x50, 0xf5, 0xd8, 0x55, 0x03, 0x35, 0x47, 0x1b, 0x24, 0x46, - 0x5d, 0x93, 0x4d, 0x63, 0x34, 0x39, 0xb1, 0x08, 0xd9, 0x04, 0x2b, 0x37, 0xf9, 0xf7, - 0x2e, 0x74, 0xfd, 0x6b, 0xa0, 0x01, 0x58, 0x5b, 0x08, 0x62, 0xdb, 0x99, 0x4a, 0x5e, - 0xc1, 0x2d, 0xc9, 0x1e, 0x01, 0x48, 0x6a, 0x8d, 0xc6, 0x8a, 0xb9, 0xa3, 0x41, 0x93, - 0x52, 0x61, 0x73, 0xec, 0xc0, 0xd1, 0x55, 0xb5, 0xcd, 0xd6, 0xbc, 0x07, 0xe6, 0x3e, - 0x41, 0xaf, 0x9e, 0x52, 0x4c, 0xd3, 0xe6, 0x55, 0x5d, 0x38, 0xb4, 0x6d, 0xb2, 0xd9, - 0x9e, 0x5b, 0xa4, 0xa4, 0x95, 0xff, 0x30, 0xfe, 0xf2, 0x54, 0xc9, 0xfe, 0x7b, 0x79, - 0x0c, 0xe5, 0x6a, 0x40, 0xf4, 0x00, 0x27, 0xbb, 0x62, 0x05, 0x86, 0x38, 0xc4, 0x94, - 0x17, 0x7b, 0x7f, 0x5c, 0x8f, 0x29, 0x44, 0x9e, 0x9e, 0xc3, 0xbd, 0xb3, 0xab, 0x04, - 0x16, 0x0d, 0x96, 0xd0, 0xd4, 0x04, 0x79, 0x5d, 0x54, 0x28, 0x40, 0x82, 0xb6, 0x35, - 0x7d, 0x58, 0x1d, 0xc2, 0x64, 0x81, 0x13, 0x67, 0xbb, 0xb1, 0x31, 0x9a, 0x31, 0xf7, - 0x66, 0x4a, 0x4e, 0xca, 0x93, 0x2a, 0xbb, 0xd7, 0x33, 0xa7, 0x1a, 0x31, 0xaf, 0x23, - 0x11, 0xc4, 0x9a, 0xc9, 0xaf, 0x22, 0xf8, 0x16, 0x7b, 0x25, 0x51, 0xac, 0xf5, 0x73, - 0xd9, 0x1b, 0x40, 0x98, 0xc4, 0xde, 0xa8, 0xa9, 0x79, 0x9d, 0x9d, 0x54, 0x52, 0x0c, - 0xc6, 0x3e, 0x55, 0x71, 0x8a, 0x24, 0x85, 0xbf, 0x6f, 0x63, 0x16, 0x30, 0x7c, 0xea, - 0x21, 0x5e, 0x22, 0x22, 0x8d, 0x45, 0x34, 0x9a, 0x03, 0x50, 0x31, 0xa4, 0xcb, 0x67, - 0x7b, 0x52, 0x3a, 0x3a, 0x51, 0x25, 0x2c, 0x6c, 0x61, 0xd0, 0xe2, 0x43, 0x2b, 0x94, - 0xac, 0x9c, 0x0d, 0xb5, 0x40, 0xf3, 0x5b, 0x1d, 0xde, 0x91, 0xa3, 0xaf, 0x37, 0xa6, - 0x71, 0xb8, 0xaa, 0x9f, 0x69, 0xf0, - ], - ock: [ - 0x53, 0x29, 0x6e, 0xed, 0x43, 0xb4, 0xeb, 0x30, 0xa4, 0x3d, 0x88, 0x90, 0x2f, 0x74, - 0x04, 0x26, 0x62, 0x1d, 0x85, 0x21, 0x3a, 0x36, 0xc5, 0x20, 0xa1, 0x84, 0xa4, 0x3a, - 0xfb, 0xd4, 0x89, 0x6d, - ], - op: [ - 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, - 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, - 0xab, 0x00, 0xa0, 0x28, 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, - 0xdf, 0x7c, 0xe2, 0xd2, 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, - 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, - ], - c_out: [ - 0x38, 0xee, 0x14, 0xef, 0xb0, 0x63, 0x94, 0x64, 0x44, 0x6f, 0x5f, 0xb8, 0x79, 0x5d, - 0x23, 0xf8, 0x8c, 0xf5, 0x65, 0x37, 0xe6, 0x4e, 0x1a, 0x46, 0x63, 0x17, 0xb3, 0x6f, - 0x22, 0x2e, 0x00, 0x5b, 0x92, 0x4c, 0xc9, 0x10, 0xd6, 0x29, 0x06, 0x6e, 0x05, 0x07, - 0xcb, 0x91, 0x2b, 0x0b, 0xc1, 0xd3, 0x16, 0xc2, 0x00, 0xb1, 0xa9, 0x56, 0x49, 0xc0, - 0xc5, 0x30, 0xb4, 0xf3, 0xd0, 0x43, 0x06, 0x8e, 0xf6, 0xf4, 0x2d, 0xcb, 0xef, 0xd0, - 0x2a, 0x34, 0x80, 0xe3, 0x2a, 0xa4, 0x5e, 0x33, 0xce, 0x25, - ], - asset: Some([ - 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, - 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, - 0xe3, 0x81, 0x93, 0xbc, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0x77, 0x5c, 0x7f, 0x5c, 0xab, 0x43, 0x86, 0x88, 0x64, 0x3d, 0xdd, 0x15, 0x8d, 0xda, - 0xed, 0xf9, 0xa0, 0xea, 0xef, 0x61, 0x4b, 0x54, 0x90, 0x60, 0xf1, 0xe4, 0xd7, 0xcc, - 0x3e, 0x7e, 0x8b, 0x64, 0x49, 0x9a, 0x81, 0x8a, 0x6d, 0x0e, 0x33, 0x57, 0x68, 0x6e, - 0x65, 0xbc, 0x27, 0x4e, 0x3f, 0x7d, 0x45, 0x5b, 0x91, 0x1f, 0x13, 0x9f, 0x19, 0xf0, - 0x81, 0x61, 0x57, 0x51, 0x91, 0x3e, 0xb4, 0x12, - ], - ovk: [ - 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, 0x0c, - 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, 0x64, 0xe8, - 0x4b, 0xac, 0x37, 0x92, - ], - default_d: [ - 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, - ], - default_pk_d: [ - 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, - 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, - 0x96, 0xdc, 0xe6, 0xb7, - ], - v: 10238534295395242511, - rseed: [ - 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, - 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, - 0xa5, 0xfa, 0x38, 0x5d, - ], - memo: [ - 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, - 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, - 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, - 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, - 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, - 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, - 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, - 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, - 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, - 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, - 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, - 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, - 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, - 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, - 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, - 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, - 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, - 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, - 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, - 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, - 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, - 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, - 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, - 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, - 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, - 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, - 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, - 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, - 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, - 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, - 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, - 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, - 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, - 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, - 0xee, 0xfc, 0x52, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x43, 0x94, 0x47, 0xab, 0x14, 0x5a, 0x6f, 0x0e, 0x5a, 0x3b, 0x43, 0x63, 0x04, 0x4c, - 0x73, 0x07, 0x93, 0xf4, 0x36, 0x33, 0x1f, 0xfe, 0x66, 0x30, 0xc7, 0xca, 0x2d, 0x9b, - 0x23, 0x2a, 0xe1, 0x98, - ], - rho: [ - 0xd6, 0xff, 0xc4, 0x74, 0x88, 0xad, 0x05, 0x93, 0x89, 0x70, 0xc4, 0xb1, 0x56, 0xd0, - 0x53, 0xb9, 0x3b, 0xcb, 0xb4, 0x37, 0x57, 0x1c, 0x62, 0xf3, 0x75, 0x60, 0x7e, 0x90, - 0x4e, 0xb3, 0xa2, 0x08, - ], - cmx: [ - 0x8f, 0x56, 0xd1, 0x3f, 0xd9, 0xc8, 0x3e, 0xb7, 0x1b, 0x95, 0x87, 0x7a, 0x4f, 0x29, - 0x39, 0x64, 0xbf, 0x3f, 0x73, 0x1d, 0x8d, 0xf2, 0x04, 0x32, 0x2c, 0xed, 0xcb, 0x38, - 0x68, 0x21, 0x90, 0x3c, - ], - esk: [ - 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, 0x44, 0xb0, 0xb0, 0x4f, - 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, 0xa9, 0xec, 0x88, 0x17, - 0x18, 0x65, 0x40, 0x33, - ], - ephemeral_key: [ - 0x51, 0x66, 0x26, 0x31, 0x6e, 0xea, 0x63, 0xa6, 0x45, 0xae, 0x56, 0x23, 0x81, 0x5a, - 0x31, 0x74, 0xb3, 0xed, 0x36, 0x64, 0xc3, 0x3e, 0x6a, 0x51, 0x81, 0xa9, 0xf5, 0xb5, - 0x42, 0x76, 0x7a, 0x2d, - ], - shared_secret: [ - 0xf6, 0x04, 0x23, 0x98, 0x7f, 0x0e, 0x67, 0x6d, 0x1a, 0x3b, 0xb6, 0xef, 0xe0, 0x39, - 0x42, 0x1d, 0xbb, 0xc8, 0x24, 0xb6, 0x90, 0xc1, 0x94, 0xa4, 0x90, 0xe4, 0x17, 0x1d, - 0xde, 0x21, 0x58, 0x19, - ], - k_enc: [ - 0x20, 0x98, 0x25, 0x7e, 0x2b, 0x9b, 0x7f, 0xc0, 0x62, 0x82, 0x38, 0x03, 0x38, 0x59, - 0x7d, 0xcb, 0x62, 0x7d, 0xdf, 0x47, 0x3e, 0x83, 0xa7, 0x2e, 0x61, 0xb0, 0xf2, 0x2c, - 0xcf, 0xaf, 0xbe, 0x4e, - ], - p_enc: [ - 0x03, 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, 0x0f, 0x12, - 0xb0, 0x11, 0xb2, 0x94, 0x16, 0x8e, 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, - 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, - 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, 0xfa, 0x38, 0x5d, 0x76, 0xba, 0x24, 0x3f, - 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, - 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, - 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, - 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, - 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, - 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, - 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, - 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, - 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, - 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, - 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, - 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, - 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, - 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, - 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, - 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, - 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, - 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, - 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, - 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, - 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, - 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, - 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, - 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, - 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, - 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, - 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, - 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, - 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, - 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, - 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, - 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, - 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, - 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, - 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, - 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, - 0xee, 0xfc, 0x52, 0x7b, - ], - c_enc: [ - 0xa4, 0x01, 0xab, 0x60, 0x1f, 0x8d, 0x69, 0xd9, 0x38, 0x0c, 0x3d, 0xef, 0x1f, 0x1a, - 0x34, 0xbe, 0x6c, 0xfa, 0x4d, 0x83, 0x8b, 0xf8, 0x7f, 0x00, 0xe3, 0x6b, 0xe6, 0xbe, - 0x68, 0x60, 0xbe, 0xa8, 0x3d, 0xab, 0xdd, 0x00, 0xab, 0xe7, 0xe0, 0xd1, 0x21, 0x90, - 0xfb, 0x54, 0xb0, 0xf2, 0xad, 0xcf, 0xef, 0x9e, 0xf4, 0x2b, 0xa2, 0x31, 0x77, 0x6a, - 0xd3, 0xee, 0x09, 0x86, 0xdb, 0x3f, 0x4f, 0xc0, 0xa8, 0xa1, 0xc6, 0xa7, 0xfe, 0x54, - 0xa6, 0x6b, 0xd7, 0x68, 0xa9, 0xde, 0xd2, 0x5b, 0xb1, 0x89, 0xd5, 0x87, 0x1c, 0xaf, - 0x4d, 0xf8, 0x95, 0x6c, 0x2f, 0x30, 0x70, 0x15, 0x89, 0xa4, 0xdc, 0xdb, 0x68, 0x11, - 0x6d, 0x0f, 0x50, 0x9b, 0x34, 0x1e, 0x8f, 0x25, 0x8e, 0x17, 0x38, 0xb5, 0x51, 0x9c, - 0x99, 0xf1, 0xdb, 0xd0, 0x86, 0x31, 0x56, 0x2f, 0x90, 0xd1, 0x5e, 0x72, 0x8a, 0x85, - 0x25, 0xa1, 0x1b, 0xfe, 0x53, 0x95, 0x24, 0x5d, 0x71, 0x79, 0xcf, 0x8e, 0x97, 0xa8, - 0x3f, 0xaa, 0x4c, 0xf3, 0xb2, 0xa8, 0xb5, 0xef, 0x62, 0x13, 0xe3, 0x30, 0x89, 0xb4, - 0xeb, 0x03, 0xe7, 0xc2, 0xf0, 0x12, 0x11, 0xfc, 0x53, 0xbc, 0x01, 0x16, 0x40, 0x05, - 0x01, 0x5d, 0xbf, 0x33, 0xc6, 0x50, 0xa3, 0xf8, 0x33, 0xba, 0x67, 0x77, 0xcf, 0xf1, - 0xd7, 0x38, 0xe2, 0x1c, 0x58, 0xdc, 0x05, 0xc3, 0xb4, 0xec, 0xb9, 0x7a, 0x6c, 0xe0, - 0xb0, 0xc5, 0xee, 0x94, 0x4c, 0x24, 0xb3, 0x3b, 0xb0, 0xce, 0x32, 0xbe, 0x02, 0x3e, - 0x21, 0x3f, 0xf7, 0xc9, 0xd4, 0x12, 0x4f, 0xc9, 0xdc, 0x4a, 0xa7, 0xca, 0x47, 0x13, - 0x86, 0x48, 0xe2, 0xbb, 0x80, 0x7c, 0xea, 0x7a, 0x58, 0xe7, 0x67, 0xd3, 0x27, 0x07, - 0x4a, 0xe5, 0xe3, 0x9c, 0x3c, 0x17, 0xb7, 0x7c, 0x09, 0x0a, 0xf9, 0x42, 0x5b, 0xc6, - 0x40, 0xd2, 0x1d, 0xd6, 0x81, 0xa6, 0x37, 0x45, 0xe9, 0x02, 0x59, 0xe2, 0xd1, 0x09, - 0x0c, 0x88, 0x48, 0x8e, 0x21, 0x48, 0xb9, 0xee, 0x24, 0x31, 0xc5, 0xae, 0xf5, 0x10, - 0x95, 0xb3, 0x5a, 0x37, 0x7c, 0xfa, 0x76, 0x5d, 0x82, 0x24, 0x98, 0x83, 0x00, 0x04, - 0x71, 0x79, 0xa5, 0x09, 0x40, 0x28, 0xbe, 0x52, 0x7d, 0x5d, 0xe1, 0xc2, 0x69, 0xff, - 0x45, 0x2c, 0x0a, 0xaf, 0x5a, 0x47, 0x7e, 0x93, 0x90, 0xa0, 0xf0, 0xa8, 0x68, 0x11, - 0x3c, 0x7c, 0xd1, 0x9e, 0x2e, 0xac, 0x54, 0x0d, 0xc6, 0x59, 0xda, 0x29, 0x60, 0x06, - 0x77, 0x6e, 0xda, 0x0d, 0xf9, 0x81, 0xc4, 0x11, 0xc1, 0x50, 0x01, 0xa9, 0x8b, 0x6a, - 0xd6, 0x58, 0xd9, 0xa6, 0x4c, 0x12, 0x6a, 0xbe, 0xfc, 0x73, 0x9a, 0xa1, 0xf4, 0x44, - 0xbb, 0x83, 0xf3, 0xf1, 0x4d, 0x11, 0x3d, 0x02, 0x8f, 0xae, 0x10, 0xe4, 0xc5, 0xdb, - 0xe7, 0x78, 0x51, 0x96, 0x83, 0xcd, 0xf4, 0xc2, 0xf4, 0x6c, 0x4a, 0x52, 0xae, 0x12, - 0x09, 0xe1, 0x12, 0x7f, 0x9d, 0xc4, 0xed, 0x86, 0x7d, 0x8e, 0xda, 0x02, 0x4a, 0x68, - 0x9f, 0x6b, 0x15, 0xb8, 0x05, 0x38, 0x03, 0x02, 0x44, 0x02, 0xa1, 0xce, 0x6f, 0x1c, - 0x63, 0x6f, 0x2e, 0xfc, 0xf9, 0xd0, 0x60, 0x51, 0x5c, 0xd6, 0x14, 0x71, 0x8d, 0x51, - 0x52, 0x7d, 0x26, 0x7a, 0xd8, 0x95, 0xfa, 0xd8, 0xec, 0xfb, 0x23, 0x51, 0xf8, 0x92, - 0x45, 0x0d, 0xc8, 0x74, 0xe8, 0x74, 0x39, 0x2c, 0x91, 0xed, 0x3a, 0xf1, 0x18, 0x38, - 0xc4, 0xb5, 0x48, 0x2e, 0x8c, 0x92, 0xeb, 0xc7, 0xa0, 0x08, 0x8e, 0x49, 0xd2, 0xb0, - 0xb4, 0xa1, 0xbd, 0x33, 0x3b, 0x38, 0x7f, 0x49, 0xe3, 0x0f, 0xd2, 0x1a, 0x6e, 0xdc, - 0x89, 0x94, 0x83, 0x4f, 0x28, 0xe9, 0xf2, 0x52, 0x9a, 0x7e, 0x27, 0x24, 0x21, 0x6d, - 0x9e, 0x1a, 0xe5, 0xb4, 0x6e, 0xb1, 0x9a, 0x53, 0xea, 0x2b, 0x97, 0x99, 0x65, 0xf7, - 0x5b, 0x83, 0xf6, 0x86, 0xed, 0xc0, 0x1d, 0x25, 0x7a, 0x06, 0x58, 0xd7, 0x4e, 0x25, - 0xc0, 0xe1, 0xa8, 0xb0, 0x65, 0x60, 0x43, 0x1f, 0x85, 0x10, 0x5c, 0xf9, 0x8a, 0x1f, - 0xfe, 0x28, 0x40, 0x8a, 0x64, 0xf4, 0xc0, 0x27, 0x8d, 0x36, 0xed, 0xea, 0x76, 0x40, - 0xa2, 0x18, 0x26, 0xc3, 0x5d, 0x13, 0x20, 0x25, 0x08, 0x07, 0x2b, 0x68, 0x82, 0xf4, - 0xd8, 0x2e, 0x93, 0x3c, 0x89, 0xe1, - ], - ock: [ - 0x2a, 0x2e, 0x0d, 0x99, 0x69, 0xf0, 0x2e, 0xbd, 0xb6, 0xd9, 0xc8, 0xe7, 0xe6, 0xfd, - 0xde, 0x20, 0x85, 0x12, 0x4b, 0x19, 0xad, 0x70, 0x90, 0xcc, 0x26, 0x15, 0x1d, 0x4d, - 0xa4, 0x2a, 0x00, 0x3e, - ], - op: [ - 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, - 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, - 0x96, 0xdc, 0xe6, 0xb7, 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, - 0x44, 0xb0, 0xb0, 0x4f, 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, - 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, - ], - c_out: [ - 0x74, 0x6a, 0xae, 0x9d, 0xa6, 0x1c, 0x02, 0xae, 0xaa, 0x8b, 0xed, 0xbe, 0x2b, 0x6c, - 0x84, 0x1b, 0xc4, 0x36, 0x17, 0x3c, 0x7c, 0x91, 0x13, 0x66, 0x3a, 0x39, 0xc1, 0x74, - 0x69, 0x29, 0x0b, 0xd2, 0x19, 0xea, 0xdc, 0x4a, 0x97, 0x5a, 0xd0, 0x52, 0xd0, 0x5d, - 0xc0, 0xa3, 0x08, 0xf3, 0x63, 0xf9, 0x22, 0x68, 0x2d, 0x75, 0x21, 0x9d, 0xaa, 0x33, - 0x6f, 0x69, 0xb5, 0x9e, 0x86, 0x7c, 0x85, 0xd9, 0x37, 0x34, 0x4c, 0x19, 0xd3, 0x88, - 0x01, 0x63, 0x19, 0xb3, 0xf6, 0x0f, 0x76, 0xd0, 0x28, 0x93, - ], - asset: Some([ - 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, - 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, - 0xf6, 0x99, 0x03, 0x18, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0x9c, 0xe9, 0x20, 0x37, 0x6a, 0x6a, 0x54, 0x1e, 0x6a, 0xad, 0x66, 0x0e, 0xfa, 0x09, - 0x8d, 0xc5, 0x4c, 0x18, 0xfc, 0xeb, 0x13, 0xd0, 0x99, 0x9f, 0xbc, 0xc7, 0xfd, 0x45, - 0xa5, 0x7c, 0xcc, 0x10, 0xb8, 0xaa, 0x86, 0xc4, 0x54, 0x0d, 0x0a, 0x9f, 0xc6, 0x6d, - 0xf8, 0x5d, 0xad, 0xd6, 0x21, 0x56, 0x36, 0x5e, 0x28, 0xa3, 0xe9, 0x80, 0xb9, 0x8d, - 0x13, 0x1b, 0x50, 0x3a, 0xa0, 0x6a, 0x6c, 0x19, - ], - ovk: [ - 0xf8, 0x1a, 0xd6, 0x17, 0xfa, 0x26, 0xf0, 0xdf, 0xb8, 0x36, 0x55, 0xb8, 0xa2, 0x9a, - 0x7f, 0x83, 0x42, 0x32, 0x42, 0x5e, 0x8c, 0x47, 0x45, 0x88, 0xf1, 0x8d, 0xd3, 0x26, - 0xaa, 0x39, 0x6c, 0x3e, - ], - default_d: [ - 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, - ], - default_pk_d: [ - 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, - 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, - 0x43, 0x4b, 0x1e, 0xb0, - ], - v: 2690686290017047047, - rseed: [ - 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, - 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, - 0xee, 0xba, 0xe6, 0xfa, - ], - memo: [ - 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, - 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, - 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, - 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, - 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, - 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, - 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, - 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, - 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, - 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, - 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, - 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, - 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, - 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, - 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, - 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, - 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, - 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, - 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, - 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, - 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, - 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, - 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, - 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, - 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, - 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, - 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, - 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, - 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, - 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, - 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, - 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, - 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, - 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, - 0xe8, 0xba, 0x4f, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0xf4, 0x5c, 0xba, 0x14, 0x6a, 0xe7, 0x18, 0x85, 0xfd, 0x61, 0xb4, 0xa0, 0xf3, 0x6b, - 0x95, 0x26, 0xa6, 0xe9, 0x4a, 0x49, 0x70, 0x10, 0xe3, 0x2a, 0x8a, 0x76, 0xbc, 0xdf, - 0xa7, 0x20, 0xb8, 0xa6, - ], - rho: [ - 0x85, 0x2f, 0x5c, 0x39, 0xd3, 0xf3, 0x55, 0xa3, 0x85, 0xe2, 0xab, 0xd2, 0x54, 0x3a, - 0xa5, 0xed, 0x09, 0xc6, 0xee, 0x3b, 0x7f, 0x39, 0x34, 0x14, 0xe1, 0x1c, 0xd4, 0x20, - 0x4c, 0x3f, 0x8d, 0x26, - ], - cmx: [ - 0x69, 0x4b, 0x6f, 0x3a, 0xb8, 0x37, 0xa9, 0x26, 0xd6, 0x77, 0x3e, 0xc4, 0xa6, 0x76, - 0x5d, 0xef, 0x82, 0x89, 0x33, 0x74, 0x2d, 0x93, 0x29, 0xfc, 0x88, 0x67, 0x1c, 0xcd, - 0x81, 0x21, 0xa4, 0x23, - ], - esk: [ - 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, 0xa5, 0xd8, 0x9a, 0xa8, - 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, 0x6a, 0x72, 0xcb, 0x74, - 0xfb, 0x18, 0xd1, 0x17, - ], - ephemeral_key: [ - 0x3c, 0x04, 0xbe, 0x6e, 0x42, 0xa6, 0xca, 0x7f, 0x5d, 0xda, 0x0d, 0x82, 0xdf, 0x30, - 0x7b, 0xd9, 0x6b, 0xb7, 0xb1, 0xae, 0x8d, 0x62, 0x31, 0x87, 0xe3, 0x9c, 0x00, 0xa4, - 0x8c, 0x25, 0xaa, 0x9d, - ], - shared_secret: [ - 0x3a, 0x60, 0x2b, 0xaf, 0xb8, 0xa2, 0x66, 0x5a, 0x74, 0xdf, 0x34, 0xab, 0x6e, 0x3c, - 0x48, 0x8b, 0x09, 0xe2, 0x28, 0x4e, 0xa1, 0x7d, 0x56, 0x02, 0x62, 0xe2, 0x1f, 0x7f, - 0x3c, 0xba, 0xa3, 0x95, - ], - k_enc: [ - 0x1b, 0x6d, 0xd1, 0x03, 0x49, 0x63, 0x67, 0xc9, 0x2b, 0x36, 0x8f, 0xc2, 0xf1, 0xc6, - 0x2e, 0x56, 0xc8, 0xc9, 0xfb, 0xe3, 0x4a, 0x35, 0x84, 0x1f, 0xe1, 0xa3, 0x70, 0x96, - 0x43, 0xe1, 0x35, 0xe1, - ], - p_enc: [ - 0x03, 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, 0x07, 0xd2, - 0x7a, 0xc6, 0xec, 0x3c, 0x57, 0x25, 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, - 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, - 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, 0xee, 0xba, 0xe6, 0xfa, 0x64, 0xd0, 0x87, 0x40, - 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, 0xc3, 0x93, 0x11, 0x78, - 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, 0xe5, 0xf5, 0xd4, 0xbc, - 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, - 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, - 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, - 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, - 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, - 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, - 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, - 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, - 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, - 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, - 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, - 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, - 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, - 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, - 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, - 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, - 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, - 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, - 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, - 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, - 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, - 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, - 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, - 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, - 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, - 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, - 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, - 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, - 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, - 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, - 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, - 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, - 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, - 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, - 0xe8, 0xba, 0x4f, 0x52, - ], - c_enc: [ - 0xb4, 0x15, 0x88, 0x23, 0x1d, 0x6b, 0xa2, 0x9c, 0xc5, 0xb9, 0xaa, 0xf0, 0xc1, 0xf0, - 0xba, 0x44, 0x16, 0x6e, 0xdb, 0x8a, 0x27, 0x29, 0xca, 0xba, 0x53, 0x71, 0xe7, 0xac, - 0x36, 0x90, 0x0f, 0xaa, 0x64, 0xf5, 0x76, 0x0d, 0xce, 0x55, 0x20, 0xda, 0x82, 0x8d, - 0x5e, 0x25, 0xbd, 0x83, 0x51, 0x95, 0x11, 0x64, 0x12, 0x11, 0x80, 0x9d, 0xff, 0xd8, - 0xcf, 0xeb, 0xff, 0xf3, 0xcd, 0xdc, 0xd2, 0x75, 0x88, 0x1e, 0x39, 0xb6, 0x3d, 0xac, - 0x4d, 0x98, 0x6b, 0x10, 0xc0, 0xe4, 0xc5, 0x52, 0x63, 0xde, 0x3e, 0x02, 0x54, 0x94, - 0x81, 0x8a, 0x38, 0x08, 0xd9, 0xab, 0xc6, 0xec, 0x38, 0x8f, 0x95, 0x26, 0x73, 0x95, - 0x0a, 0xa2, 0xd0, 0xe4, 0xba, 0x00, 0x53, 0x75, 0xac, 0x60, 0x5d, 0xc8, 0x25, 0xde, - 0x4d, 0xd8, 0x93, 0x8b, 0x94, 0x7f, 0xf7, 0x19, 0x4c, 0xfe, 0x7c, 0x1d, 0x79, 0xa1, - 0x27, 0x15, 0x5d, 0x11, 0xcb, 0xe3, 0x43, 0xf3, 0x2f, 0xd1, 0x0c, 0x7d, 0xae, 0x39, - 0x1f, 0x00, 0xb4, 0x4f, 0xbe, 0x30, 0x1c, 0x63, 0xfd, 0x4b, 0xf1, 0xc0, 0xdf, 0xb6, - 0xc9, 0xec, 0xb4, 0xc3, 0xf3, 0xfe, 0xf5, 0x40, 0xb6, 0x7e, 0xb9, 0x23, 0x13, 0x71, - 0x9c, 0x5a, 0x30, 0x7a, 0xd3, 0x95, 0x6b, 0xb9, 0x4e, 0x29, 0x86, 0x85, 0x2a, 0x64, - 0x5a, 0x95, 0xd6, 0xdc, 0x75, 0xaa, 0x27, 0x4c, 0xcf, 0xd2, 0x71, 0xd0, 0xea, 0xe2, - 0x65, 0x81, 0xf5, 0xf5, 0x5d, 0x64, 0x74, 0xaa, 0xad, 0x37, 0x4c, 0x86, 0x45, 0x05, - 0xe6, 0x92, 0x37, 0xf6, 0x66, 0x99, 0xee, 0x39, 0xe9, 0xfc, 0xf5, 0xb1, 0xb7, 0x03, - 0x35, 0x1e, 0x71, 0xf6, 0x3b, 0x02, 0x33, 0x40, 0x82, 0xee, 0xbe, 0xd8, 0x68, 0xb5, - 0x61, 0x2a, 0x33, 0x95, 0x78, 0x5a, 0x33, 0x2a, 0x52, 0x43, 0xe4, 0x98, 0x6e, 0x1f, - 0xf5, 0xb4, 0x2d, 0x06, 0x69, 0xc1, 0x5c, 0x45, 0xff, 0x81, 0xe2, 0x2e, 0xea, 0xe4, - 0xde, 0x7d, 0x9a, 0x4f, 0x57, 0x24, 0xc8, 0x96, 0x03, 0x94, 0x92, 0x5b, 0xa1, 0xa1, - 0x90, 0x0f, 0xa2, 0xb5, 0x59, 0x3d, 0x55, 0x45, 0x5e, 0x0b, 0xe0, 0x31, 0x8c, 0x80, - 0x23, 0x81, 0xec, 0x9c, 0x0a, 0x83, 0xc2, 0xe5, 0xf9, 0x33, 0x9f, 0x02, 0x9c, 0x44, - 0x24, 0x72, 0x8f, 0x91, 0x9d, 0x18, 0x4f, 0x36, 0x16, 0x50, 0xba, 0x65, 0xd6, 0x98, - 0xa8, 0xd1, 0x67, 0xbe, 0xd9, 0xdd, 0x01, 0xfa, 0x70, 0x74, 0xe4, 0x6a, 0xf6, 0x57, - 0x16, 0xdd, 0xd9, 0x7e, 0x7b, 0xb6, 0x00, 0x13, 0x05, 0x96, 0x8c, 0xd5, 0xb4, 0x87, - 0x0d, 0xf2, 0x00, 0x42, 0xe7, 0x69, 0xe0, 0x2d, 0xf1, 0x8b, 0x9f, 0xde, 0x9f, 0xda, - 0xa7, 0x6b, 0x00, 0xca, 0x26, 0x45, 0x9d, 0x54, 0x37, 0x19, 0x19, 0x72, 0xd7, 0x08, - 0xde, 0xda, 0xbf, 0x1d, 0x61, 0x7f, 0x73, 0x3a, 0x60, 0xeb, 0xfe, 0xc6, 0xac, 0xf0, - 0x0b, 0xb1, 0xdf, 0xbf, 0x11, 0x2d, 0x3a, 0xaa, 0xc9, 0xfb, 0xd2, 0x30, 0xcc, 0xaa, - 0x9c, 0xf3, 0x58, 0x45, 0x93, 0x54, 0xac, 0x5b, 0x29, 0xbd, 0xb7, 0x3a, 0x45, 0x27, - 0x1b, 0x1f, 0x9e, 0xd0, 0x0e, 0x3e, 0x20, 0xb1, 0x2f, 0xed, 0x5c, 0xd5, 0x6a, 0xbb, - 0xb0, 0xb9, 0x4a, 0x9e, 0xee, 0x5f, 0xf8, 0xf9, 0x36, 0x1d, 0xfd, 0x6c, 0x94, 0x08, - 0x5d, 0x28, 0x98, 0xe5, 0x46, 0xeb, 0x92, 0xe6, 0xdb, 0xe9, 0xf0, 0x2e, 0xb5, 0xbf, - 0x7d, 0x12, 0x67, 0x5d, 0x3c, 0x6a, 0xc7, 0x18, 0x4b, 0x26, 0x01, 0xe4, 0xf4, 0x05, - 0x37, 0x3a, 0x4f, 0x1c, 0x5d, 0xf7, 0x6b, 0x3c, 0xb5, 0x29, 0x99, 0xd8, 0x0f, 0x59, - 0xb3, 0x94, 0xbc, 0xed, 0x9f, 0x66, 0xbc, 0xf7, 0xdc, 0x37, 0xc2, 0xb4, 0xc6, 0xf7, - 0x74, 0x5b, 0xc6, 0xf0, 0x37, 0x74, 0xfa, 0xc6, 0x24, 0x5d, 0x7c, 0x63, 0x6d, 0xfc, - 0x5f, 0x76, 0x58, 0xb2, 0xd2, 0xfd, 0x84, 0xac, 0xa9, 0xe0, 0xef, 0xcd, 0xe0, 0x09, - 0x3e, 0x62, 0x29, 0x38, 0xb7, 0x5d, 0xae, 0x66, 0xcf, 0x63, 0xf6, 0xd2, 0x35, 0x17, - 0x2e, 0x5a, 0x0b, 0xbe, 0xcd, 0x15, 0x56, 0x6c, 0x61, 0xfe, 0x5a, 0x58, 0x94, 0x7c, - 0x18, 0xb9, 0xb5, 0xa1, 0x21, 0x11, 0x25, 0x94, 0x3b, 0x09, 0x32, 0x24, 0x96, 0x7b, - 0x7e, 0x44, 0x16, 0x70, 0x64, 0xc9, - ], - ock: [ - 0x67, 0x1c, 0xed, 0xd6, 0xf5, 0x73, 0xa4, 0x6f, 0xf1, 0xea, 0xd0, 0x48, 0x21, 0x98, - 0x56, 0x36, 0xe2, 0x3f, 0xb1, 0x5c, 0x6f, 0x48, 0x05, 0xfd, 0x57, 0x63, 0x12, 0xc2, - 0x07, 0x02, 0xa4, 0x24, - ], - op: [ - 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, - 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, - 0x43, 0x4b, 0x1e, 0xb0, 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, - 0xa5, 0xd8, 0x9a, 0xa8, 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, - 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, - ], - c_out: [ - 0x59, 0x97, 0x53, 0xe4, 0x0a, 0xda, 0xea, 0xff, 0x6f, 0xaa, 0xf5, 0xa6, 0xf3, 0x0e, - 0x39, 0x13, 0x8f, 0xde, 0x82, 0x0f, 0x7b, 0xec, 0x7c, 0x8d, 0x0f, 0xd8, 0x4b, 0x48, - 0x36, 0x94, 0xe5, 0x0c, 0x4b, 0xdd, 0xee, 0x2f, 0xb1, 0xa4, 0xf9, 0x95, 0xb1, 0xa3, - 0xba, 0x40, 0xf4, 0x66, 0xb4, 0x2e, 0x8b, 0x5d, 0x01, 0x38, 0xfd, 0x30, 0xbf, 0xf6, - 0xae, 0x8c, 0xb1, 0x55, 0xf4, 0x0c, 0xdc, 0x37, 0x39, 0xfa, 0xbf, 0x2f, 0x00, 0xda, - 0x3a, 0xc6, 0xa7, 0x36, 0x3b, 0xc2, 0xf4, 0xaa, 0x10, 0xfe, - ], - asset: Some([ - 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, - 0xc3, 0x93, 0x11, 0x78, 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, - 0xe5, 0xf5, 0xd4, 0xbc, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0xb4, 0x9e, 0x3c, 0x5b, 0xb9, 0x9e, 0x47, 0xc5, 0x3d, 0x6e, 0x5c, 0x34, 0x7c, 0x99, - 0x8f, 0x30, 0x2d, 0x3f, 0xf4, 0x75, 0x23, 0xe7, 0xc3, 0xd7, 0xb6, 0x4c, 0x82, 0x98, - 0xdc, 0x7b, 0x10, 0xe9, 0x54, 0xdf, 0x06, 0x00, 0x0b, 0xc0, 0xcc, 0x30, 0xec, 0xf6, - 0x75, 0x5d, 0x92, 0x7e, 0xee, 0xce, 0xe6, 0xec, 0x9e, 0x8e, 0x0c, 0xba, 0xa3, 0x1b, - 0x71, 0xe0, 0xa4, 0x33, 0x4a, 0xd6, 0x42, 0x1b, - ], - ovk: [ - 0x97, 0x9f, 0x06, 0x58, 0x66, 0x73, 0xbc, 0x6f, 0xf1, 0xc5, 0xd3, 0xb3, 0x20, 0xf3, - 0x49, 0xa5, 0xb3, 0xa8, 0xb3, 0x55, 0x59, 0x22, 0x96, 0xaa, 0xf6, 0x1c, 0x5b, 0x72, - 0x52, 0xf7, 0x3e, 0xc0, - ], - default_d: [ - 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, - ], - default_pk_d: [ - 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, - 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, - 0xf4, 0x1a, 0x1f, 0x88, - ], - v: 5531329397987978327, - rseed: [ - 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, - 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, - 0xd0, 0x11, 0x8b, 0xbd, - ], - memo: [ - 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, - 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, - 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, - 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, - 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, - 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, - 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, - 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, - 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, - 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, - 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, - 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, - 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, - 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, - 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, - 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, - 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, - 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, - 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, - 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, - 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, - 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, - 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, - 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, - 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, - 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, - 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, - 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, - 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, - 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, - 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, - 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, - 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, - 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, - 0x09, 0x5d, 0x98, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x1a, 0xa2, 0x3d, 0x96, 0x79, 0xbc, 0x66, 0x04, 0xb6, 0x25, 0x2c, 0x4f, 0x48, 0x1b, - 0x3a, 0x2a, 0xf5, 0x46, 0x32, 0xf8, 0x30, 0x08, 0x14, 0x68, 0x29, 0x65, 0x94, 0x5e, - 0x7e, 0x33, 0x2a, 0x0d, - ], - rho: [ - 0x09, 0x1d, 0x83, 0x73, 0x3a, 0x9f, 0xfb, 0x18, 0xc1, 0x7a, 0xd1, 0x93, 0x8d, 0xd2, - 0x67, 0x93, 0xc3, 0xfe, 0xfa, 0xda, 0xee, 0xa8, 0xe2, 0x3c, 0x44, 0xd5, 0xe0, 0x18, - 0x4b, 0xc8, 0x45, 0x10, - ], - cmx: [ - 0x76, 0xf1, 0xbd, 0x50, 0xf9, 0xb9, 0x06, 0xcb, 0x9f, 0xf2, 0xdd, 0x91, 0x8a, 0x36, - 0x7e, 0x5f, 0xb1, 0xa2, 0xef, 0x39, 0xf1, 0x4f, 0x6c, 0xe9, 0x4f, 0xf9, 0xf0, 0x91, - 0x55, 0xf8, 0xc2, 0x11, - ], - esk: [ - 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, 0xa1, 0xe6, 0xfb, 0x57, - 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, 0xb9, 0x5f, 0xc8, 0x7e, - 0xa7, 0x37, 0x3e, 0x2f, - ], - ephemeral_key: [ - 0xda, 0x72, 0x84, 0xa0, 0xe0, 0xde, 0x52, 0x09, 0x3c, 0xc2, 0xe1, 0x9c, 0x0a, 0xf1, - 0x93, 0xbd, 0xb4, 0x2c, 0x80, 0xc9, 0xc7, 0xf9, 0xf2, 0x36, 0x00, 0xe6, 0x08, 0x01, - 0x72, 0xc5, 0xf5, 0x39, - ], - shared_secret: [ - 0x9b, 0xcf, 0xb9, 0x6f, 0x4c, 0xf1, 0x83, 0xc1, 0x7f, 0xb1, 0x99, 0xda, 0x16, 0x5f, - 0xbf, 0x8a, 0x47, 0x47, 0x7e, 0x00, 0x36, 0x6d, 0x1c, 0xb7, 0x3b, 0x32, 0xec, 0x0e, - 0x3a, 0xc1, 0x98, 0x0f, - ], - k_enc: [ - 0x21, 0xe0, 0x97, 0x87, 0x0a, 0xee, 0xc0, 0x19, 0x76, 0x86, 0xee, 0x37, 0x22, 0x78, - 0xfe, 0x4a, 0xa2, 0x23, 0x8d, 0x87, 0x65, 0x32, 0x63, 0x84, 0x8a, 0x2f, 0xf5, 0x27, - 0x9f, 0x2b, 0x1d, 0x9b, - ], - p_enc: [ - 0x03, 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, 0x57, 0xac, - 0xbf, 0xfe, 0xc7, 0x3a, 0xc3, 0x4c, 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, - 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, - 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, 0xd0, 0x11, 0x8b, 0xbd, 0xc3, 0xcc, 0x4f, 0x43, - 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, 0xe3, 0x7a, 0x83, 0xec, - 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, 0x29, 0x03, 0x35, 0xaa, - 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, - 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, - 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, - 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, - 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, - 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, - 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, - 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, - 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, - 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, - 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, - 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, - 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, - 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, - 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, - 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, - 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, - 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, - 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, - 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, - 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, - 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, - 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, - 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, - 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, - 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, - 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, - 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, - 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, - 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, - 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, - 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, - 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, - 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, - 0x09, 0x5d, 0x98, 0x77, - ], - c_enc: [ - 0x13, 0xd7, 0xdf, 0xcd, 0x1d, 0x75, 0x4d, 0xcd, 0x16, 0x52, 0x32, 0x83, 0x8f, 0x14, - 0xdd, 0x80, 0x5e, 0x12, 0xcc, 0x7e, 0x75, 0x15, 0x43, 0xd2, 0xa6, 0x8e, 0x23, 0x7a, - 0x92, 0x3b, 0xce, 0xeb, 0xa3, 0x5a, 0x62, 0x43, 0xc6, 0xa4, 0xc5, 0xf0, 0xd2, 0xa4, - 0xc3, 0x86, 0x07, 0xa6, 0xf1, 0x1b, 0x17, 0xfd, 0xd6, 0xc6, 0x92, 0x66, 0xf2, 0xc9, - 0x6a, 0xdc, 0x44, 0x6f, 0x2e, 0x2d, 0x07, 0x3e, 0xe9, 0xea, 0xe2, 0x9a, 0x37, 0xef, - 0x5d, 0x03, 0xf6, 0x78, 0xf5, 0x56, 0x29, 0x45, 0xb2, 0x08, 0x27, 0x76, 0xce, 0x9f, - 0x39, 0x08, 0x87, 0x3a, 0x99, 0xa6, 0xa2, 0x8b, 0xae, 0xdc, 0x7f, 0x54, 0x89, 0xce, - 0x4b, 0x30, 0xd8, 0x43, 0x66, 0xc5, 0x46, 0xb4, 0x36, 0x67, 0x91, 0x44, 0xf9, 0x27, - 0xf7, 0x1c, 0x65, 0x09, 0x69, 0xda, 0x22, 0x42, 0x28, 0x5a, 0x86, 0x27, 0x96, 0x54, - 0x89, 0xb7, 0x0b, 0x35, 0x6c, 0xf7, 0x4e, 0x07, 0x8a, 0xa2, 0x7d, 0xa8, 0xf9, 0x2f, - 0xb3, 0x09, 0x57, 0x12, 0x62, 0xf2, 0xd4, 0xc3, 0x36, 0xf7, 0x12, 0x15, 0x9b, 0x3e, - 0x9b, 0x43, 0x24, 0x38, 0x5b, 0xb3, 0x26, 0x2a, 0xc5, 0xf3, 0x13, 0x57, 0xaf, 0x9e, - 0x1a, 0xaa, 0x75, 0xd0, 0x1c, 0x06, 0x31, 0xbf, 0xdd, 0x34, 0xc5, 0x9b, 0x27, 0xd5, - 0x3b, 0xeb, 0xf1, 0xaa, 0x54, 0xe9, 0xc4, 0xaa, 0x98, 0x0f, 0x24, 0x7b, 0xf4, 0x22, - 0xa0, 0xe6, 0xdb, 0xf5, 0x54, 0x6e, 0xdc, 0x10, 0x0f, 0xce, 0x6c, 0xce, 0xc8, 0x32, - 0x7e, 0xb4, 0x8a, 0x9a, 0x39, 0xe4, 0xc2, 0xa9, 0x12, 0xb2, 0x98, 0x85, 0xe0, 0xc3, - 0xe7, 0x33, 0x55, 0x58, 0xbd, 0x85, 0x84, 0x38, 0xd0, 0x35, 0xd2, 0xf2, 0xbe, 0x1d, - 0x35, 0x66, 0xe4, 0x22, 0xfe, 0x37, 0xc0, 0xcb, 0x2e, 0x05, 0x8d, 0xad, 0x8c, 0xc6, - 0x45, 0x62, 0xa5, 0x50, 0x1b, 0x54, 0xa4, 0x4f, 0x9a, 0x77, 0x77, 0xc6, 0xd2, 0x77, - 0x04, 0xa4, 0xce, 0xad, 0x26, 0xa1, 0xc2, 0x56, 0x01, 0x8d, 0xc1, 0xbb, 0xfa, 0x58, - 0x84, 0xa0, 0x6c, 0xc7, 0x25, 0x23, 0xaf, 0xfb, 0x43, 0xf5, 0xc5, 0xbc, 0x2f, 0x1d, - 0x36, 0x04, 0x0f, 0x85, 0xf7, 0xe8, 0xc0, 0x62, 0xc1, 0xf2, 0x26, 0x50, 0x9d, 0x20, - 0xf9, 0xa4, 0x88, 0x5e, 0x15, 0x70, 0x4f, 0x73, 0x01, 0xdf, 0x60, 0x3d, 0xa1, 0xfc, - 0x5b, 0xca, 0x84, 0xf8, 0x55, 0xc1, 0x17, 0xcb, 0x30, 0x55, 0xc5, 0x70, 0x83, 0x45, - 0x7e, 0x1d, 0x14, 0x85, 0x7c, 0x2b, 0xf9, 0x41, 0xe8, 0x20, 0x73, 0x5c, 0x58, 0x8a, - 0xae, 0x6f, 0x66, 0x45, 0xdc, 0x3f, 0xbd, 0x30, 0x65, 0xab, 0xa1, 0x7f, 0xd2, 0x48, - 0x2a, 0x1b, 0x37, 0xb2, 0xf3, 0x88, 0x07, 0x5e, 0x46, 0xbb, 0x9d, 0x37, 0x27, 0xcc, - 0x73, 0xdb, 0xae, 0x0e, 0x96, 0xa8, 0x44, 0x5f, 0xda, 0x8f, 0x87, 0x64, 0xf9, 0x68, - 0x0b, 0xf6, 0xc5, 0x91, 0xa8, 0x48, 0x10, 0xfa, 0x0c, 0x1b, 0x5a, 0x2f, 0x2a, 0xa9, - 0xad, 0xbb, 0x88, 0x64, 0x22, 0x31, 0x72, 0x1e, 0xd6, 0xea, 0x12, 0x16, 0xab, 0x9b, - 0xfa, 0x0e, 0x12, 0x4c, 0xe4, 0x74, 0x94, 0x44, 0x53, 0x4d, 0x68, 0x70, 0x19, 0x74, - 0x60, 0xf7, 0x49, 0xef, 0xb0, 0x28, 0x8f, 0x96, 0x28, 0x3f, 0xc9, 0x37, 0xef, 0xbb, - 0x14, 0x59, 0xaa, 0x73, 0xc2, 0x7b, 0x6b, 0x2b, 0x5c, 0x57, 0x7d, 0x46, 0x60, 0xf9, - 0x8e, 0x81, 0x8c, 0xaa, 0xad, 0xbe, 0x45, 0x4e, 0xcd, 0x16, 0xc1, 0xd8, 0xa9, 0x9b, - 0x77, 0x97, 0x8e, 0x93, 0xd6, 0x9d, 0xcb, 0x8b, 0xf0, 0xe8, 0x4a, 0x0a, 0x91, 0x3f, - 0x55, 0xcc, 0x16, 0x50, 0xc2, 0xb9, 0x2d, 0x4c, 0x9d, 0xcd, 0xb1, 0x2e, 0xe2, 0x36, - 0x7e, 0xd9, 0x79, 0xb9, 0x53, 0x5f, 0xe1, 0x5c, 0x87, 0xd1, 0x7f, 0x37, 0xa3, 0x24, - 0x84, 0x7f, 0x16, 0x45, 0x39, 0x75, 0x7d, 0x83, 0x00, 0x87, 0xf6, 0x39, 0xeb, 0x6c, - 0x3e, 0xfb, 0x8d, 0xa4, 0xff, 0xa5, 0xd7, 0xca, 0x58, 0x34, 0x4d, 0x65, 0x81, 0x76, - 0x64, 0xa7, 0x4e, 0xaf, 0xa1, 0xa4, 0x7f, 0x69, 0xf1, 0xc8, 0x10, 0x6b, 0x6f, 0x5f, - 0x96, 0x4f, 0x4c, 0x73, 0x68, 0xed, 0x11, 0x06, 0x29, 0x54, 0xd2, 0xe8, 0xd3, 0x0c, - 0xcc, 0xac, 0xba, 0xd9, 0xa2, 0xfa, - ], - ock: [ - 0x57, 0x97, 0xef, 0x48, 0x70, 0xb0, 0x86, 0x50, 0xfa, 0x99, 0xad, 0xae, 0x58, 0x85, - 0x19, 0x9e, 0x3b, 0x04, 0x4b, 0x2a, 0x0a, 0x8c, 0xe1, 0x61, 0x43, 0x42, 0xb5, 0xdc, - 0xb2, 0x8e, 0x6e, 0x09, - ], - op: [ - 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, - 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, - 0xf4, 0x1a, 0x1f, 0x88, 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, - 0xa1, 0xe6, 0xfb, 0x57, 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, - 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, - ], - c_out: [ - 0xb8, 0xb4, 0x6c, 0x7e, 0xc4, 0xa8, 0x74, 0x2a, 0x22, 0xd3, 0xcd, 0x11, 0x74, 0x1c, - 0x23, 0x04, 0x22, 0x1c, 0xa5, 0x97, 0x29, 0x4e, 0x08, 0xa4, 0xc7, 0x1b, 0x17, 0xc7, - 0x26, 0x5d, 0x4d, 0xa7, 0x7c, 0xfe, 0x84, 0xb8, 0x7e, 0x76, 0xed, 0xaa, 0xec, 0xc2, - 0x24, 0xb8, 0x36, 0xde, 0x22, 0x4c, 0x73, 0x58, 0x13, 0x19, 0xa0, 0xba, 0x27, 0x88, - 0xdb, 0xf8, 0x3b, 0xcf, 0x47, 0xa4, 0x8e, 0xeb, 0x02, 0xb4, 0x3a, 0x18, 0x02, 0x7b, - 0x8f, 0x59, 0x11, 0x65, 0xc2, 0x86, 0xe8, 0xb6, 0x54, 0xec, - ], - asset: Some([ - 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, - 0xe3, 0x7a, 0x83, 0xec, 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, - 0x29, 0x03, 0x35, 0xaa, - ]), - }, - TestVector { - incoming_viewing_key: [ - 0xa6, 0x68, 0x13, 0x52, 0xa3, 0x52, 0x26, 0x91, 0x10, 0x0f, 0x53, 0xfc, 0x34, 0xab, - 0x73, 0x32, 0x8a, 0xf1, 0xb9, 0xf3, 0xa4, 0xa0, 0x6d, 0xbd, 0x3a, 0x14, 0x99, 0x67, - 0x09, 0xe6, 0xf2, 0x84, 0x31, 0xee, 0x72, 0xf2, 0x69, 0xae, 0xd7, 0x5d, 0x36, 0x34, - 0x89, 0x36, 0x90, 0x5e, 0xbb, 0x91, 0x80, 0x7d, 0x74, 0xd5, 0x0c, 0xb2, 0x7f, 0xcd, - 0x8b, 0x4f, 0xb6, 0xf4, 0x48, 0xc3, 0x62, 0x03, - ], - ovk: [ - 0x78, 0xf1, 0x45, 0xea, 0x29, 0xd2, 0x71, 0xb9, 0x40, 0xc6, 0x99, 0x41, 0xe4, 0xc3, - 0xfd, 0x2d, 0x71, 0xf3, 0xb1, 0x90, 0x69, 0x0e, 0xe1, 0x6f, 0x5d, 0x14, 0xac, 0x22, - 0x24, 0xe6, 0xfc, 0x89, - ], - default_d: [ - 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, - ], - default_pk_d: [ - 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, - 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, - 0x3a, 0x56, 0x6a, 0xaa, - ], - v: 15093716717054627455, - rseed: [ - 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, - 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, - 0x24, 0x57, 0x16, 0xa4, - ], - memo: [ - 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, - 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, - 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, - 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, - 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, - 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, - 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, - 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, - 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, - 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, - 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, - 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, - 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, - 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, - 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, - 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, - 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, - 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, - 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, - 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, - 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, - 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, - 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, - 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, - 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, - 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, - 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, - 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, - 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, - 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, - 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, - 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, - 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, - 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, - 0x70, 0xe0, 0x90, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ], - cv_net: [ - 0x91, 0x6d, 0xc3, 0x82, 0x2a, 0x4e, 0x3b, 0xb4, 0x1f, 0xa8, 0x33, 0xc2, 0x73, 0xa9, - 0xd3, 0x7d, 0x17, 0x17, 0xa4, 0x8d, 0x8f, 0x00, 0x6c, 0x1f, 0xf5, 0x86, 0x21, 0x46, - 0x29, 0x55, 0x39, 0x1c, - ], - rho: [ - 0x57, 0x87, 0x18, 0x97, 0x6d, 0xa3, 0xdc, 0xb4, 0x30, 0x32, 0x71, 0x52, 0x20, 0x72, - 0xd0, 0x28, 0x44, 0x22, 0x13, 0x50, 0x86, 0x4e, 0xed, 0x56, 0x3d, 0xab, 0x30, 0x22, - 0x7f, 0x28, 0x4b, 0x2e, - ], - cmx: [ - 0x89, 0xe6, 0xa2, 0xb9, 0x70, 0x84, 0xe3, 0xd3, 0x34, 0x4f, 0xee, 0xb4, 0x64, 0x65, - 0x05, 0x72, 0x51, 0xb1, 0x9d, 0xa0, 0xce, 0xdf, 0x79, 0x71, 0x94, 0xc5, 0x97, 0xf9, - 0xf7, 0x7e, 0xf2, 0x1f, - ], - esk: [ - 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, 0x02, 0xf5, 0x10, 0xe9, - 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, 0xc4, 0x69, 0x2d, 0x0c, - 0x1b, 0x30, 0x33, 0x01, - ], - ephemeral_key: [ - 0x27, 0xcb, 0x40, 0x68, 0x0f, 0xb1, 0xd9, 0x19, 0x64, 0x6e, 0x74, 0x20, 0xe6, 0xa8, - 0xb5, 0x20, 0xe1, 0x9a, 0x17, 0x3f, 0x1e, 0x79, 0x4d, 0x2b, 0x49, 0x2b, 0xfa, 0xbb, - 0x83, 0xce, 0x6c, 0xa0, - ], - shared_secret: [ - 0x1c, 0xd0, 0x66, 0x91, 0x6c, 0x19, 0xfa, 0x33, 0x69, 0xaa, 0x3c, 0x6a, 0x53, 0x76, - 0x97, 0xf4, 0xb4, 0x26, 0x44, 0xda, 0x20, 0xca, 0x46, 0x79, 0x93, 0x2b, 0x7c, 0x90, - 0x5f, 0x2d, 0x69, 0x00, - ], - k_enc: [ - 0xce, 0x9d, 0x22, 0x0d, 0x3a, 0xfe, 0xc6, 0x23, 0x21, 0xdd, 0xf1, 0x97, 0xa6, 0x36, - 0xdc, 0xb3, 0x45, 0x58, 0x83, 0xb7, 0x35, 0x82, 0x8c, 0x65, 0xe7, 0x16, 0x6c, 0x15, - 0xd8, 0xcc, 0xfc, 0xf9, - ], - p_enc: [ - 0x03, 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, 0x7f, 0x8e, - 0x6a, 0x5c, 0x62, 0xa7, 0x77, 0xd1, 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, - 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, - 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, 0x24, 0x57, 0x16, 0xa4, 0x96, 0x86, 0xaa, 0x36, - 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, 0xab, 0xcf, 0xac, 0x88, - 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, 0x07, 0x2d, 0x2d, 0x18, - 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, - 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, - 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, - 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, - 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, - 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, - 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, - 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, - 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, - 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, - 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, - 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, - 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, - 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, - 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, - 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, - 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, - 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, - 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, - 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, - 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, - 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, - 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, - 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, - 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, - 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, - 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, - 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, - 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, - 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, - 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, - 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, - 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, - 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, - 0x70, 0xe0, 0x90, 0x3a, - ], - c_enc: [ - 0xb1, 0x69, 0x64, 0x77, 0xe6, 0x58, 0xb6, 0xf8, 0xe2, 0x4e, 0x02, 0x55, 0x52, 0xb4, - 0x8d, 0xd4, 0x84, 0x58, 0xf2, 0xcd, 0x75, 0x70, 0xc0, 0xe8, 0xce, 0xc4, 0xed, 0x4c, - 0xf7, 0x9b, 0xd5, 0xb6, 0x9e, 0xa8, 0x54, 0x12, 0x3b, 0x4e, 0xaf, 0x97, 0x8b, 0x14, - 0x2e, 0xb3, 0xef, 0x53, 0xaa, 0xfc, 0x78, 0x90, 0xdd, 0xa2, 0x8a, 0xfa, 0x25, 0xf1, - 0x45, 0xc8, 0xb9, 0x7f, 0x7b, 0x94, 0x50, 0xc1, 0xd5, 0xe0, 0xc3, 0x7d, 0xaf, 0x5e, - 0xd4, 0xec, 0xd9, 0xb6, 0x3d, 0xbc, 0xd2, 0x15, 0x11, 0x23, 0x13, 0x9b, 0xbc, 0x2b, - 0x65, 0x1a, 0x8f, 0x69, 0xcf, 0xbf, 0xb7, 0xcb, 0x60, 0x44, 0x78, 0xf3, 0xf2, 0x64, - 0xd9, 0xdd, 0x75, 0xcf, 0x31, 0x9e, 0x3e, 0xcd, 0xf5, 0xb3, 0x34, 0x26, 0x54, 0x85, - 0x7c, 0x52, 0xa1, 0xfc, 0x61, 0x40, 0x55, 0xa2, 0x46, 0xf5, 0x26, 0x3e, 0x85, 0x36, - 0x83, 0xef, 0x54, 0x41, 0x3b, 0xac, 0x99, 0x1a, 0xe6, 0x35, 0x01, 0x50, 0xe1, 0x34, - 0x52, 0xa3, 0xa6, 0x20, 0xc5, 0x3f, 0x80, 0xda, 0xcc, 0x7a, 0xf0, 0x59, 0x26, 0xd9, - 0xc5, 0x9a, 0x94, 0xe4, 0x78, 0x9a, 0xcc, 0x68, 0xd8, 0x51, 0x05, 0x6b, 0x75, 0xa7, - 0x4e, 0x2e, 0x1b, 0x38, 0xbf, 0xcb, 0x6d, 0xba, 0xab, 0x37, 0xa3, 0x8a, 0xe0, 0x2c, - 0x9c, 0x35, 0x25, 0x9e, 0x52, 0x84, 0xe4, 0xfe, 0x83, 0xdd, 0xb2, 0x29, 0x24, 0xa1, - 0xc4, 0x0a, 0xa2, 0x5e, 0xd1, 0xf5, 0xc0, 0x6d, 0xa1, 0x58, 0x31, 0xf0, 0x41, 0x50, - 0xa3, 0x7c, 0x1b, 0xa3, 0xd1, 0x17, 0x04, 0x93, 0xca, 0x29, 0xf3, 0x43, 0x4a, 0xfa, - 0x06, 0x9b, 0x46, 0xaf, 0xdc, 0x87, 0x0a, 0x29, 0x6f, 0xdc, 0x0e, 0xb6, 0x1b, 0x55, - 0x70, 0x77, 0xa1, 0xda, 0x1f, 0xe8, 0x22, 0xb6, 0xce, 0x24, 0x7c, 0x8e, 0x19, 0x9f, - 0xc4, 0x85, 0x14, 0x6f, 0x38, 0x4a, 0xcf, 0x5c, 0x52, 0x69, 0x7e, 0xfa, 0xcc, 0x5b, - 0xfe, 0x42, 0x02, 0xe8, 0x5f, 0x06, 0x4b, 0xc8, 0xe1, 0x2e, 0xee, 0x39, 0x79, 0x6d, - 0xfd, 0x13, 0x99, 0xb1, 0xc1, 0xe8, 0xc7, 0x4b, 0x5e, 0xc3, 0xc3, 0x1d, 0x2c, 0xfa, - 0x44, 0x87, 0x02, 0x5c, 0xeb, 0x5d, 0xb3, 0x55, 0x9d, 0x4b, 0x7b, 0xac, 0x02, 0x73, - 0xf1, 0x33, 0x51, 0xd2, 0xd1, 0x3c, 0xec, 0x0a, 0x44, 0x8c, 0x00, 0x11, 0x09, 0x45, - 0x2c, 0x40, 0x92, 0xc8, 0x11, 0x91, 0xa0, 0xda, 0xa9, 0x79, 0xe2, 0x6a, 0x96, 0x24, - 0xe4, 0x0c, 0xa4, 0xac, 0xcb, 0x63, 0x46, 0xaa, 0xe1, 0x88, 0xca, 0x09, 0x39, 0xdd, - 0x9f, 0x6b, 0x6e, 0x45, 0xe4, 0x1b, 0xca, 0xeb, 0xdc, 0x1d, 0xa8, 0x01, 0xcc, 0xd4, - 0xdc, 0x93, 0x32, 0x26, 0x6f, 0xb3, 0xeb, 0x23, 0x7b, 0x07, 0x72, 0x45, 0xa7, 0x91, - 0xec, 0xb4, 0x0e, 0x5c, 0x40, 0x56, 0xad, 0xd6, 0xb1, 0xb5, 0xf7, 0xf8, 0xfa, 0x10, - 0x4f, 0xba, 0x61, 0x3e, 0xd9, 0x29, 0xe1, 0xfa, 0xd2, 0x26, 0x47, 0x50, 0x35, 0xb6, - 0x1a, 0x9f, 0x85, 0xaf, 0xba, 0xfb, 0x16, 0x6b, 0x24, 0xc2, 0x4d, 0x2c, 0x28, 0x93, - 0x7b, 0x17, 0x70, 0xba, 0x26, 0x9c, 0x15, 0xeb, 0x2d, 0x9b, 0xdc, 0x2b, 0x83, 0xea, - 0xd8, 0xa0, 0x1d, 0xdb, 0x11, 0x08, 0x3b, 0x13, 0xd6, 0x2d, 0x57, 0x2c, 0xf7, 0x8d, - 0x5c, 0xba, 0x6f, 0x36, 0x52, 0xca, 0xc4, 0xd2, 0x4c, 0x71, 0xc5, 0x47, 0x27, 0x26, - 0x24, 0xc0, 0x78, 0xe0, 0xb9, 0x69, 0x68, 0xfe, 0x09, 0xd8, 0x3e, 0xf7, 0x30, 0x20, - 0x62, 0xbb, 0x5d, 0x3a, 0x2c, 0xcf, 0x73, 0x4e, 0x0f, 0xd3, 0x51, 0x01, 0xfd, 0x58, - 0x64, 0x73, 0x3f, 0x44, 0xd0, 0x75, 0xc3, 0x8b, 0x73, 0xf6, 0xbf, 0xb8, 0xc3, 0x9c, - 0x7b, 0x6b, 0x3d, 0xbc, 0xd1, 0x9a, 0x05, 0x89, 0x91, 0x86, 0x37, 0xf7, 0x5b, 0xbe, - 0x40, 0x15, 0x7b, 0x80, 0xe5, 0x9e, 0x55, 0x58, 0x50, 0x28, 0xa5, 0xec, 0x20, 0x1e, - 0x00, 0x8f, 0xf6, 0xf5, 0x12, 0xe2, 0x53, 0xcc, 0x9a, 0xcf, 0x62, 0x7d, 0x94, 0x35, - 0xdb, 0x6b, 0x14, 0xb9, 0x82, 0x48, 0x79, 0xf4, 0xe4, 0x0a, 0x36, 0xd5, 0xec, 0x94, - 0x2b, 0xff, 0x04, 0xfd, 0x90, 0xa6, 0xaf, 0x8c, 0x58, 0x1d, 0xf6, 0x09, 0xc4, 0x11, - 0xf4, 0x76, 0x11, 0x41, 0xd4, 0xa6, - ], - ock: [ - 0x95, 0x83, 0xf1, 0x0f, 0xed, 0x70, 0xa4, 0x1e, 0x45, 0x8c, 0x65, 0x5c, 0xc0, 0x14, - 0xe2, 0x35, 0x5a, 0x7f, 0x99, 0xae, 0xbc, 0xfe, 0xf7, 0x4a, 0x55, 0x9a, 0xcd, 0x24, - 0x25, 0xfa, 0x21, 0xcf, - ], - op: [ - 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, - 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, - 0x3a, 0x56, 0x6a, 0xaa, 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, - 0x02, 0xf5, 0x10, 0xe9, 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, - 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, - ], - c_out: [ - 0xb8, 0x3b, 0x74, 0x5c, 0x9c, 0x0b, 0x04, 0xdd, 0xc7, 0xf1, 0x38, 0x16, 0x94, 0x38, - 0x99, 0x55, 0x3a, 0x30, 0x6a, 0x4a, 0xd0, 0xf2, 0xf5, 0x70, 0x92, 0x2a, 0x89, 0x9b, - 0xab, 0xb9, 0xda, 0xca, 0xd2, 0xbb, 0xc9, 0x5c, 0xf6, 0x5b, 0x73, 0x08, 0x55, 0x0d, - 0xce, 0xdb, 0x64, 0x9e, 0xf1, 0x5e, 0x0b, 0x1a, 0x09, 0x1f, 0xad, 0x5a, 0x93, 0x92, - 0xd0, 0x71, 0xb7, 0x5a, 0xb5, 0x1a, 0x7e, 0x35, 0x06, 0xad, 0x58, 0xd1, 0x71, 0x95, - 0xc9, 0x9f, 0x29, 0x8a, 0xc3, 0x14, 0xec, 0x05, 0xa6, 0x6a, - ], - asset: Some([ - 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, - 0xab, 0xcf, 0xac, 0x88, 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, - 0x07, 0x2d, 0x2d, 0x18, - ]), }, ] } diff --git a/src/test_vectors/note_encryption_v3.rs b/src/test_vectors/note_encryption_v3.rs new file mode 100644 index 000000000..0ea5da482 --- /dev/null +++ b/src/test_vectors/note_encryption_v3.rs @@ -0,0 +1,4389 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_note_encryption) + +pub(crate) struct TestVector { + pub(crate) incoming_viewing_key: [u8; 64], + pub(crate) ovk: [u8; 32], + pub(crate) default_d: [u8; 11], + pub(crate) default_pk_d: [u8; 32], + pub(crate) v: u64, + pub(crate) rseed: [u8; 32], + pub(crate) asset: [u8; 32], + pub(crate) memo: [u8; 512], + pub(crate) cv_net: [u8; 32], + pub(crate) rho: [u8; 32], + pub(crate) cmx: [u8; 32], + pub(crate) esk: [u8; 32], + pub(crate) ephemeral_key: [u8; 32], + pub(crate) shared_secret: [u8; 32], + pub(crate) k_enc: [u8; 32], + pub(crate) p_enc: [u8; 596], + pub(crate) c_enc: [u8; 612], + pub(crate) ock: [u8; 32], + pub(crate) op: [u8; 64], + pub(crate) c_out: [u8; 80], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + incoming_viewing_key: [ + 0x10, 0x39, 0xd8, 0xe6, 0x4a, 0x80, 0x90, 0x2e, 0x10, 0x59, 0x47, 0x81, 0x7d, 0xf3, + 0xbd, 0xfb, 0x7d, 0xf7, 0x03, 0x0e, 0x68, 0x73, 0x9f, 0x9c, 0x53, 0x3a, 0x36, 0xbf, + 0x5a, 0x6a, 0x80, 0x72, 0x43, 0x10, 0x6d, 0xe9, 0xa7, 0xec, 0x54, 0xdd, 0x36, 0xdf, + 0xa7, 0x0b, 0xdb, 0xd9, 0x07, 0x2d, 0xbd, 0xda, 0xb5, 0xe0, 0x66, 0xaa, 0xef, 0xfc, + 0xf9, 0xbb, 0xa3, 0x20, 0xd4, 0xff, 0xf7, 0x12, + ], + ovk: [ + 0x5d, 0x7a, 0x8f, 0x73, 0x9a, 0x2d, 0x9e, 0x94, 0x5b, 0x0c, 0xe1, 0x52, 0xa8, 0x04, + 0x9e, 0x29, 0x4c, 0x4d, 0x6e, 0x66, 0xb1, 0x64, 0x93, 0x9d, 0xaf, 0xfa, 0x2e, 0xf6, + 0xee, 0x69, 0x21, 0x48, + ], + default_d: [ + 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, + ], + default_pk_d: [ + 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, + 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, + 0x49, 0x50, 0x69, 0x2c, + ], + v: 8567075990963576717, + rseed: [ + 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, + 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, + 0x30, 0xa7, 0x35, 0x94, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, + 0x25, 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, + 0x91, 0x2a, 0x63, 0x81, 0xce, 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, + 0xd7, 0x55, 0x1d, 0xb5, 0xfd, 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, + 0xd4, 0x77, 0x08, 0x37, 0x56, 0xd5, 0x9a, 0xf8, 0x0d, 0x06, 0xa7, 0x45, 0xf4, 0x4a, + 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, + 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, + 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, 0xc2, + 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, 0x94, + 0x90, 0x3d, 0x3c, 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, + 0x18, 0x3e, 0x31, 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, + 0xdc, 0xf0, 0x4b, 0xe3, 0x4a, 0x98, 0x51, 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, + 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, + 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, + 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, 0x13, 0x09, 0x13, + 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, 0xe1, + 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, + 0xa9, 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, + 0xda, 0xe6, 0x9c, 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, + 0x93, 0x1d, 0xe5, 0x18, 0x85, 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, + 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, + 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, 0xe5, 0x3e, 0x29, 0xfe, 0xf2, + 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, + 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, + 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, + 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, + 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, + 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, + 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, + 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, 0xed, 0x42, 0x43, 0x5e, 0x92, 0x47, 0x69, + 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, 0x7b, 0x89, 0xe0, + 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, 0xf2, 0x65, 0x72, + 0x50, 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, + 0xbc, 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, + 0xe7, 0x1a, 0x02, 0xaf, 0x11, 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, + 0xb1, 0xfc, 0xe4, 0x67, 0x50, 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, + 0xc3, 0x82, 0x85, 0x7d, 0xee, 0xcc, 0x40, 0xa9, + ], + cv_net: [ + 0xdd, 0xba, 0x24, 0xf3, 0x9f, 0x70, 0x8e, 0xd7, 0xa7, 0x48, 0x57, 0x13, 0x71, 0x11, + 0x42, 0xc2, 0x38, 0x51, 0x38, 0x15, 0x30, 0x2d, 0xf0, 0xf4, 0x83, 0x04, 0x21, 0xa6, + 0xc1, 0x3e, 0x71, 0x01, + ], + rho: [ + 0xca, 0x1f, 0xeb, 0x30, 0xca, 0x11, 0x17, 0x76, 0xc0, 0x41, 0x74, 0x66, 0xbd, 0x69, + 0xb3, 0xd2, 0x13, 0x88, 0x2e, 0xef, 0x55, 0xe6, 0x0b, 0x6d, 0x9e, 0x2a, 0x98, 0xe7, + 0x05, 0xee, 0xf3, 0x27, + ], + cmx: [ + 0x23, 0x75, 0x7c, 0x51, 0x58, 0x21, 0xcb, 0xc1, 0x84, 0x3c, 0x9a, 0x45, 0x7b, 0x7e, + 0x6a, 0xe6, 0x01, 0xad, 0xd2, 0xea, 0x10, 0xb9, 0xc8, 0x6d, 0x6b, 0x31, 0x7c, 0xe2, + 0xf1, 0x7b, 0xd9, 0x21, + ], + esk: [ + 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, 0x8b, 0xfe, 0x9b, 0x38, + 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, 0x8e, 0x33, 0x35, 0x4f, + 0xff, 0xf1, 0xbd, 0x1a, + ], + ephemeral_key: [ + 0x8a, 0x5e, 0x13, 0x2c, 0x3a, 0x07, 0x04, 0xf2, 0x45, 0x6f, 0xbd, 0x77, 0x7a, 0x13, + 0xd6, 0xec, 0x57, 0x65, 0x56, 0x71, 0xdb, 0x07, 0x2a, 0x7d, 0x27, 0x6a, 0xd9, 0x69, + 0xf5, 0xec, 0x45, 0x17, + ], + shared_secret: [ + 0x36, 0xd5, 0x4c, 0xab, 0xc6, 0x7f, 0x6c, 0xc7, 0x26, 0xa7, 0x30, 0xf3, 0xa0, 0xce, + 0xed, 0x58, 0x53, 0xf0, 0x8c, 0xd3, 0x81, 0x46, 0xc8, 0x34, 0x25, 0x98, 0x98, 0x7c, + 0x21, 0x50, 0x48, 0xa5, + ], + k_enc: [ + 0x82, 0xc4, 0x32, 0x65, 0x33, 0x7f, 0x1a, 0xb3, 0x7b, 0x18, 0xdf, 0x27, 0x75, 0x48, + 0x61, 0x82, 0x63, 0xb8, 0x02, 0x4d, 0x9b, 0x14, 0x5a, 0x05, 0xad, 0xe2, 0xeb, 0x54, + 0x79, 0x18, 0x03, 0x20, + ], + p_enc: [ + 0x03, 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, 0x8d, 0x5f, + 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, + 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, + 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, 0x30, 0xa7, 0x35, 0x94, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, + 0x25, 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, + 0x91, 0x2a, 0x63, 0x81, 0xce, 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, + 0xd7, 0x55, 0x1d, 0xb5, 0xfd, 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, + 0xd4, 0x77, 0x08, 0x37, 0x56, 0xd5, 0x9a, 0xf8, 0x0d, 0x06, 0xa7, 0x45, 0xf4, 0x4a, + 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, + 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, + 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, 0xc2, + 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, 0x94, + 0x90, 0x3d, 0x3c, 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, + 0x18, 0x3e, 0x31, 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, + 0xdc, 0xf0, 0x4b, 0xe3, 0x4a, 0x98, 0x51, 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, + 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, + 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, + 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, 0x13, 0x09, 0x13, + 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, 0xe1, + 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, + 0xa9, 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, + 0xda, 0xe6, 0x9c, 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, + 0x93, 0x1d, 0xe5, 0x18, 0x85, 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, + 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, + 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, 0xe5, 0x3e, 0x29, 0xfe, 0xf2, + 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, + 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, + 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, + 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, + 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, + 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, + 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, + 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, 0xed, 0x42, 0x43, 0x5e, 0x92, 0x47, 0x69, + 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, 0x7b, 0x89, 0xe0, + 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, 0xf2, 0x65, 0x72, + 0x50, 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, + 0xbc, 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, + 0xe7, 0x1a, 0x02, 0xaf, 0x11, 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, + 0xb1, 0xfc, 0xe4, 0x67, 0x50, 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, + 0xc3, 0x82, 0x85, 0x7d, 0xee, 0xcc, 0x40, 0xa9, + ], + c_enc: [ + 0x92, 0xe0, 0x48, 0x74, 0xb5, 0x83, 0x7c, 0x26, 0x1d, 0xaf, 0x1a, 0x27, 0xb7, 0x83, + 0xec, 0x48, 0x65, 0xd3, 0xbb, 0x72, 0x8e, 0xb1, 0x61, 0xda, 0xed, 0xb8, 0x44, 0x6a, + 0xb3, 0x8f, 0x07, 0x8e, 0xa8, 0x66, 0x2e, 0x4d, 0x2e, 0x9d, 0x00, 0xa3, 0x95, 0x27, + 0xdc, 0xde, 0x51, 0x7a, 0xc3, 0xdb, 0xf9, 0xd2, 0x7e, 0x3c, 0xe1, 0x06, 0x21, 0xb8, + 0x97, 0xe9, 0x79, 0x10, 0xba, 0xa5, 0x63, 0xd0, 0xb4, 0xc3, 0x8f, 0x87, 0x77, 0xf9, + 0xdf, 0xb5, 0x5a, 0x4d, 0x0c, 0xa6, 0x49, 0x80, 0x7a, 0x6e, 0x7e, 0x3b, 0x63, 0x7b, + 0xe7, 0x83, 0x5c, 0x0c, 0x07, 0x6e, 0x6f, 0x06, 0xee, 0x5c, 0x8a, 0xac, 0x6a, 0xd2, + 0x13, 0x00, 0xf8, 0xe1, 0xcd, 0x39, 0x5f, 0x69, 0x2d, 0xc5, 0x72, 0xab, 0x07, 0xfd, + 0x4b, 0xe1, 0xf2, 0xc6, 0x52, 0x09, 0x64, 0xed, 0xec, 0x3b, 0xe5, 0x56, 0x22, 0xac, + 0x4d, 0x23, 0x85, 0x8c, 0x39, 0x8d, 0xf6, 0x6d, 0x6a, 0x6e, 0x54, 0x60, 0x18, 0xf9, + 0x81, 0x66, 0x89, 0x24, 0xbe, 0x96, 0x3b, 0x7c, 0xbb, 0x0c, 0x7f, 0x10, 0x4d, 0x16, + 0x07, 0xfb, 0xcb, 0xc0, 0x18, 0x49, 0xd9, 0x93, 0x72, 0xcb, 0x8e, 0x64, 0xb2, 0xca, + 0x15, 0xd7, 0xf8, 0xc5, 0x37, 0x20, 0x05, 0xa8, 0x89, 0xd6, 0xa9, 0x31, 0x23, 0x59, + 0x42, 0x09, 0xe4, 0xd2, 0x59, 0x7b, 0x6e, 0x83, 0x78, 0x2e, 0x5d, 0x1a, 0xb0, 0xc5, + 0xd6, 0x42, 0xbe, 0x32, 0xe7, 0xb4, 0x89, 0x85, 0xaa, 0x07, 0x7e, 0x9a, 0x76, 0xbd, + 0xe2, 0x7d, 0xf4, 0x26, 0x74, 0x8b, 0xf3, 0x25, 0x52, 0x01, 0x56, 0x88, 0xb3, 0x6e, + 0x34, 0xff, 0x9d, 0x22, 0x11, 0xd8, 0x72, 0xfb, 0x23, 0x6a, 0x18, 0x2f, 0xe4, 0xf2, + 0x87, 0xa5, 0x5b, 0xfc, 0xee, 0xa3, 0xed, 0x99, 0xfd, 0xc2, 0x91, 0xf9, 0x1d, 0x6e, + 0xf8, 0xd2, 0x9a, 0x27, 0x8f, 0xa6, 0x46, 0xe8, 0xe7, 0xdc, 0x66, 0xd4, 0x9b, 0x38, + 0x62, 0x26, 0x7e, 0xd5, 0x8b, 0x31, 0x66, 0x09, 0x97, 0xa5, 0x8f, 0x29, 0x73, 0x5c, + 0xc6, 0xe5, 0x98, 0x65, 0x54, 0x2f, 0x5d, 0x90, 0x8c, 0xe5, 0x2d, 0x9f, 0x5b, 0x29, + 0xc9, 0x78, 0x24, 0xd1, 0x4d, 0x4d, 0x64, 0xcd, 0xbe, 0x56, 0x93, 0xb5, 0x1b, 0x7e, + 0xc7, 0x31, 0xc9, 0x92, 0x4b, 0x4f, 0x47, 0x5a, 0x14, 0xd0, 0x58, 0x7b, 0xe6, 0x45, + 0x44, 0x8a, 0x07, 0x55, 0x4f, 0x15, 0xbc, 0x9d, 0xaf, 0xa1, 0xf7, 0x38, 0x6a, 0xe8, + 0x6f, 0x71, 0x48, 0x2b, 0x35, 0x6e, 0xa7, 0x9c, 0xdc, 0x44, 0x73, 0x2c, 0xfa, 0x41, + 0x46, 0xe6, 0xca, 0x51, 0x04, 0xf0, 0xa4, 0x60, 0x7b, 0xd6, 0x4b, 0x58, 0x39, 0x6e, + 0x44, 0x3f, 0xad, 0x2c, 0xfc, 0x36, 0xdd, 0xd3, 0xae, 0x9a, 0xa4, 0xbe, 0xa8, 0x7a, + 0xde, 0xd5, 0xec, 0x35, 0x17, 0x42, 0xfc, 0x5a, 0x90, 0x6a, 0xd0, 0x54, 0xd3, 0x59, + 0x43, 0x16, 0xcc, 0x54, 0xb8, 0x74, 0xbb, 0xce, 0xc2, 0xa8, 0x14, 0x31, 0x50, 0x18, + 0xbc, 0x7e, 0x1d, 0x3c, 0x74, 0x84, 0x72, 0xbd, 0x96, 0x77, 0x76, 0x5d, 0xcf, 0x59, + 0xb1, 0x6d, 0x55, 0xa3, 0xf1, 0x86, 0x4f, 0x75, 0x1a, 0x69, 0x3d, 0x76, 0x9c, 0xc7, + 0x6b, 0x8e, 0x32, 0x8a, 0x9a, 0xc8, 0x3b, 0xe1, 0x78, 0x39, 0x1b, 0xeb, 0x5f, 0x28, + 0xab, 0x69, 0x2b, 0x6f, 0x02, 0xa3, 0xf7, 0x49, 0x8a, 0x4b, 0xc5, 0x51, 0xf8, 0x48, + 0x7d, 0xae, 0xba, 0x3b, 0xe0, 0x2e, 0xb0, 0x20, 0xc1, 0x60, 0xf8, 0x78, 0x53, 0x91, + 0xaa, 0x03, 0xde, 0x44, 0x7b, 0x37, 0xf9, 0x5b, 0xec, 0xfe, 0x3e, 0xca, 0x95, 0xae, + 0x62, 0xab, 0xa0, 0x82, 0x20, 0xee, 0x87, 0xd2, 0x48, 0x16, 0xb0, 0x99, 0x5f, 0x27, + 0x30, 0xe8, 0xff, 0x9a, 0xca, 0x21, 0x8b, 0x88, 0xe3, 0x1b, 0x1f, 0xb7, 0x78, 0x3a, + 0x29, 0x80, 0xf7, 0xb2, 0x98, 0x44, 0xc1, 0x06, 0x26, 0xa2, 0x13, 0xa9, 0x81, 0x41, + 0x7d, 0x90, 0xdf, 0xf9, 0xfb, 0x2a, 0xba, 0xfe, 0xc8, 0x38, 0x23, 0x0e, 0x1a, 0x55, + 0xcf, 0xc5, 0xf7, 0xf8, 0x19, 0xab, 0xf6, 0xe5, 0xb0, 0xa7, 0x48, 0x3b, 0xf1, 0xbc, + 0xeb, 0x15, 0xe8, 0x5b, 0xfe, 0x12, 0xfd, 0x55, 0x02, 0x81, 0xe5, 0x28, 0x20, 0xd0, + 0xbd, 0xb2, 0xa5, 0xba, 0x34, 0xe3, 0x74, 0xca, 0x2f, 0xfd, 0xac, 0x56, 0xce, 0x51, + 0x3c, 0xf3, 0xdd, 0x23, 0xde, 0x9f, 0xb4, 0xa1, 0xd2, 0xff, 0x4f, 0xfe, 0x74, 0x9b, + 0xd8, 0xcb, 0x30, 0x8f, 0x9a, 0xf7, 0xb6, 0xfe, 0xa2, 0x39, + ], + ock: [ + 0xb3, 0x25, 0xeb, 0xe5, 0x7a, 0x2c, 0x40, 0xa8, 0xb2, 0x11, 0xcf, 0xdf, 0x72, 0xa1, + 0xa2, 0x44, 0xf1, 0x53, 0x42, 0x85, 0x98, 0x88, 0xa3, 0x64, 0x52, 0x3e, 0xfd, 0x2a, + 0xc6, 0x6a, 0x1a, 0xd6, + ], + op: [ + 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, + 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, + 0x49, 0x50, 0x69, 0x2c, 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, + 0x8b, 0xfe, 0x9b, 0x38, 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, + 0x8e, 0x33, 0x35, 0x4f, 0xff, 0xf1, 0xbd, 0x1a, + ], + c_out: [ + 0x55, 0xb8, 0x90, 0x7c, 0x6d, 0x45, 0x4b, 0x83, 0x63, 0x4f, 0x1b, 0x9a, 0x1a, 0xa3, + 0xc3, 0xc9, 0x8a, 0xdc, 0x77, 0xd9, 0x6c, 0x2f, 0x62, 0x49, 0xec, 0x66, 0xdb, 0xae, + 0x4d, 0x0c, 0xc9, 0x40, 0xd7, 0x26, 0xbc, 0xd1, 0xec, 0x91, 0x18, 0x9f, 0xd3, 0x04, + 0x9a, 0x33, 0xf2, 0xea, 0x7d, 0x8b, 0x74, 0xaa, 0xc1, 0x7c, 0xda, 0x38, 0x83, 0x80, + 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, + 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xfd, 0x9e, 0x9a, 0x1f, 0x38, 0x1c, 0xbe, 0x75, 0xcd, 0x8d, 0x6a, 0xe1, 0x2f, 0xca, + 0x87, 0x2e, 0x94, 0x00, 0xf0, 0x02, 0x72, 0xb0, 0x29, 0x65, 0x2e, 0x65, 0x6c, 0x8f, + 0x3c, 0x4b, 0xf0, 0x37, 0xee, 0xef, 0x96, 0x42, 0x1b, 0x2f, 0xab, 0x2f, 0xb3, 0xad, + 0x1e, 0x0a, 0xd8, 0x50, 0x2d, 0x74, 0xe6, 0xf0, 0x8f, 0x0d, 0xd5, 0x18, 0xf8, 0xfa, + 0x82, 0x2a, 0x65, 0xbe, 0x27, 0x40, 0xc0, 0x21, + ], + ovk: [ + 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, 0xa0, + 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, 0x82, 0x84, 0x2d, 0x38, 0x25, + 0xb3, 0xd6, 0xda, 0x05, + ], + default_d: [ + 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, + ], + default_pk_d: [ + 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, + 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, + 0x4a, 0xd7, 0xc7, 0x84, + ], + v: 9072946746592546880, + rseed: [ + 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, 0x14, 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, + 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, 0x77, 0xe3, 0x1b, 0xa4, 0x59, 0xb4, + 0x4e, 0x30, 0x77, 0x68, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, + 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, + 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, + 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, + 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, + 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, + 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, 0xfa, 0xa7, + 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, + 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, + 0x84, 0x1e, 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, + 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, + 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, + 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, + 0x16, 0x71, 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, + 0x15, 0x81, 0xa1, 0x55, 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, + 0x6a, 0xd3, 0xa0, 0x8c, 0xb6, 0xb8, 0x31, 0x31, 0xac, 0x30, 0x0b, 0x08, 0x46, 0x35, + 0x4a, 0x7e, 0xef, 0x9c, 0x41, 0x0e, 0x4b, 0x62, 0xc4, 0x7c, 0x54, 0x26, 0x90, 0x7d, + 0xfc, 0x66, 0x85, 0xc5, 0xc9, 0x9b, 0x71, 0x41, 0xac, 0x62, 0x6a, 0xb4, 0x76, 0x1f, + 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, + 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, + 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, + 0x1c, 0xe7, 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, + 0xe7, 0x5e, 0xf8, 0xe3, 0xf8, 0xbd, 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, + 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, + 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, 0x0a, 0x88, 0x06, 0x12, 0x53, 0xca, 0x28, 0x5b, + 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, + 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, + 0xff, 0xa0, 0x05, 0xc3, 0x12, 0x24, 0x1c, 0x2d, 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, + 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, + 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, 0xcd, 0xdb, 0x41, 0x87, 0x2c, 0xfc, + 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, 0xf9, 0x30, + 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, 0x33, 0x92, + 0xde, 0xb8, 0x7c, 0x53, 0x04, 0x35, 0x31, 0x2e, 0xdc, 0xed, 0xc6, 0xa9, 0x61, 0x13, + 0x33, 0x38, 0xd7, 0x86, 0xc4, 0xa3, 0xe1, 0x03, 0xf6, 0x01, 0x10, 0xa1, 0x6b, 0x13, + 0x37, 0x12, 0x97, 0x04, 0xbf, 0x47, 0x54, 0xff, 0x6b, 0xa9, 0xfb, 0xe6, 0x59, 0x51, + 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, + 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, + ], + cv_net: [ + 0x15, 0x49, 0x70, 0x7e, 0x1e, 0xd2, 0xb2, 0xeb, 0x66, 0x15, 0x65, 0x0b, 0xec, 0x45, + 0xa2, 0x17, 0x64, 0x10, 0x4a, 0x23, 0xea, 0xf6, 0xba, 0x49, 0x6c, 0xb9, 0xb8, 0xe8, + 0x25, 0x7a, 0xd8, 0xb3, + ], + rho: [ + 0xc1, 0xe1, 0x59, 0x5b, 0x8d, 0xe7, 0x55, 0x97, 0x66, 0xe5, 0xa6, 0x72, 0x5f, 0x5b, + 0xe5, 0x74, 0x2f, 0x43, 0xbf, 0x40, 0x62, 0x3b, 0x71, 0x49, 0xca, 0xe2, 0x67, 0x5c, + 0x4d, 0xb2, 0xc7, 0x31, + ], + cmx: [ + 0x59, 0xb6, 0xf3, 0xd4, 0x03, 0x22, 0x3d, 0x6c, 0xe4, 0x3d, 0xed, 0xae, 0xe2, 0x35, + 0xfc, 0xa9, 0x5c, 0xc8, 0xb2, 0x49, 0x94, 0x1c, 0xcd, 0xb6, 0x6f, 0x3f, 0x61, 0x1c, + 0xc5, 0xe9, 0xf9, 0x0f, + ], + esk: [ + 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, 0xdd, 0x73, 0x4d, 0x0e, + 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, 0x22, 0xc0, 0x61, 0xe0, + 0xbd, 0xc9, 0xce, 0x14, + ], + ephemeral_key: [ + 0xd2, 0x9e, 0x0d, 0x00, 0x1e, 0xe7, 0x1e, 0x05, 0x99, 0x08, 0x65, 0x04, 0xd8, 0x62, + 0xc7, 0xf5, 0x2b, 0x08, 0x60, 0x77, 0x0d, 0x8a, 0x4b, 0x42, 0xa8, 0x68, 0x11, 0xac, + 0x31, 0x69, 0x85, 0x8c, + ], + shared_secret: [ + 0x11, 0xa0, 0xac, 0x79, 0x9a, 0x29, 0xb0, 0xed, 0x19, 0x5e, 0xd8, 0x7b, 0x13, 0x83, + 0x22, 0x26, 0x3b, 0xbb, 0x9c, 0x31, 0x00, 0x8c, 0x29, 0x59, 0xaf, 0x2f, 0xc6, 0x36, + 0x68, 0x7e, 0xd9, 0xb0, + ], + k_enc: [ + 0x4b, 0xbf, 0x80, 0xe7, 0xa1, 0x70, 0x3a, 0xc1, 0x4a, 0xd7, 0xb5, 0x44, 0x8a, 0x2e, + 0x8e, 0x79, 0x49, 0x30, 0x49, 0xd1, 0x9a, 0x6a, 0x51, 0x31, 0x67, 0xd5, 0x5b, 0xdd, + 0x58, 0x6a, 0xc0, 0xd9, + ], + p_enc: [ + 0x03, 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, 0x40, 0x50, + 0xaf, 0xd8, 0xfe, 0x94, 0xe9, 0x7d, 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, 0x14, + 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, + 0x77, 0xe3, 0x1b, 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, + 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, + 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, + 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, + 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, + 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, + 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, 0xfa, 0xa7, + 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, + 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, + 0x84, 0x1e, 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, + 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, + 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, + 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, + 0x16, 0x71, 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, + 0x15, 0x81, 0xa1, 0x55, 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, + 0x6a, 0xd3, 0xa0, 0x8c, 0xb6, 0xb8, 0x31, 0x31, 0xac, 0x30, 0x0b, 0x08, 0x46, 0x35, + 0x4a, 0x7e, 0xef, 0x9c, 0x41, 0x0e, 0x4b, 0x62, 0xc4, 0x7c, 0x54, 0x26, 0x90, 0x7d, + 0xfc, 0x66, 0x85, 0xc5, 0xc9, 0x9b, 0x71, 0x41, 0xac, 0x62, 0x6a, 0xb4, 0x76, 0x1f, + 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, + 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, + 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, + 0x1c, 0xe7, 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, + 0xe7, 0x5e, 0xf8, 0xe3, 0xf8, 0xbd, 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, + 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, + 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, 0x0a, 0x88, 0x06, 0x12, 0x53, 0xca, 0x28, 0x5b, + 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, + 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, + 0xff, 0xa0, 0x05, 0xc3, 0x12, 0x24, 0x1c, 0x2d, 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, + 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, + 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, 0xcd, 0xdb, 0x41, 0x87, 0x2c, 0xfc, + 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, 0xf9, 0x30, + 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, 0x33, 0x92, + 0xde, 0xb8, 0x7c, 0x53, 0x04, 0x35, 0x31, 0x2e, 0xdc, 0xed, 0xc6, 0xa9, 0x61, 0x13, + 0x33, 0x38, 0xd7, 0x86, 0xc4, 0xa3, 0xe1, 0x03, 0xf6, 0x01, 0x10, 0xa1, 0x6b, 0x13, + 0x37, 0x12, 0x97, 0x04, 0xbf, 0x47, 0x54, 0xff, 0x6b, 0xa9, 0xfb, 0xe6, 0x59, 0x51, + 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, + 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, + ], + c_enc: [ + 0x1a, 0x42, 0x34, 0x80, 0xbf, 0x37, 0x67, 0xf5, 0xeb, 0xfc, 0x40, 0xb8, 0xc8, 0x9c, + 0xc5, 0x34, 0xf1, 0x65, 0xc3, 0x5d, 0x19, 0xc8, 0xda, 0x6c, 0x32, 0x10, 0xe9, 0x52, + 0xca, 0xd8, 0x23, 0xa7, 0x84, 0x60, 0x21, 0xc3, 0xde, 0x4a, 0x86, 0x93, 0xb7, 0x1e, + 0x28, 0x7f, 0x46, 0x86, 0xac, 0x0a, 0xdd, 0xce, 0xd9, 0x4e, 0x22, 0x57, 0x7c, 0x40, + 0x9d, 0xa2, 0xdc, 0xa2, 0xef, 0xc2, 0xb3, 0xf8, 0x86, 0x97, 0xf5, 0xed, 0x20, 0x5a, + 0xb2, 0xf9, 0xea, 0x29, 0x85, 0xdd, 0x8b, 0x91, 0xb3, 0x2c, 0x1d, 0x7a, 0x8d, 0xa3, + 0xe8, 0x60, 0x57, 0xe8, 0x70, 0x8c, 0x7e, 0xb1, 0x32, 0x32, 0xaf, 0x56, 0x5d, 0xa5, + 0xa3, 0x5d, 0xe5, 0x06, 0x26, 0x29, 0x6a, 0xa6, 0x07, 0x1a, 0xa0, 0x0a, 0x2c, 0xf2, + 0x47, 0x3f, 0xa8, 0x0b, 0xfd, 0xbb, 0x95, 0x89, 0x48, 0x2a, 0x83, 0x5d, 0x56, 0xd2, + 0x27, 0xe6, 0x29, 0xe3, 0x5b, 0x2f, 0xb0, 0xf3, 0xdd, 0x38, 0xf1, 0x3b, 0xaa, 0x24, + 0xe5, 0x88, 0x26, 0x66, 0x25, 0x31, 0x07, 0x6a, 0xab, 0x9f, 0x4e, 0x3d, 0xe2, 0xc0, + 0xd0, 0x03, 0xe8, 0xd1, 0x0a, 0x8a, 0x70, 0x64, 0x3f, 0xe2, 0x4b, 0x1e, 0x4a, 0x2b, + 0x6d, 0x42, 0x74, 0xbc, 0xc5, 0xfc, 0xe0, 0x49, 0x3a, 0xec, 0x37, 0xe3, 0x24, 0xe9, + 0xb5, 0x13, 0x47, 0xe3, 0x20, 0xa8, 0xa0, 0x0d, 0xd6, 0xd6, 0xcd, 0x3a, 0x46, 0x70, + 0x4b, 0x90, 0xaf, 0x0d, 0x30, 0xe1, 0xda, 0x33, 0x7a, 0x2a, 0x82, 0x98, 0x26, 0xce, + 0x70, 0xf4, 0xf8, 0xa7, 0xcd, 0x31, 0x37, 0x59, 0x42, 0xda, 0x53, 0x4b, 0x68, 0x8b, + 0xf0, 0xbe, 0x8b, 0x6b, 0x90, 0x52, 0x6b, 0x18, 0x1d, 0x9f, 0x07, 0x2f, 0x60, 0x83, + 0x42, 0xb2, 0x4c, 0x89, 0xda, 0xd7, 0xf7, 0xf3, 0x07, 0x9f, 0xe9, 0x9b, 0x6c, 0xfc, + 0x73, 0x38, 0xc2, 0x86, 0x94, 0x2c, 0xab, 0x60, 0x72, 0x95, 0x3f, 0x08, 0x6d, 0x59, + 0xa1, 0xd6, 0x60, 0x00, 0xa4, 0xea, 0x6a, 0xe6, 0x3f, 0xbb, 0xfc, 0x5d, 0xc7, 0x6e, + 0x23, 0x14, 0x29, 0x88, 0x72, 0x5d, 0xea, 0x47, 0x43, 0x52, 0x2b, 0x92, 0x2c, 0xeb, + 0x89, 0xf1, 0x94, 0x8c, 0xe9, 0x43, 0xd5, 0x73, 0x66, 0x10, 0x30, 0xfe, 0x0c, 0xec, + 0x60, 0x7b, 0xd2, 0x47, 0xc9, 0xb5, 0x91, 0x84, 0x3d, 0x3e, 0x38, 0xa9, 0x47, 0x29, + 0x29, 0x8e, 0x60, 0x05, 0xdf, 0xd9, 0xf4, 0xf0, 0xf4, 0x86, 0xcb, 0xa7, 0xb6, 0x51, + 0xd5, 0xb9, 0xd3, 0xd7, 0xae, 0x64, 0x48, 0xe3, 0x9d, 0x19, 0xd7, 0x77, 0x41, 0x79, + 0x2d, 0x60, 0x9c, 0x2e, 0xb9, 0x7f, 0xa9, 0xba, 0x6e, 0x0b, 0x33, 0xdf, 0x17, 0xff, + 0x0f, 0x3c, 0x61, 0x16, 0x38, 0x9f, 0x3d, 0xa3, 0xb0, 0xd6, 0x56, 0xb9, 0x15, 0x3e, + 0xb3, 0x3f, 0x1b, 0xb5, 0x03, 0x94, 0xd7, 0x37, 0xb6, 0x78, 0x15, 0x35, 0xe9, 0x2b, + 0xcc, 0x8a, 0x7e, 0x56, 0xe6, 0x08, 0x02, 0x33, 0x3f, 0xea, 0x10, 0xde, 0xb6, 0xc7, + 0x9b, 0x66, 0x3d, 0xdd, 0x92, 0x82, 0x84, 0x91, 0x46, 0x23, 0x3f, 0x07, 0x8a, 0xbb, + 0x6d, 0x38, 0xec, 0x80, 0x7c, 0x45, 0x79, 0x4d, 0xf4, 0xaa, 0xfe, 0xe8, 0xd7, 0x58, + 0xb9, 0xda, 0xb4, 0xf3, 0x9a, 0xbd, 0x9a, 0xce, 0x42, 0xea, 0x39, 0x88, 0x9d, 0x5f, + 0x40, 0x24, 0x12, 0x24, 0xa9, 0xe1, 0x17, 0x1b, 0xad, 0xcf, 0x4c, 0x5a, 0x75, 0x9e, + 0x3b, 0xb9, 0xc7, 0x9e, 0x3d, 0x1c, 0x72, 0xb4, 0xaf, 0x65, 0x81, 0xe0, 0x7b, 0xde, + 0xdf, 0xc1, 0x7f, 0xe6, 0x82, 0x70, 0x79, 0x9c, 0x3b, 0xb0, 0x8b, 0x11, 0xfe, 0xfe, + 0xb1, 0xed, 0xb2, 0xbb, 0xa0, 0xf1, 0x14, 0x6b, 0x54, 0x01, 0x2a, 0xd3, 0x17, 0x57, + 0x10, 0x2c, 0xaa, 0x5d, 0xee, 0x1f, 0xcf, 0x1f, 0x97, 0x13, 0x34, 0x0d, 0xa2, 0x52, + 0xbd, 0x41, 0xed, 0x4a, 0xe2, 0x11, 0xf3, 0x5f, 0x88, 0x99, 0x1e, 0x1f, 0xe3, 0x47, + 0xd7, 0x0f, 0x52, 0xcd, 0x12, 0xd7, 0x36, 0x13, 0xcd, 0x13, 0xcf, 0xb1, 0x2e, 0xb2, + 0x5f, 0x83, 0x2b, 0x34, 0xc8, 0xb6, 0x69, 0x3a, 0x85, 0xb4, 0x00, 0xfc, 0xe3, 0x03, + 0xdc, 0xcb, 0x3f, 0x8d, 0x90, 0xf5, 0xb7, 0x0c, 0x1e, 0x00, 0xd1, 0xb5, 0x41, 0xe0, + 0xe1, 0x37, 0x3c, 0xc0, 0xc4, 0x05, 0x00, 0x72, 0x18, 0x76, 0x90, 0xf1, 0x38, 0xfd, + 0x25, 0x03, 0x27, 0x2a, 0x3f, 0x9e, 0xc5, 0x72, 0x0d, 0xd3, 0xe5, 0xb1, 0xda, 0x59, + 0x51, 0x4d, 0x4c, 0xb5, 0x0b, 0x1a, 0x44, 0x5a, 0x9d, 0x66, + ], + ock: [ + 0xab, 0xd0, 0xc2, 0x46, 0x97, 0xe4, 0x5b, 0x8b, 0xc4, 0x83, 0x0f, 0xb1, 0x46, 0x53, + 0x2e, 0xa0, 0xac, 0x84, 0x55, 0x81, 0xca, 0x35, 0x39, 0xd3, 0x41, 0x24, 0x73, 0x54, + 0x09, 0xd0, 0x15, 0xac, + ], + op: [ + 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, + 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, + 0x4a, 0xd7, 0xc7, 0x84, 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, + 0xdd, 0x73, 0x4d, 0x0e, 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, + 0x22, 0xc0, 0x61, 0xe0, 0xbd, 0xc9, 0xce, 0x14, + ], + c_out: [ + 0xea, 0xdf, 0x7e, 0xeb, 0x10, 0x2d, 0xb1, 0x88, 0x58, 0x54, 0xc2, 0x9e, 0xb7, 0xb0, + 0x5c, 0x7c, 0x96, 0xbb, 0xb8, 0x90, 0x00, 0x2c, 0x4e, 0xd1, 0x14, 0xed, 0x62, 0xf5, + 0xf9, 0xcc, 0xb4, 0x41, 0x6b, 0x5e, 0xdd, 0xd9, 0xad, 0xb5, 0x5c, 0xe9, 0xc7, 0xa0, + 0xd8, 0x44, 0x2b, 0xbc, 0x8a, 0xfa, 0x5c, 0x77, 0xb9, 0x90, 0xad, 0x6d, 0x46, 0x12, + 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, + 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x91, 0xee, 0x20, 0x54, 0x48, 0xc9, 0x8b, 0x69, 0xa3, 0x3e, 0xbf, 0x29, 0x35, 0x09, + 0x5d, 0x79, 0xc2, 0x53, 0x02, 0x9e, 0x5e, 0x5d, 0xc0, 0x2d, 0xf5, 0x8a, 0x10, 0x03, + 0xd1, 0xd8, 0x5c, 0x27, 0xf2, 0xde, 0xf5, 0xb1, 0x10, 0xfd, 0x43, 0xd7, 0x15, 0xe8, + 0xd5, 0x9e, 0xc4, 0xad, 0x0f, 0x41, 0x02, 0x0e, 0xc6, 0x60, 0xcd, 0x97, 0x33, 0xe7, + 0x79, 0xb5, 0x1a, 0x7a, 0xc2, 0xd5, 0xa6, 0x31, + ], + ovk: [ + 0x18, 0x2f, 0x20, 0x7b, 0x31, 0x75, 0x96, 0x1f, 0x64, 0x11, 0xa4, 0x93, 0xbf, 0xfd, + 0x04, 0x8e, 0x7d, 0x0d, 0x87, 0xd8, 0x2f, 0xe6, 0xf9, 0x90, 0xa2, 0xb0, 0xa2, 0x5f, + 0x5a, 0xa0, 0x11, 0x1a, + ], + default_d: [ + 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, + ], + default_pk_d: [ + 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, + 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, + 0x15, 0x37, 0x14, 0x0d, + ], + v: 14400879385556610631, + rseed: [ + 0xd5, 0x07, 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, + 0x00, 0xfb, 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, + 0xbf, 0xee, 0x76, 0xaf, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x61, 0x66, 0x81, 0x90, 0xbd, 0x52, 0xed, 0x49, 0x0e, 0x67, 0x7b, 0x51, 0x5d, + 0x01, 0x43, 0x84, 0xaf, 0x07, 0x21, 0x9c, 0x7c, 0x0e, 0xe7, 0xfc, 0x7b, 0xfc, 0x79, + 0xf3, 0x25, 0x64, 0x4e, 0x4d, 0xf4, 0xc0, 0xd7, 0xdb, 0x08, 0xe9, 0xf0, 0xbd, 0x02, + 0x49, 0x43, 0xc7, 0x05, 0xab, 0xff, 0x89, 0x94, 0xbf, 0xa6, 0x05, 0xcf, 0xbc, 0x7e, + 0xd7, 0x46, 0xa7, 0xd3, 0xf7, 0xc3, 0x7d, 0x9e, 0x8b, 0xdc, 0x43, 0x3b, 0x7d, 0x79, + 0xe0, 0x8a, 0x12, 0xf7, 0x38, 0xa8, 0xf0, 0xdb, 0xdd, 0xfe, 0xf2, 0xf2, 0x65, 0x7e, + 0xf3, 0xe4, 0x7d, 0x1b, 0x0f, 0xd1, 0x1e, 0x6a, 0x13, 0x31, 0x1f, 0xb7, 0x99, 0xc7, + 0x9c, 0x64, 0x1d, 0x9d, 0xa4, 0x3b, 0x33, 0xe7, 0xad, 0x01, 0x2e, 0x28, 0x25, 0x53, + 0x98, 0x78, 0x92, 0x62, 0x27, 0x5f, 0x11, 0x75, 0xbe, 0x84, 0x62, 0xc0, 0x14, 0x91, + 0xc4, 0xd8, 0x42, 0x40, 0x6d, 0x0e, 0xc4, 0x28, 0x2c, 0x95, 0x26, 0x17, 0x4a, 0x09, + 0x87, 0x8f, 0xe8, 0xfd, 0xde, 0x33, 0xa2, 0x96, 0x04, 0xe5, 0xe5, 0xe7, 0xb2, 0xa0, + 0x25, 0xd6, 0x65, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, 0xa5, + 0x74, 0x33, 0xb0, 0xa3, 0x51, 0x47, 0x44, 0x44, 0x09, 0x9d, 0xaa, 0x37, 0x10, 0x46, + 0x61, 0x32, 0x60, 0xcf, 0x33, 0x54, 0xcf, 0xcd, 0xad, 0xa6, 0x63, 0xec, 0xe8, 0x24, + 0xff, 0xd7, 0xe4, 0x43, 0x93, 0x88, 0x6a, 0x86, 0x16, 0x5d, 0xdd, 0xdf, 0x2b, 0x4c, + 0x41, 0x77, 0x35, 0x54, 0xc8, 0x69, 0x95, 0x26, 0x94, 0x08, 0xb1, 0x1e, 0x67, 0x37, + 0xa4, 0xc4, 0x47, 0x58, 0x6f, 0x69, 0x17, 0x34, 0x46, 0xd8, 0xe4, 0x8b, 0xf8, 0x4c, + 0xbc, 0x00, 0x0a, 0x80, 0x78, 0x99, 0x97, 0x3e, 0xb9, 0x3c, 0x5e, 0x81, 0x9a, 0xad, + 0x66, 0x94, 0x13, 0xf8, 0x38, 0x79, 0x33, 0xad, 0x15, 0x84, 0xaa, 0x35, 0xe4, 0x3f, + 0x4e, 0xcd, 0x1e, 0x2d, 0x04, 0x07, 0xc0, 0xb1, 0xb8, 0x99, 0x20, 0xff, 0xdf, 0xdb, + 0x9b, 0xea, 0x51, 0xac, 0x95, 0xb5, 0x57, 0xaf, 0x71, 0xb8, 0x9f, 0x90, 0x3f, 0x5d, + 0x98, 0x48, 0xf1, 0x4f, 0xcb, 0xeb, 0x18, 0x37, 0x57, 0x0f, 0x54, 0x4d, 0x63, 0x59, + 0xeb, 0x23, 0xfa, 0xf3, 0x8a, 0x08, 0x22, 0xda, 0x36, 0xce, 0x42, 0x6c, 0x4a, 0x2f, + 0xbe, 0xff, 0xeb, 0x0a, 0x8a, 0x2e, 0x29, 0x7a, 0x9d, 0x19, 0xba, 0x15, 0x02, 0x45, + 0x90, 0xe3, 0x32, 0x9d, 0x9f, 0xa9, 0x26, 0x1f, 0x99, 0x38, 0xa4, 0x03, 0x2d, 0xd3, + 0x46, 0x06, 0xc9, 0xcf, 0x9f, 0x3d, 0xd3, 0x3e, 0x57, 0x6f, 0x05, 0xcd, 0x1d, 0xd6, + 0x81, 0x1c, 0x62, 0x98, 0x75, 0x7d, 0x77, 0xd9, 0xe8, 0x10, 0xab, 0xdb, 0x22, 0x6a, + 0xfc, 0xaa, 0x43, 0x46, 0xa6, 0x56, 0x0f, 0x89, 0x32, 0xb3, 0x18, 0x1f, 0xd3, 0x55, + 0xd5, 0xd3, 0x91, 0x97, 0x61, 0x83, 0xf8, 0xd9, 0x93, 0x88, 0x83, 0x96, 0x32, 0xd6, + 0x35, 0x4f, 0x66, 0x6d, 0x09, 0xd3, 0xe5, 0x62, 0x9e, 0xa1, 0x97, 0x37, 0x38, 0x86, + 0x13, 0xd3, 0x8a, 0x34, 0xfd, 0x0f, 0x6e, 0x50, 0xee, 0x5a, 0x0c, 0xc9, 0x67, 0x71, + 0x77, 0xf5, 0x00, 0x28, 0xc1, 0x41, 0x37, 0x81, 0x87, 0xbd, 0x28, 0x19, 0x40, 0x3f, + 0xc5, 0x34, 0xf8, 0x00, 0x76, 0xe9, 0x38, 0x0c, 0xb4, 0x96, 0x4d, 0x3b, 0x6b, 0x45, + 0x81, 0x9d, 0x3b, 0x8e, 0x9c, 0xaf, 0x54, 0xf0, 0x51, 0x85, 0x2d, 0x67, 0x1b, 0xf8, + 0xc1, 0xff, 0xde, 0x2d, 0x15, 0x10, 0x75, 0x64, 0x18, 0xcb, 0x48, 0x10, 0x93, 0x6a, + 0xa5, 0x7e, 0x69, 0x65, 0xd6, 0xfb, 0x65, 0x6a, 0x76, 0x0b, 0x7f, 0x19, 0xad, 0xf9, + 0x6c, 0x17, 0x34, 0x88, 0x55, 0x21, 0x93, 0xb1, + ], + cv_net: [ + 0xc3, 0x94, 0x68, 0x5d, 0x92, 0x95, 0x59, 0x7e, 0x21, 0x55, 0x7f, 0x21, 0x9f, 0x3c, + 0x9d, 0x5e, 0x64, 0x07, 0x19, 0xbc, 0xa5, 0xc8, 0xed, 0x49, 0x99, 0x97, 0x34, 0xe6, + 0xc5, 0xb3, 0x73, 0x3e, + ], + rho: [ + 0xc8, 0x8d, 0x00, 0x84, 0x84, 0xc5, 0xd7, 0x98, 0x20, 0xab, 0x68, 0xc6, 0x7d, 0x08, + 0x36, 0x72, 0xb0, 0x7f, 0x72, 0x7d, 0x44, 0xd0, 0xcd, 0x14, 0x73, 0x88, 0x00, 0xf8, + 0x25, 0xb9, 0xff, 0x16, + ], + cmx: [ + 0x0b, 0x74, 0x59, 0x61, 0x6f, 0xc6, 0x93, 0x95, 0xe6, 0x44, 0x36, 0xcf, 0x4a, 0xe9, + 0x44, 0x1d, 0x37, 0x4b, 0x29, 0x04, 0x9e, 0x4c, 0x86, 0x22, 0x3a, 0x03, 0x83, 0xf4, + 0xe0, 0x24, 0x69, 0x05, + ], + esk: [ + 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, 0xa1, 0xc4, 0x12, 0xbc, + 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, 0x95, 0x72, 0x92, 0x93, + 0x59, 0xe0, 0x4c, 0x3a, + ], + ephemeral_key: [ + 0x0e, 0x04, 0xd8, 0x52, 0x5d, 0xd6, 0x8f, 0x7a, 0xe8, 0x68, 0xca, 0x81, 0x1e, 0x88, + 0x33, 0xa7, 0xf4, 0x7d, 0x7a, 0xad, 0xd3, 0x76, 0x03, 0xac, 0xe6, 0x07, 0xee, 0x6c, + 0x86, 0x6b, 0xce, 0x23, + ], + shared_secret: [ + 0x4a, 0x7a, 0x54, 0xac, 0x00, 0x41, 0x95, 0x98, 0xb0, 0x76, 0x01, 0x53, 0xe2, 0x6a, + 0xcc, 0xd2, 0x15, 0x05, 0x24, 0x16, 0x65, 0x17, 0x13, 0xee, 0xa1, 0x89, 0x19, 0xf3, + 0xe2, 0x62, 0xd3, 0xb6, + ], + k_enc: [ + 0x30, 0x62, 0x6d, 0x92, 0xeb, 0x62, 0x0f, 0xd4, 0xa9, 0x28, 0xb4, 0x3f, 0xd5, 0x50, + 0x69, 0x74, 0x71, 0x76, 0x7d, 0xe4, 0x49, 0x6c, 0xfd, 0xad, 0xb1, 0xda, 0x18, 0xfc, + 0x0c, 0xdd, 0x5a, 0xa6, + ], + p_enc: [ + 0x03, 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, 0x47, 0xee, + 0x58, 0x85, 0x80, 0x33, 0xda, 0xc7, 0xd5, 0x07, 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, + 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, 0x00, 0xfb, 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, + 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, 0xbf, 0xee, 0x76, 0xaf, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x61, 0x66, 0x81, 0x90, 0xbd, 0x52, 0xed, 0x49, 0x0e, 0x67, 0x7b, 0x51, 0x5d, + 0x01, 0x43, 0x84, 0xaf, 0x07, 0x21, 0x9c, 0x7c, 0x0e, 0xe7, 0xfc, 0x7b, 0xfc, 0x79, + 0xf3, 0x25, 0x64, 0x4e, 0x4d, 0xf4, 0xc0, 0xd7, 0xdb, 0x08, 0xe9, 0xf0, 0xbd, 0x02, + 0x49, 0x43, 0xc7, 0x05, 0xab, 0xff, 0x89, 0x94, 0xbf, 0xa6, 0x05, 0xcf, 0xbc, 0x7e, + 0xd7, 0x46, 0xa7, 0xd3, 0xf7, 0xc3, 0x7d, 0x9e, 0x8b, 0xdc, 0x43, 0x3b, 0x7d, 0x79, + 0xe0, 0x8a, 0x12, 0xf7, 0x38, 0xa8, 0xf0, 0xdb, 0xdd, 0xfe, 0xf2, 0xf2, 0x65, 0x7e, + 0xf3, 0xe4, 0x7d, 0x1b, 0x0f, 0xd1, 0x1e, 0x6a, 0x13, 0x31, 0x1f, 0xb7, 0x99, 0xc7, + 0x9c, 0x64, 0x1d, 0x9d, 0xa4, 0x3b, 0x33, 0xe7, 0xad, 0x01, 0x2e, 0x28, 0x25, 0x53, + 0x98, 0x78, 0x92, 0x62, 0x27, 0x5f, 0x11, 0x75, 0xbe, 0x84, 0x62, 0xc0, 0x14, 0x91, + 0xc4, 0xd8, 0x42, 0x40, 0x6d, 0x0e, 0xc4, 0x28, 0x2c, 0x95, 0x26, 0x17, 0x4a, 0x09, + 0x87, 0x8f, 0xe8, 0xfd, 0xde, 0x33, 0xa2, 0x96, 0x04, 0xe5, 0xe5, 0xe7, 0xb2, 0xa0, + 0x25, 0xd6, 0x65, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, 0xa5, + 0x74, 0x33, 0xb0, 0xa3, 0x51, 0x47, 0x44, 0x44, 0x09, 0x9d, 0xaa, 0x37, 0x10, 0x46, + 0x61, 0x32, 0x60, 0xcf, 0x33, 0x54, 0xcf, 0xcd, 0xad, 0xa6, 0x63, 0xec, 0xe8, 0x24, + 0xff, 0xd7, 0xe4, 0x43, 0x93, 0x88, 0x6a, 0x86, 0x16, 0x5d, 0xdd, 0xdf, 0x2b, 0x4c, + 0x41, 0x77, 0x35, 0x54, 0xc8, 0x69, 0x95, 0x26, 0x94, 0x08, 0xb1, 0x1e, 0x67, 0x37, + 0xa4, 0xc4, 0x47, 0x58, 0x6f, 0x69, 0x17, 0x34, 0x46, 0xd8, 0xe4, 0x8b, 0xf8, 0x4c, + 0xbc, 0x00, 0x0a, 0x80, 0x78, 0x99, 0x97, 0x3e, 0xb9, 0x3c, 0x5e, 0x81, 0x9a, 0xad, + 0x66, 0x94, 0x13, 0xf8, 0x38, 0x79, 0x33, 0xad, 0x15, 0x84, 0xaa, 0x35, 0xe4, 0x3f, + 0x4e, 0xcd, 0x1e, 0x2d, 0x04, 0x07, 0xc0, 0xb1, 0xb8, 0x99, 0x20, 0xff, 0xdf, 0xdb, + 0x9b, 0xea, 0x51, 0xac, 0x95, 0xb5, 0x57, 0xaf, 0x71, 0xb8, 0x9f, 0x90, 0x3f, 0x5d, + 0x98, 0x48, 0xf1, 0x4f, 0xcb, 0xeb, 0x18, 0x37, 0x57, 0x0f, 0x54, 0x4d, 0x63, 0x59, + 0xeb, 0x23, 0xfa, 0xf3, 0x8a, 0x08, 0x22, 0xda, 0x36, 0xce, 0x42, 0x6c, 0x4a, 0x2f, + 0xbe, 0xff, 0xeb, 0x0a, 0x8a, 0x2e, 0x29, 0x7a, 0x9d, 0x19, 0xba, 0x15, 0x02, 0x45, + 0x90, 0xe3, 0x32, 0x9d, 0x9f, 0xa9, 0x26, 0x1f, 0x99, 0x38, 0xa4, 0x03, 0x2d, 0xd3, + 0x46, 0x06, 0xc9, 0xcf, 0x9f, 0x3d, 0xd3, 0x3e, 0x57, 0x6f, 0x05, 0xcd, 0x1d, 0xd6, + 0x81, 0x1c, 0x62, 0x98, 0x75, 0x7d, 0x77, 0xd9, 0xe8, 0x10, 0xab, 0xdb, 0x22, 0x6a, + 0xfc, 0xaa, 0x43, 0x46, 0xa6, 0x56, 0x0f, 0x89, 0x32, 0xb3, 0x18, 0x1f, 0xd3, 0x55, + 0xd5, 0xd3, 0x91, 0x97, 0x61, 0x83, 0xf8, 0xd9, 0x93, 0x88, 0x83, 0x96, 0x32, 0xd6, + 0x35, 0x4f, 0x66, 0x6d, 0x09, 0xd3, 0xe5, 0x62, 0x9e, 0xa1, 0x97, 0x37, 0x38, 0x86, + 0x13, 0xd3, 0x8a, 0x34, 0xfd, 0x0f, 0x6e, 0x50, 0xee, 0x5a, 0x0c, 0xc9, 0x67, 0x71, + 0x77, 0xf5, 0x00, 0x28, 0xc1, 0x41, 0x37, 0x81, 0x87, 0xbd, 0x28, 0x19, 0x40, 0x3f, + 0xc5, 0x34, 0xf8, 0x00, 0x76, 0xe9, 0x38, 0x0c, 0xb4, 0x96, 0x4d, 0x3b, 0x6b, 0x45, + 0x81, 0x9d, 0x3b, 0x8e, 0x9c, 0xaf, 0x54, 0xf0, 0x51, 0x85, 0x2d, 0x67, 0x1b, 0xf8, + 0xc1, 0xff, 0xde, 0x2d, 0x15, 0x10, 0x75, 0x64, 0x18, 0xcb, 0x48, 0x10, 0x93, 0x6a, + 0xa5, 0x7e, 0x69, 0x65, 0xd6, 0xfb, 0x65, 0x6a, 0x76, 0x0b, 0x7f, 0x19, 0xad, 0xf9, + 0x6c, 0x17, 0x34, 0x88, 0x55, 0x21, 0x93, 0xb1, + ], + c_enc: [ + 0x80, 0x56, 0x2d, 0xbe, 0xf7, 0xbb, 0x35, 0x3a, 0x62, 0xe7, 0xc8, 0x1e, 0xbe, 0x68, + 0x15, 0x6c, 0xb7, 0x5c, 0x5c, 0x7e, 0x3d, 0x96, 0xbb, 0xcd, 0x7d, 0xaf, 0xf5, 0x0c, + 0xb0, 0x95, 0x7d, 0x33, 0xdd, 0x99, 0x77, 0x9f, 0x7d, 0x3d, 0x72, 0xb1, 0x8d, 0xeb, + 0x7a, 0x69, 0x75, 0x10, 0xe0, 0x13, 0x5b, 0x8d, 0xf4, 0x83, 0x3c, 0xf5, 0x82, 0xa1, + 0x4f, 0x08, 0xfc, 0xa9, 0xb3, 0x7a, 0xac, 0x85, 0x1f, 0xf9, 0xf5, 0x80, 0x5c, 0x57, + 0x74, 0x8a, 0x3f, 0xe8, 0x1b, 0x88, 0xc9, 0x8c, 0x96, 0xfd, 0x2a, 0x75, 0xc4, 0xf6, + 0x66, 0xb6, 0x1d, 0x20, 0x74, 0x06, 0x5c, 0xf4, 0x4a, 0x30, 0xa1, 0x98, 0xa2, 0x98, + 0xb7, 0xda, 0x42, 0x7c, 0x18, 0x60, 0x8a, 0x8f, 0x13, 0x83, 0x63, 0xf0, 0x55, 0x40, + 0x42, 0xd3, 0xe3, 0xa7, 0xe3, 0x22, 0x94, 0x51, 0x51, 0xc6, 0x3b, 0xb2, 0x37, 0xb3, + 0x20, 0xbc, 0x78, 0x0a, 0x8f, 0x9e, 0x01, 0xc6, 0x01, 0xf0, 0x34, 0xbc, 0xf0, 0x37, + 0x67, 0xd5, 0xd7, 0x50, 0x40, 0x2a, 0x23, 0x80, 0x0f, 0x46, 0xec, 0x08, 0x78, 0x0a, + 0x8f, 0x78, 0xe9, 0xa2, 0x37, 0xa9, 0xcb, 0x83, 0x06, 0x26, 0x1d, 0x1b, 0xb4, 0xc3, + 0xf6, 0x2e, 0xf4, 0xcb, 0x0f, 0x70, 0x34, 0x65, 0x32, 0x24, 0xfe, 0x77, 0x17, 0x9a, + 0x4d, 0x12, 0x15, 0x9a, 0x87, 0x66, 0xff, 0xc5, 0x9b, 0xee, 0x68, 0xd9, 0x74, 0xd2, + 0x27, 0x73, 0xe5, 0xca, 0x4f, 0x34, 0xf4, 0x62, 0x73, 0xa4, 0x46, 0x33, 0x69, 0xb1, + 0x76, 0xa6, 0x1f, 0x1e, 0x47, 0x8c, 0x2d, 0x3c, 0x4e, 0x42, 0x70, 0x13, 0xe5, 0xd8, + 0x69, 0x75, 0xea, 0x91, 0x93, 0x05, 0x0e, 0x52, 0xa7, 0x02, 0x6f, 0x76, 0x96, 0x4c, + 0xa0, 0x18, 0x15, 0x9b, 0xdc, 0x19, 0x6c, 0x44, 0xca, 0xd2, 0xd2, 0x62, 0x3d, 0x33, + 0x50, 0x7e, 0xf0, 0xfe, 0xc1, 0x0f, 0x9d, 0x80, 0xb2, 0x08, 0xe3, 0xc3, 0x3f, 0x7d, + 0x50, 0x76, 0x41, 0x63, 0xb3, 0xf0, 0x33, 0x29, 0xad, 0x41, 0xeb, 0x5a, 0x4f, 0xb4, + 0xf3, 0xab, 0x8e, 0xef, 0x2d, 0xa5, 0xcb, 0x3a, 0x7c, 0x86, 0x22, 0x16, 0x48, 0x70, + 0xa8, 0x2c, 0x63, 0x5d, 0x23, 0x51, 0x53, 0x9b, 0x97, 0x3c, 0x40, 0xd5, 0x8e, 0x91, + 0x79, 0x43, 0x6b, 0x9c, 0x0b, 0x74, 0xfd, 0x5e, 0xab, 0x81, 0x49, 0x59, 0xd2, 0x80, + 0xea, 0x3f, 0x8e, 0x09, 0xd8, 0x44, 0x2f, 0xea, 0x4a, 0xdc, 0x8c, 0xc9, 0xc2, 0xfe, + 0x50, 0xef, 0xad, 0x2e, 0xe1, 0x9a, 0xb5, 0x85, 0x7a, 0x2d, 0x2f, 0xb1, 0xd1, 0x13, + 0x67, 0x08, 0x22, 0xb9, 0x57, 0x95, 0xa3, 0x4d, 0x20, 0xf7, 0xc6, 0x37, 0xf8, 0xdc, + 0xcf, 0xe7, 0x35, 0x52, 0xfd, 0x34, 0x17, 0x6a, 0xbf, 0x0f, 0x8e, 0x3c, 0xfa, 0x70, + 0xbe, 0xc8, 0x84, 0x4b, 0x87, 0xb1, 0x44, 0xcb, 0x99, 0xb0, 0xb0, 0x9b, 0x47, 0xc6, + 0x62, 0xdd, 0x70, 0x5e, 0x4d, 0x74, 0xc1, 0x5d, 0x47, 0x42, 0x98, 0x33, 0xe7, 0x80, + 0x5d, 0x88, 0x40, 0x46, 0xc0, 0xd9, 0x36, 0xc8, 0x72, 0x32, 0xcd, 0xc9, 0x53, 0xbf, + 0x6e, 0x61, 0x93, 0xb4, 0xcf, 0x67, 0x81, 0x12, 0x8e, 0xbe, 0x7a, 0x51, 0xdb, 0x9b, + 0x36, 0x67, 0x38, 0x08, 0xad, 0x77, 0x18, 0xe2, 0x50, 0xcb, 0x51, 0x15, 0x85, 0xf6, + 0xbc, 0x09, 0x78, 0xbd, 0x17, 0xe4, 0x71, 0x7e, 0xa4, 0x19, 0x3d, 0x09, 0x5d, 0x22, + 0x2b, 0xa1, 0xb2, 0xf9, 0xd8, 0x18, 0x98, 0x1d, 0xf1, 0x72, 0xa4, 0x91, 0xd8, 0x41, + 0xbc, 0x73, 0xec, 0x17, 0x93, 0x41, 0xa2, 0x8f, 0x03, 0x8a, 0xa3, 0xe4, 0xc8, 0x65, + 0x24, 0x11, 0xf1, 0x85, 0xa6, 0x49, 0x92, 0xa6, 0xce, 0xa6, 0xc4, 0x5c, 0x70, 0xe9, + 0xd6, 0x64, 0x69, 0x4b, 0xc9, 0x44, 0x1f, 0x29, 0xc4, 0x81, 0x81, 0x5a, 0x82, 0xb3, + 0xa3, 0x30, 0xc9, 0x6c, 0x05, 0xfc, 0x9c, 0x48, 0x5a, 0xe8, 0xd9, 0x96, 0xb6, 0xf9, + 0xf6, 0x87, 0xf3, 0x90, 0x1f, 0x74, 0x0a, 0xc8, 0x9a, 0xb2, 0x42, 0xf2, 0xaa, 0x0c, + 0xe7, 0xb0, 0xeb, 0x14, 0xb4, 0x2d, 0x65, 0xba, 0xd9, 0xfe, 0x5c, 0xe2, 0x91, 0xa2, + 0x2c, 0xb1, 0xff, 0xdf, 0xdf, 0x27, 0x30, 0xd6, 0x8f, 0x68, 0x2d, 0xe0, 0xf9, 0xf3, + 0xa3, 0x04, 0xf5, 0x0c, 0x4f, 0xfd, 0xf9, 0x58, 0x30, 0x6c, 0x11, 0xa2, 0x91, 0x70, + 0xdd, 0xae, 0x90, 0x65, 0xcc, 0xc9, 0xd4, 0xd2, 0x77, 0x62, 0x6e, 0x78, 0x81, 0x72, + 0x3a, 0xe1, 0x72, 0xff, 0x09, 0xdb, 0x09, 0x38, 0x6f, 0x9e, + ], + ock: [ + 0xb6, 0x36, 0xc3, 0x9a, 0x6b, 0xad, 0x22, 0x63, 0xb2, 0x44, 0x1e, 0xd5, 0xbb, 0xdb, + 0x01, 0x35, 0x88, 0xfb, 0x46, 0x27, 0x01, 0xe6, 0xf8, 0x76, 0x64, 0x6c, 0x8c, 0x17, + 0xfa, 0x2e, 0xfd, 0xe8, + ], + op: [ + 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, + 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, + 0x15, 0x37, 0x14, 0x0d, 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, + 0xa1, 0xc4, 0x12, 0xbc, 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, + 0x95, 0x72, 0x92, 0x93, 0x59, 0xe0, 0x4c, 0x3a, + ], + c_out: [ + 0x46, 0xba, 0x14, 0xf8, 0x3f, 0xf5, 0xab, 0x76, 0x0f, 0x14, 0x20, 0xeb, 0xde, 0xd9, + 0x86, 0xfd, 0x93, 0x78, 0x27, 0xbc, 0x05, 0x69, 0x2e, 0xca, 0xdb, 0x65, 0x2e, 0xbb, + 0xc8, 0xf6, 0xd9, 0xb5, 0x2e, 0xc3, 0x97, 0x87, 0xd8, 0xeb, 0xdd, 0x50, 0x6c, 0xa1, + 0xa8, 0x5d, 0xc3, 0xd5, 0xba, 0x4c, 0x5b, 0x41, 0x52, 0x61, 0xb0, 0x75, 0x3a, 0xc1, + 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, + 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xf1, 0x90, 0x42, 0xb9, 0xd1, 0x0c, 0xc4, 0x80, 0xa0, 0x8c, 0x04, 0x32, 0x2d, 0xb6, + 0xec, 0x4e, 0x41, 0x2e, 0xaa, 0x84, 0xc9, 0x71, 0x82, 0x8c, 0xcc, 0xd7, 0x33, 0xa1, + 0x1f, 0x25, 0x3e, 0xda, 0x8a, 0xc3, 0x0b, 0xa3, 0x1f, 0xbc, 0x89, 0x5d, 0x60, 0xb9, + 0x83, 0x06, 0x2a, 0x5f, 0x45, 0x33, 0x90, 0x79, 0x32, 0x26, 0xff, 0xd9, 0x21, 0xbd, + 0x64, 0xac, 0x39, 0x07, 0x03, 0x85, 0x6a, 0x0b, + ], + ovk: [ + 0xda, 0xdc, 0x96, 0x6c, 0x8a, 0x54, 0x66, 0xb6, 0x1f, 0xc9, 0x98, 0xc3, 0x1f, 0x10, + 0x70, 0xd9, 0xa5, 0xc9, 0xa6, 0xd2, 0x68, 0xd3, 0x04, 0xfe, 0x6b, 0x8f, 0xd3, 0xb4, + 0x01, 0x03, 0x48, 0x61, + ], + default_d: [ + 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, + ], + default_pk_d: [ + 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, + 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, + 0x14, 0x93, 0x16, 0x36, + ], + v: 17936016275122962426, + rseed: [ + 0x49, 0x95, 0x0a, 0xfc, 0xb0, 0xef, 0x46, 0x2a, 0x2a, 0xe0, 0x24, 0xb0, 0xf0, 0x22, + 0x4d, 0xfd, 0x73, 0x68, 0x4b, 0x88, 0xc7, 0xfb, 0xe9, 0x2d, 0x02, 0xb6, 0x8f, 0x75, + 0x9c, 0x47, 0x52, 0x66, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x3c, 0xd7, 0xb9, 0x7a, 0x14, 0x94, 0x36, 0x49, 0x30, 0x55, 0x21, 0x32, 0x6b, + 0xde, 0x08, 0x56, 0x30, 0x86, 0x46, 0x29, 0x29, 0x1b, 0xae, 0x25, 0xff, 0x88, 0x22, + 0xa1, 0x4c, 0x4b, 0x66, 0x6a, 0x92, 0x59, 0xad, 0x0d, 0xc4, 0x2a, 0x82, 0x90, 0xac, + 0x7b, 0xc7, 0xf5, 0x3a, 0x16, 0xf3, 0x79, 0xf7, 0x58, 0xe5, 0xde, 0x75, 0x0f, 0x04, + 0xfd, 0x7c, 0xad, 0x47, 0x70, 0x1c, 0x85, 0x97, 0xf9, 0x78, 0x88, 0xbe, 0xa6, 0xfa, + 0x0b, 0xf2, 0x99, 0x99, 0x56, 0xfb, 0xfd, 0x0e, 0xe6, 0x8e, 0xc3, 0x6e, 0x46, 0x88, + 0x80, 0x9a, 0xe2, 0x31, 0xeb, 0x8b, 0xc4, 0x36, 0x9f, 0x5f, 0xe1, 0x57, 0x3f, 0x57, + 0xe0, 0x99, 0xd9, 0xc0, 0x99, 0x01, 0xbf, 0x39, 0xca, 0xac, 0x48, 0xdc, 0x11, 0x95, + 0x6a, 0x8a, 0xe9, 0x05, 0xea, 0xd8, 0x69, 0x54, 0x54, 0x7c, 0x44, 0x8a, 0xe4, 0x3d, + 0x31, 0x5e, 0x66, 0x9c, 0x42, 0x42, 0xda, 0x56, 0x59, 0x38, 0xf4, 0x17, 0xbf, 0x43, + 0xce, 0x7b, 0x2b, 0x30, 0xb1, 0xcd, 0x40, 0x18, 0x38, 0x8e, 0x1a, 0x91, 0x0f, 0x0f, + 0xc4, 0x1f, 0xb0, 0x87, 0x7a, 0x59, 0x25, 0xe4, 0x66, 0x81, 0x9d, 0x37, 0x5b, 0x0a, + 0x91, 0x2d, 0x4f, 0xe8, 0x43, 0xb7, 0x6e, 0xf6, 0xf2, 0x23, 0xf0, 0xf7, 0xc8, 0x94, + 0xf3, 0x8f, 0x7a, 0xb7, 0x80, 0xdf, 0xd7, 0x5f, 0x66, 0x9c, 0x8c, 0x06, 0xcf, 0xfa, + 0x43, 0xeb, 0x47, 0x56, 0x5a, 0x50, 0xe3, 0xb1, 0xfa, 0x45, 0xad, 0x61, 0xce, 0x9a, + 0x1c, 0x47, 0x27, 0xb7, 0xaa, 0xa5, 0x35, 0x62, 0xf5, 0x23, 0xe7, 0x39, 0x52, 0xbb, + 0xf3, 0x3d, 0x8a, 0x41, 0x04, 0x07, 0x8a, 0xde, 0x3e, 0xaa, 0xa4, 0x96, 0x99, 0xa6, + 0x9f, 0xdf, 0x1c, 0x5a, 0xc7, 0x73, 0x21, 0x46, 0xee, 0x5e, 0x1d, 0x6b, 0x6c, 0xa9, + 0xb9, 0x18, 0x0f, 0x96, 0x4c, 0xc9, 0xd0, 0x87, 0x8a, 0xe1, 0x37, 0x35, 0x24, 0xd7, + 0xd5, 0x10, 0xe5, 0x82, 0x27, 0xdf, 0x6d, 0xe9, 0xd3, 0x0d, 0x27, 0x18, 0x67, 0x64, + 0x01, 0x77, 0xb0, 0xf1, 0x85, 0x6e, 0x28, 0xd5, 0xc8, 0xaf, 0xb0, 0x95, 0xef, 0x61, + 0x84, 0xfe, 0xd6, 0x51, 0x58, 0x90, 0x22, 0xee, 0xae, 0xa4, 0xc0, 0xce, 0x1f, 0xa6, + 0xf0, 0x85, 0x09, 0x2b, 0x04, 0x97, 0x94, 0x89, 0x17, 0x2b, 0x3e, 0xf8, 0x19, 0x4a, + 0x79, 0x8d, 0xf5, 0x72, 0x4d, 0x6b, 0x05, 0xf1, 0xae, 0x00, 0x00, 0x13, 0xa0, 0x8d, + 0x61, 0x2b, 0xca, 0x8a, 0x8c, 0x31, 0x44, 0x3c, 0x10, 0x34, 0x6d, 0xbf, 0x61, 0xde, + 0x84, 0x75, 0xc0, 0xbb, 0xec, 0x51, 0x04, 0xb4, 0x75, 0x56, 0xaf, 0x3d, 0x51, 0x44, + 0x58, 0xe2, 0x32, 0x1d, 0x14, 0x60, 0x71, 0x78, 0x9d, 0x23, 0x35, 0x93, 0x4a, 0x68, + 0x06, 0x14, 0xe8, 0x35, 0x62, 0xf8, 0x2d, 0xfd, 0x40, 0x5b, 0x54, 0xa4, 0x5e, 0xb3, + 0x2c, 0x16, 0x54, 0x48, 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, 0x95, 0x85, 0x36, 0x9f, + 0x53, 0xf1, 0xa1, 0x37, 0xe9, 0xe8, 0x2b, 0x67, 0xb8, 0xfd, 0xaf, 0x01, 0xbd, 0xa5, + 0x4a, 0x31, 0x73, 0x11, 0x89, 0x6a, 0xe1, 0x02, 0x80, 0xa0, 0x32, 0x44, 0x0c, 0x42, + 0x0a, 0x42, 0x1e, 0x94, 0x4d, 0x1e, 0x95, 0x2b, 0x70, 0xd5, 0x82, 0x6c, 0xd3, 0xb0, + 0x8b, 0x7d, 0xb9, 0x63, 0x0f, 0xe4, 0xfd, 0x5f, 0x22, 0x12, 0x5d, 0xe8, 0x40, 0xfc, + 0xc4, 0x0b, 0x98, 0x03, 0x8a, 0xf1, 0x1d, 0x55, 0xbe, 0x25, 0x43, 0x25, 0x97, 0xb4, + 0xb6, 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, 0xbf, 0x7e, 0x1c, 0x17, + 0x85, 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, 0x54, 0xf1, 0xf1, 0x77, 0x71, + 0xcf, 0xb7, 0x50, 0x30, 0x72, 0x65, 0x57, 0x53, + ], + cv_net: [ + 0xd4, 0x51, 0xb4, 0x62, 0x89, 0xba, 0x99, 0x8c, 0x0c, 0xce, 0xd1, 0xcc, 0x15, 0xb3, + 0xfa, 0xde, 0x94, 0xfa, 0x0b, 0x46, 0xe3, 0xb1, 0xa5, 0x73, 0x34, 0x99, 0x34, 0xe2, + 0x32, 0xb5, 0x0e, 0x96, + ], + rho: [ + 0xa9, 0x0a, 0x9b, 0x8a, 0xb1, 0x35, 0x9d, 0xc9, 0x6b, 0xda, 0xe9, 0x0e, 0x52, 0x74, + 0x78, 0x8c, 0xb0, 0xc4, 0x26, 0xef, 0xf2, 0x60, 0x43, 0x61, 0x85, 0x39, 0x8b, 0xff, + 0xf5, 0x0e, 0x92, 0x37, + ], + cmx: [ + 0x05, 0xb5, 0xe3, 0x20, 0x76, 0xda, 0xe0, 0x94, 0x83, 0x35, 0xac, 0x3d, 0x65, 0x1c, + 0x6d, 0xbe, 0xa6, 0x4c, 0xe9, 0x11, 0x42, 0x3e, 0x2f, 0x2c, 0x7c, 0x1b, 0xdf, 0xa6, + 0xb1, 0x41, 0x41, 0x30, + ], + esk: [ + 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, 0xfe, 0x47, 0x9a, 0x1e, + 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, 0x92, 0x3a, 0x5d, 0x00, + 0xcb, 0x52, 0xa6, 0x13, + ], + ephemeral_key: [ + 0x86, 0xee, 0x66, 0xa6, 0xc7, 0xd9, 0xb5, 0xc4, 0xf0, 0xe2, 0xd2, 0xa0, 0xe1, 0x56, + 0x1e, 0x2a, 0xfa, 0x55, 0x41, 0xa7, 0x24, 0xee, 0x02, 0x7f, 0xc7, 0x0b, 0xb7, 0xe8, + 0x0a, 0x2c, 0x60, 0x98, + ], + shared_secret: [ + 0x88, 0xd1, 0x38, 0x2c, 0x14, 0x42, 0x02, 0xd0, 0xd7, 0x55, 0x75, 0x87, 0xb0, 0xd5, + 0xd0, 0x21, 0x69, 0x29, 0x2a, 0x25, 0x05, 0x43, 0xcb, 0x0a, 0x06, 0xc3, 0x4f, 0x45, + 0x2f, 0x7b, 0x3b, 0x36, + ], + k_enc: [ + 0xe3, 0x73, 0xd8, 0x6e, 0xc9, 0xdd, 0xdd, 0x64, 0x5d, 0x9a, 0x6d, 0x06, 0xef, 0xce, + 0x22, 0xb8, 0x96, 0x42, 0x1d, 0x57, 0xa4, 0x4d, 0x37, 0xa6, 0x50, 0x4a, 0x5d, 0x19, + 0xdf, 0x21, 0x73, 0x73, + ], + p_enc: [ + 0x03, 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, 0xfa, 0x3f, + 0x54, 0xec, 0xc5, 0x87, 0xe9, 0xf8, 0x49, 0x95, 0x0a, 0xfc, 0xb0, 0xef, 0x46, 0x2a, + 0x2a, 0xe0, 0x24, 0xb0, 0xf0, 0x22, 0x4d, 0xfd, 0x73, 0x68, 0x4b, 0x88, 0xc7, 0xfb, + 0xe9, 0x2d, 0x02, 0xb6, 0x8f, 0x75, 0x9c, 0x47, 0x52, 0x66, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x3c, 0xd7, 0xb9, 0x7a, 0x14, 0x94, 0x36, 0x49, 0x30, 0x55, 0x21, 0x32, 0x6b, + 0xde, 0x08, 0x56, 0x30, 0x86, 0x46, 0x29, 0x29, 0x1b, 0xae, 0x25, 0xff, 0x88, 0x22, + 0xa1, 0x4c, 0x4b, 0x66, 0x6a, 0x92, 0x59, 0xad, 0x0d, 0xc4, 0x2a, 0x82, 0x90, 0xac, + 0x7b, 0xc7, 0xf5, 0x3a, 0x16, 0xf3, 0x79, 0xf7, 0x58, 0xe5, 0xde, 0x75, 0x0f, 0x04, + 0xfd, 0x7c, 0xad, 0x47, 0x70, 0x1c, 0x85, 0x97, 0xf9, 0x78, 0x88, 0xbe, 0xa6, 0xfa, + 0x0b, 0xf2, 0x99, 0x99, 0x56, 0xfb, 0xfd, 0x0e, 0xe6, 0x8e, 0xc3, 0x6e, 0x46, 0x88, + 0x80, 0x9a, 0xe2, 0x31, 0xeb, 0x8b, 0xc4, 0x36, 0x9f, 0x5f, 0xe1, 0x57, 0x3f, 0x57, + 0xe0, 0x99, 0xd9, 0xc0, 0x99, 0x01, 0xbf, 0x39, 0xca, 0xac, 0x48, 0xdc, 0x11, 0x95, + 0x6a, 0x8a, 0xe9, 0x05, 0xea, 0xd8, 0x69, 0x54, 0x54, 0x7c, 0x44, 0x8a, 0xe4, 0x3d, + 0x31, 0x5e, 0x66, 0x9c, 0x42, 0x42, 0xda, 0x56, 0x59, 0x38, 0xf4, 0x17, 0xbf, 0x43, + 0xce, 0x7b, 0x2b, 0x30, 0xb1, 0xcd, 0x40, 0x18, 0x38, 0x8e, 0x1a, 0x91, 0x0f, 0x0f, + 0xc4, 0x1f, 0xb0, 0x87, 0x7a, 0x59, 0x25, 0xe4, 0x66, 0x81, 0x9d, 0x37, 0x5b, 0x0a, + 0x91, 0x2d, 0x4f, 0xe8, 0x43, 0xb7, 0x6e, 0xf6, 0xf2, 0x23, 0xf0, 0xf7, 0xc8, 0x94, + 0xf3, 0x8f, 0x7a, 0xb7, 0x80, 0xdf, 0xd7, 0x5f, 0x66, 0x9c, 0x8c, 0x06, 0xcf, 0xfa, + 0x43, 0xeb, 0x47, 0x56, 0x5a, 0x50, 0xe3, 0xb1, 0xfa, 0x45, 0xad, 0x61, 0xce, 0x9a, + 0x1c, 0x47, 0x27, 0xb7, 0xaa, 0xa5, 0x35, 0x62, 0xf5, 0x23, 0xe7, 0x39, 0x52, 0xbb, + 0xf3, 0x3d, 0x8a, 0x41, 0x04, 0x07, 0x8a, 0xde, 0x3e, 0xaa, 0xa4, 0x96, 0x99, 0xa6, + 0x9f, 0xdf, 0x1c, 0x5a, 0xc7, 0x73, 0x21, 0x46, 0xee, 0x5e, 0x1d, 0x6b, 0x6c, 0xa9, + 0xb9, 0x18, 0x0f, 0x96, 0x4c, 0xc9, 0xd0, 0x87, 0x8a, 0xe1, 0x37, 0x35, 0x24, 0xd7, + 0xd5, 0x10, 0xe5, 0x82, 0x27, 0xdf, 0x6d, 0xe9, 0xd3, 0x0d, 0x27, 0x18, 0x67, 0x64, + 0x01, 0x77, 0xb0, 0xf1, 0x85, 0x6e, 0x28, 0xd5, 0xc8, 0xaf, 0xb0, 0x95, 0xef, 0x61, + 0x84, 0xfe, 0xd6, 0x51, 0x58, 0x90, 0x22, 0xee, 0xae, 0xa4, 0xc0, 0xce, 0x1f, 0xa6, + 0xf0, 0x85, 0x09, 0x2b, 0x04, 0x97, 0x94, 0x89, 0x17, 0x2b, 0x3e, 0xf8, 0x19, 0x4a, + 0x79, 0x8d, 0xf5, 0x72, 0x4d, 0x6b, 0x05, 0xf1, 0xae, 0x00, 0x00, 0x13, 0xa0, 0x8d, + 0x61, 0x2b, 0xca, 0x8a, 0x8c, 0x31, 0x44, 0x3c, 0x10, 0x34, 0x6d, 0xbf, 0x61, 0xde, + 0x84, 0x75, 0xc0, 0xbb, 0xec, 0x51, 0x04, 0xb4, 0x75, 0x56, 0xaf, 0x3d, 0x51, 0x44, + 0x58, 0xe2, 0x32, 0x1d, 0x14, 0x60, 0x71, 0x78, 0x9d, 0x23, 0x35, 0x93, 0x4a, 0x68, + 0x06, 0x14, 0xe8, 0x35, 0x62, 0xf8, 0x2d, 0xfd, 0x40, 0x5b, 0x54, 0xa4, 0x5e, 0xb3, + 0x2c, 0x16, 0x54, 0x48, 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, 0x95, 0x85, 0x36, 0x9f, + 0x53, 0xf1, 0xa1, 0x37, 0xe9, 0xe8, 0x2b, 0x67, 0xb8, 0xfd, 0xaf, 0x01, 0xbd, 0xa5, + 0x4a, 0x31, 0x73, 0x11, 0x89, 0x6a, 0xe1, 0x02, 0x80, 0xa0, 0x32, 0x44, 0x0c, 0x42, + 0x0a, 0x42, 0x1e, 0x94, 0x4d, 0x1e, 0x95, 0x2b, 0x70, 0xd5, 0x82, 0x6c, 0xd3, 0xb0, + 0x8b, 0x7d, 0xb9, 0x63, 0x0f, 0xe4, 0xfd, 0x5f, 0x22, 0x12, 0x5d, 0xe8, 0x40, 0xfc, + 0xc4, 0x0b, 0x98, 0x03, 0x8a, 0xf1, 0x1d, 0x55, 0xbe, 0x25, 0x43, 0x25, 0x97, 0xb4, + 0xb6, 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, 0xbf, 0x7e, 0x1c, 0x17, + 0x85, 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, 0x54, 0xf1, 0xf1, 0x77, 0x71, + 0xcf, 0xb7, 0x50, 0x30, 0x72, 0x65, 0x57, 0x53, + ], + c_enc: [ + 0xe6, 0x67, 0x81, 0xae, 0x63, 0x84, 0x1f, 0xff, 0xea, 0x30, 0x21, 0x96, 0x15, 0x94, + 0xc2, 0x2a, 0x87, 0x20, 0xc7, 0xd8, 0xaa, 0x80, 0x8b, 0xc8, 0x6e, 0x71, 0xa3, 0x6a, + 0xd7, 0xf8, 0x6f, 0xf8, 0x7c, 0x07, 0xd3, 0xc6, 0x50, 0xa0, 0x8e, 0x23, 0xe9, 0xb5, + 0x4f, 0x00, 0xb4, 0x0b, 0xa0, 0x15, 0x91, 0x69, 0xdf, 0xca, 0xac, 0xbe, 0x6e, 0x4d, + 0x87, 0xe9, 0x2a, 0xae, 0x2f, 0xe4, 0xe5, 0x8e, 0x78, 0x48, 0x69, 0xa9, 0x70, 0x68, + 0x4c, 0x9b, 0x87, 0xc9, 0xa1, 0xa0, 0xcc, 0x39, 0xb3, 0xbc, 0xce, 0xf4, 0x7c, 0xd7, + 0x6c, 0x23, 0x97, 0xb1, 0x43, 0x39, 0x5a, 0xd5, 0xbd, 0x5f, 0xe4, 0x22, 0x2c, 0x05, + 0xee, 0xb7, 0xc2, 0x0a, 0x5d, 0x0c, 0x35, 0xf0, 0x3a, 0xa2, 0xa6, 0xba, 0xfa, 0xdf, + 0x36, 0x3b, 0x1b, 0xa1, 0x5f, 0x8e, 0x75, 0x17, 0x79, 0x32, 0x03, 0xba, 0x09, 0x0e, + 0xda, 0x67, 0x1a, 0xcf, 0x48, 0xba, 0xaf, 0x8a, 0x6c, 0x1d, 0x55, 0xac, 0x76, 0x0b, + 0x10, 0xa0, 0x85, 0xb2, 0xe8, 0x33, 0xeb, 0x03, 0xb2, 0xbb, 0xd5, 0x21, 0x46, 0xd2, + 0x73, 0x19, 0xcc, 0x97, 0x13, 0x70, 0x14, 0xe7, 0x83, 0xac, 0xb6, 0x40, 0x27, 0xb6, + 0xea, 0x33, 0xa7, 0x1e, 0x54, 0xab, 0xb0, 0xe3, 0xf6, 0x05, 0x39, 0x10, 0xce, 0x33, + 0xa1, 0xc2, 0xde, 0x27, 0xd5, 0x80, 0x1a, 0x0d, 0xfc, 0x95, 0x28, 0xf8, 0x17, 0xb1, + 0x24, 0x88, 0x05, 0x62, 0xb7, 0x1f, 0xb9, 0x91, 0xd4, 0x1d, 0x2b, 0x4a, 0x20, 0x3b, + 0x3b, 0x20, 0x97, 0x55, 0xb6, 0x16, 0x8a, 0x99, 0x8c, 0xea, 0xb0, 0x2b, 0x21, 0x1e, + 0x49, 0xfe, 0x6a, 0xb1, 0x3a, 0x9a, 0x38, 0x83, 0xfe, 0xca, 0xfa, 0x87, 0x6d, 0xb2, + 0xbe, 0x99, 0x1a, 0x0a, 0xab, 0xb9, 0xf1, 0x50, 0xd5, 0xf1, 0xbf, 0xfc, 0x75, 0xbf, + 0x4d, 0xd0, 0xcf, 0x15, 0x09, 0xe5, 0x6b, 0x7e, 0xc8, 0x37, 0xdb, 0x74, 0xd1, 0xcb, + 0x2a, 0x10, 0x45, 0x1e, 0x1c, 0x04, 0xdd, 0xf9, 0x5b, 0x17, 0x20, 0x00, 0x94, 0x52, + 0xc5, 0x55, 0x86, 0x96, 0x35, 0x0e, 0xfd, 0xbf, 0x38, 0xc3, 0xde, 0x29, 0x98, 0x09, + 0x7c, 0xa7, 0xac, 0xd7, 0x09, 0x9a, 0x73, 0x94, 0x73, 0xc2, 0x07, 0x85, 0x89, 0xe7, + 0x18, 0xf9, 0x20, 0xad, 0xeb, 0xd6, 0xcb, 0x6e, 0xb1, 0x2e, 0x3f, 0xd2, 0x29, 0x47, + 0xa7, 0x6d, 0x19, 0x17, 0x45, 0xa6, 0xa9, 0x73, 0xc8, 0xb8, 0x4e, 0x9c, 0xd3, 0x30, + 0x7e, 0x47, 0x88, 0x81, 0xe9, 0x79, 0x8f, 0xd6, 0x66, 0x57, 0xec, 0xe5, 0xe0, 0x89, + 0xd6, 0x62, 0x71, 0x18, 0xc1, 0x1b, 0xa4, 0x01, 0xb0, 0x17, 0xdb, 0x2d, 0x6f, 0xf4, + 0x42, 0x10, 0xdb, 0x3e, 0x05, 0xaf, 0xe3, 0x10, 0x18, 0x79, 0xd9, 0x6f, 0x20, 0x2b, + 0x04, 0x93, 0x67, 0x2b, 0x55, 0x01, 0x3b, 0x26, 0x47, 0xad, 0x71, 0x7f, 0x8e, 0xf2, + 0x6f, 0x3d, 0x43, 0xb7, 0x75, 0x9e, 0xf5, 0xd6, 0x72, 0xcb, 0x14, 0x17, 0xf9, 0x78, + 0x81, 0xc3, 0x28, 0x80, 0x61, 0x2e, 0x6b, 0x00, 0xcc, 0x63, 0xfd, 0xa8, 0xd0, 0x29, + 0x88, 0xc4, 0x03, 0xee, 0x95, 0x6f, 0xfe, 0x72, 0xa2, 0xe1, 0xd1, 0x64, 0x29, 0x10, + 0xe3, 0xdf, 0x2c, 0xb8, 0xe0, 0xce, 0x90, 0x6f, 0x66, 0x2a, 0x96, 0x37, 0x5b, 0x78, + 0x64, 0xe1, 0x7f, 0x2a, 0x3d, 0x12, 0x19, 0x68, 0x47, 0x57, 0x03, 0x3c, 0xeb, 0x0c, + 0xb7, 0xea, 0x10, 0xd9, 0x90, 0x2d, 0x56, 0x55, 0x53, 0x15, 0xa8, 0x0f, 0x99, 0x7f, + 0xb7, 0xc3, 0xa6, 0xb7, 0x0e, 0x30, 0x7f, 0x33, 0x18, 0x44, 0x60, 0x1e, 0xf5, 0x70, + 0x13, 0xe3, 0xd3, 0x35, 0xfe, 0x48, 0x29, 0x81, 0xef, 0x72, 0x1f, 0xf0, 0xc3, 0x4f, + 0xb8, 0x8a, 0xcd, 0xae, 0x2f, 0xa0, 0xc1, 0x80, 0x1a, 0xd1, 0xe9, 0x67, 0x56, 0x25, + 0x66, 0xf7, 0xea, 0x6c, 0x65, 0x67, 0xfe, 0x06, 0x6d, 0x33, 0xd0, 0x84, 0x1b, 0x33, + 0xb5, 0x60, 0xe2, 0xf8, 0x43, 0x58, 0xd4, 0x1a, 0xfc, 0x3e, 0x43, 0x6d, 0x86, 0x8e, + 0x02, 0x1a, 0x1e, 0xde, 0xb3, 0x69, 0xa9, 0x84, 0x06, 0xa5, 0x76, 0xed, 0x48, 0x38, + 0xc7, 0x30, 0xad, 0xef, 0xd6, 0x94, 0x24, 0xc2, 0x35, 0xdb, 0x4f, 0xb1, 0xf6, 0xf6, + 0x2e, 0x9b, 0x51, 0x80, 0x5c, 0xdb, 0x43, 0xea, 0xf2, 0xa6, 0xb4, 0x5f, 0x81, 0x4d, + 0xaf, 0x53, 0x0a, 0xfb, 0xd0, 0xb3, 0x0b, 0xbb, 0xbb, 0xa9, 0x66, 0x05, 0x9a, 0x08, + 0xd3, 0x1d, 0x13, 0x7b, 0xbf, 0x5e, 0xc5, 0x80, 0x58, 0xd3, + ], + ock: [ + 0x85, 0x6e, 0x1a, 0x97, 0x09, 0xb0, 0xc4, 0x16, 0x93, 0x3f, 0x59, 0x70, 0x71, 0x5c, + 0x56, 0xe2, 0xe0, 0x5c, 0x2e, 0xa9, 0x7d, 0x81, 0x51, 0x25, 0x70, 0x14, 0x79, 0xc3, + 0x3a, 0x5d, 0x91, 0xcb, + ], + op: [ + 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, + 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, + 0x14, 0x93, 0x16, 0x36, 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, + 0xfe, 0x47, 0x9a, 0x1e, 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, + 0x92, 0x3a, 0x5d, 0x00, 0xcb, 0x52, 0xa6, 0x13, + ], + c_out: [ + 0x72, 0x36, 0xea, 0xb9, 0xf0, 0x12, 0x98, 0xc8, 0x4f, 0x38, 0x28, 0xf6, 0xac, 0x15, + 0x42, 0x76, 0xb5, 0xb7, 0x64, 0x62, 0xf5, 0x74, 0x2d, 0x69, 0xdc, 0x47, 0x7a, 0x10, + 0x5d, 0xc2, 0x71, 0x1b, 0x12, 0xe9, 0xb5, 0x82, 0x8c, 0x01, 0x76, 0xfe, 0xf4, 0x4a, + 0x54, 0x0f, 0x60, 0x95, 0x8e, 0x5a, 0x3e, 0xd6, 0xa2, 0xcc, 0x5e, 0xdd, 0xe9, 0x13, + 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, + 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x0b, 0xb5, 0x6c, 0x49, 0xc0, 0x63, 0x2d, 0x4c, 0xc7, 0xe4, 0x85, 0x51, 0xdb, 0x46, + 0x42, 0x8f, 0x1b, 0x1a, 0x52, 0x66, 0x1e, 0x07, 0xe0, 0xc3, 0xbc, 0xc2, 0x31, 0x74, + 0xcc, 0xbb, 0xbd, 0xa1, 0xfa, 0x19, 0x24, 0xf4, 0x16, 0xcd, 0x48, 0x39, 0x0e, 0x2b, + 0x11, 0xc6, 0xe7, 0x82, 0x56, 0xd4, 0xc4, 0xc5, 0x64, 0x1a, 0xca, 0xd9, 0xa2, 0x0c, + 0x24, 0xfb, 0xe6, 0xcb, 0x4e, 0xe7, 0x81, 0x25, + ], + ovk: [ + 0x21, 0xe9, 0x1a, 0x3c, 0x4a, 0xa3, 0xf2, 0x7f, 0xa1, 0xb6, 0x33, 0x96, 0xe2, 0xb4, + 0x1d, 0xb9, 0x08, 0xfd, 0xab, 0x8b, 0x18, 0xcc, 0x73, 0x04, 0xe9, 0x4e, 0x97, 0x05, + 0x68, 0xf9, 0x42, 0x1c, + ], + default_d: [ + 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, + ], + default_pk_d: [ + 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, + 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, + 0x03, 0x8e, 0x3d, 0xb3, + ], + v: 12119135386131850622, + rseed: [ + 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, 0xb6, 0x63, 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, + 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, + 0xdf, 0xcf, 0xd5, 0xa0, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, + 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, + 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, + 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, + 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, + 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, + 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, + 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, + 0x66, 0x11, 0xcf, 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, + 0x0e, 0x39, 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, + 0x81, 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, + 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, + 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, + 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, + 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, + 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, + 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, + 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, + 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, + 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, + 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, + 0x00, 0xb9, 0xf6, 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, + 0xe0, 0xbe, 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, + 0x69, 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, + 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, + 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, + 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, + 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, + 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, + 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, + 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, + 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, + 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, + 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, + 0x97, 0x49, 0xcc, 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, + 0x39, 0x95, 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, + 0x86, 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, + ], + cv_net: [ + 0xca, 0xf6, 0x40, 0x8d, 0xef, 0x1f, 0x0f, 0x2b, 0xaa, 0x17, 0xb1, 0x30, 0xc3, 0xae, + 0x72, 0x95, 0x89, 0xbe, 0x69, 0xd8, 0x28, 0xbe, 0x54, 0x30, 0x69, 0x16, 0x41, 0x3c, + 0xd2, 0x50, 0x21, 0x17, + ], + rho: [ + 0x8d, 0x67, 0xe3, 0xba, 0x4d, 0xbc, 0x9d, 0xa5, 0xe8, 0x38, 0x23, 0xa1, 0x23, 0x11, + 0x63, 0x96, 0x51, 0xa4, 0xff, 0xa9, 0x5f, 0x27, 0xc1, 0x83, 0x0d, 0x91, 0xd8, 0xb7, + 0x3c, 0xfb, 0xf1, 0x31, + ], + cmx: [ + 0xea, 0x7c, 0x13, 0xf7, 0xe1, 0x20, 0x5e, 0x78, 0xc8, 0xce, 0x4e, 0xe4, 0xfd, 0xcd, + 0xb7, 0xee, 0x76, 0x92, 0x8d, 0xdf, 0x6d, 0xbe, 0x1b, 0x2d, 0x6f, 0x69, 0x81, 0xb7, + 0xc9, 0x65, 0x79, 0x10, + ], + esk: [ + 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, 0x73, 0xe9, 0x05, 0x99, + 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, 0x89, 0xcc, 0x63, 0x00, + 0x06, 0x15, 0xb2, 0x0d, + ], + ephemeral_key: [ + 0x89, 0xfd, 0x2c, 0xf3, 0x79, 0x56, 0xba, 0xaf, 0x11, 0x27, 0xbb, 0x0e, 0x33, 0x40, + 0x01, 0x09, 0xdb, 0x03, 0x50, 0xf4, 0xab, 0xb7, 0xd6, 0xd8, 0x1f, 0xa5, 0x84, 0x8e, + 0x1b, 0xb1, 0x69, 0x26, + ], + shared_secret: [ + 0xdb, 0xa6, 0x37, 0x94, 0xb6, 0x7c, 0x49, 0x6d, 0x01, 0x1c, 0xfb, 0x6b, 0xba, 0x29, + 0x7c, 0xa5, 0x7d, 0x18, 0xc7, 0xa9, 0xad, 0xdf, 0xfb, 0xc8, 0x37, 0x17, 0x6a, 0xcf, + 0x3a, 0x30, 0x1e, 0x23, + ], + k_enc: [ + 0x80, 0xe7, 0x52, 0x2c, 0xb0, 0x32, 0x51, 0xc8, 0x55, 0x34, 0x1f, 0x06, 0xf9, 0x41, + 0x33, 0x41, 0xe1, 0x6e, 0x83, 0xb4, 0x89, 0xe1, 0x5a, 0x0a, 0x00, 0x65, 0xc3, 0x3b, + 0xf3, 0x81, 0x58, 0xc4, + ], + p_enc: [ + 0x03, 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, 0x7e, 0x65, + 0x41, 0x7b, 0x6c, 0xd1, 0x2f, 0xa8, 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, 0xb6, 0x63, + 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, + 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, 0xdf, 0xcf, 0xd5, 0xa0, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, + 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, + 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, + 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, + 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, + 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, + 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, + 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, + 0x66, 0x11, 0xcf, 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, + 0x0e, 0x39, 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, + 0x81, 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, + 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, + 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, + 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, + 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, + 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, + 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, + 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, + 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, + 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, + 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, + 0x00, 0xb9, 0xf6, 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, + 0xe0, 0xbe, 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, + 0x69, 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, + 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, + 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, + 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, + 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, + 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, + 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, + 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, + 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, + 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, + 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, + 0x97, 0x49, 0xcc, 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, + 0x39, 0x95, 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, + 0x86, 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, + ], + c_enc: [ + 0x3e, 0x4e, 0x9b, 0x18, 0x56, 0xe7, 0xbf, 0xba, 0x7a, 0xbb, 0xc9, 0x4a, 0x72, 0xb4, + 0xab, 0xb1, 0xd8, 0x46, 0x26, 0x79, 0x30, 0x77, 0xe8, 0x37, 0xda, 0xf3, 0x3f, 0xff, + 0xa2, 0x7c, 0x7a, 0x33, 0x97, 0x8a, 0x54, 0x32, 0x51, 0x0d, 0x99, 0x3c, 0x7d, 0x92, + 0x24, 0xc0, 0x97, 0xac, 0xc5, 0x25, 0x88, 0x1c, 0x76, 0x08, 0xa4, 0x13, 0xfa, 0x5f, + 0x49, 0xaf, 0xc6, 0x58, 0x93, 0x94, 0xab, 0x86, 0x59, 0x0c, 0x43, 0x78, 0x5a, 0x58, + 0x0b, 0xd2, 0x86, 0x0b, 0xe3, 0xb8, 0x07, 0x99, 0xc1, 0x47, 0xf4, 0xe6, 0xc7, 0x50, + 0x31, 0x36, 0x76, 0x9a, 0xe4, 0xc6, 0x2c, 0xd9, 0x16, 0x9d, 0xd3, 0x66, 0xb8, 0x99, + 0xa5, 0x44, 0x8c, 0xdb, 0xc4, 0x0c, 0x8d, 0x89, 0x60, 0x38, 0x6c, 0x0f, 0x0e, 0x3e, + 0x74, 0x03, 0xd2, 0x6e, 0x66, 0xa5, 0x99, 0x40, 0xe7, 0x6a, 0xc7, 0x9d, 0xd1, 0xea, + 0xea, 0x55, 0xd0, 0xc0, 0x9f, 0x3b, 0xf6, 0xd9, 0xdc, 0xea, 0xe1, 0xee, 0x87, 0x41, + 0x38, 0x39, 0x1a, 0x0c, 0x93, 0x3e, 0x7b, 0x72, 0x75, 0xd7, 0x3b, 0x8e, 0xf4, 0x9b, + 0x8c, 0x39, 0x5c, 0x87, 0xfd, 0x32, 0x09, 0xe1, 0xf5, 0xa9, 0xc5, 0x52, 0xe6, 0x11, + 0x2b, 0xd9, 0xf3, 0xea, 0xb6, 0xbd, 0x4f, 0x26, 0xab, 0xa6, 0x4d, 0xb8, 0x27, 0xa7, + 0x1b, 0x86, 0x53, 0x9c, 0xf9, 0x72, 0x96, 0xfe, 0xca, 0x46, 0x27, 0x3e, 0xf4, 0x56, + 0xfe, 0x16, 0x0b, 0x31, 0xc7, 0x72, 0xcf, 0xf6, 0x82, 0xa6, 0xed, 0x06, 0x10, 0x93, + 0x14, 0x6e, 0xa6, 0x57, 0xf4, 0x61, 0xb5, 0x6f, 0xb2, 0x3c, 0x20, 0x64, 0xd8, 0x98, + 0xec, 0x25, 0x70, 0x34, 0x3c, 0x56, 0x6a, 0xdc, 0x1f, 0x2d, 0x1d, 0x86, 0x48, 0x41, + 0x42, 0x2e, 0x96, 0x4a, 0x4a, 0xb8, 0x3c, 0x18, 0x95, 0x0f, 0x82, 0xfa, 0x97, 0x4c, + 0x83, 0x3c, 0xf7, 0x62, 0x3d, 0xa9, 0xb8, 0xbe, 0xec, 0x7a, 0x1e, 0xbf, 0x5c, 0xeb, + 0x22, 0x25, 0xc1, 0xf2, 0xda, 0x30, 0xd0, 0x47, 0x9d, 0xbb, 0xa1, 0x68, 0x1f, 0x6e, + 0x75, 0xf2, 0xfa, 0xce, 0x30, 0x70, 0xe7, 0xa8, 0x13, 0xaa, 0x88, 0x34, 0x72, 0xae, + 0x47, 0x7c, 0x47, 0xbc, 0x2e, 0xc2, 0xe5, 0xc6, 0xcd, 0x85, 0x5d, 0x12, 0x25, 0x7c, + 0x54, 0xbd, 0xea, 0xdc, 0x44, 0x3b, 0xe7, 0xd6, 0xb6, 0x7d, 0x11, 0xad, 0xd4, 0x1f, + 0x49, 0xa9, 0xb4, 0xd8, 0x13, 0x8f, 0xd8, 0x7c, 0x0d, 0xee, 0x7f, 0x5f, 0xae, 0x0c, + 0xd8, 0x83, 0x7c, 0x39, 0xdb, 0x19, 0x9e, 0xea, 0x34, 0x48, 0xa9, 0x41, 0x05, 0x1f, + 0x78, 0x5c, 0x1f, 0x8a, 0xd0, 0xb2, 0x65, 0xd8, 0x78, 0x7c, 0x70, 0x1d, 0xe0, 0x5b, + 0xf1, 0xc6, 0x6a, 0x3d, 0x65, 0x94, 0xf5, 0x22, 0x19, 0xcc, 0xb3, 0x1e, 0x05, 0x03, + 0x9c, 0x83, 0x02, 0x2a, 0xa8, 0x61, 0x21, 0x1c, 0x50, 0xc2, 0xf0, 0xcf, 0xb1, 0xbe, + 0x94, 0x45, 0xcd, 0xb9, 0x6d, 0xf0, 0x0a, 0x16, 0x67, 0x57, 0x1a, 0x68, 0xb7, 0xf2, + 0x19, 0x45, 0xb1, 0xfa, 0xef, 0x4e, 0xbc, 0xcf, 0xa1, 0xc5, 0x83, 0xc4, 0x66, 0xb0, + 0xef, 0x58, 0x8a, 0xcd, 0xfd, 0x47, 0x8c, 0x7f, 0x21, 0x22, 0x61, 0x12, 0x8a, 0xf4, + 0x25, 0xa2, 0xe0, 0xa3, 0xa2, 0x7e, 0x17, 0x48, 0x7f, 0xff, 0x08, 0xb9, 0xfb, 0x80, + 0xd8, 0xaa, 0x71, 0x8f, 0xe2, 0x67, 0xda, 0xbc, 0x70, 0xd3, 0x6b, 0x8f, 0x62, 0xe0, + 0xe9, 0x04, 0x33, 0x47, 0x01, 0x4e, 0x02, 0xa2, 0x7a, 0x85, 0x79, 0x97, 0xe1, 0xcf, + 0x3e, 0x72, 0x33, 0xe2, 0x51, 0x3f, 0x83, 0x2e, 0x60, 0x35, 0x91, 0x68, 0xe1, 0x73, + 0xfc, 0x03, 0x07, 0x9e, 0x99, 0x83, 0xa1, 0x34, 0x1d, 0x68, 0xbb, 0x3a, 0x3c, 0x53, + 0x3a, 0x31, 0x84, 0xf4, 0xaa, 0x41, 0x75, 0xa9, 0xfe, 0xc1, 0xf0, 0x1f, 0xe3, 0xf8, + 0xb4, 0xfa, 0xeb, 0xed, 0x30, 0xb7, 0xe7, 0x18, 0x0e, 0x7e, 0xd7, 0xfc, 0x80, 0x7d, + 0x51, 0x0c, 0x06, 0x01, 0x42, 0x8d, 0xd6, 0x96, 0x41, 0xa3, 0x07, 0x29, 0xcd, 0x64, + 0x45, 0xde, 0x66, 0x0f, 0xb1, 0xbe, 0x2f, 0xb9, 0x6e, 0x56, 0xbb, 0x67, 0xb6, 0xef, + 0x88, 0xe0, 0x7d, 0x14, 0xae, 0xda, 0xa0, 0xbd, 0x23, 0x27, 0xe9, 0xd5, 0x27, 0xb7, + 0xe3, 0x30, 0x07, 0xf8, 0xca, 0xb5, 0x10, 0xad, 0xc2, 0x53, 0xca, 0xe6, 0x68, 0x7f, + 0xfd, 0xc9, 0x60, 0x40, 0x30, 0x40, 0x15, 0x9a, 0x7e, 0x98, 0xda, 0xa8, 0xa7, 0x7b, + 0x2a, 0x3f, 0xdf, 0x4f, 0x79, 0xd5, 0xbd, 0xbe, 0x9e, 0x2b, + ], + ock: [ + 0xe6, 0xb7, 0x05, 0x50, 0xe1, 0xd7, 0xa2, 0xbe, 0x73, 0x04, 0x39, 0x64, 0x41, 0xec, + 0x6a, 0xc0, 0x47, 0x45, 0x99, 0xf9, 0xea, 0xd7, 0x55, 0xc2, 0xcf, 0x27, 0x6b, 0x87, + 0x50, 0xc5, 0xcf, 0x2d, + ], + op: [ + 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, + 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, + 0x03, 0x8e, 0x3d, 0xb3, 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, + 0x73, 0xe9, 0x05, 0x99, 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, + 0x89, 0xcc, 0x63, 0x00, 0x06, 0x15, 0xb2, 0x0d, + ], + c_out: [ + 0x02, 0xb1, 0x37, 0x3e, 0xb1, 0x89, 0x56, 0x32, 0x2b, 0x47, 0xa1, 0x70, 0x0d, 0xb7, + 0x43, 0x31, 0x6e, 0xde, 0x46, 0x44, 0xd6, 0x59, 0x3c, 0xd7, 0x94, 0x22, 0xd7, 0x51, + 0x3d, 0x1b, 0x80, 0xe6, 0x85, 0x05, 0xdf, 0xe9, 0xd6, 0x86, 0x2e, 0x79, 0x4e, 0x30, + 0x28, 0x8b, 0xae, 0xa8, 0xb0, 0xbc, 0xb3, 0x8b, 0x35, 0x49, 0x77, 0xaa, 0xee, 0x57, + 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, + 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xeb, 0xd4, 0x80, 0x6d, 0x81, 0x25, 0x49, 0x89, 0xfa, 0xdb, 0xa8, 0xcd, 0x58, 0x96, + 0x7d, 0x6f, 0xd8, 0x73, 0x83, 0xbc, 0x09, 0x38, 0x63, 0xd5, 0xab, 0xfc, 0xdd, 0xd3, + 0x8f, 0x15, 0x39, 0xfa, 0xb7, 0xe5, 0xd4, 0xf0, 0x61, 0x91, 0x67, 0xb8, 0xd4, 0x82, + 0xcb, 0x54, 0x8c, 0xb5, 0x59, 0x83, 0x49, 0x6f, 0x77, 0xd3, 0xdc, 0xaf, 0xf5, 0x6e, + 0x32, 0x41, 0x0b, 0xfe, 0xc1, 0xf2, 0x68, 0x11, + ], + ovk: [ + 0xb2, 0x5f, 0x30, 0x3f, 0x58, 0x15, 0xc4, 0x53, 0x31, 0x24, 0xac, 0xf9, 0xd1, 0x89, + 0x40, 0xe7, 0x75, 0x22, 0xac, 0x5d, 0xc4, 0xb9, 0x57, 0x0a, 0xae, 0x8f, 0x47, 0xb7, + 0xf5, 0x7f, 0xd8, 0x76, + ], + default_d: [ + 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, + ], + default_pk_d: [ + 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, + 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, + 0x67, 0xa8, 0x60, 0x9e, + ], + v: 9624581763228770449, + rseed: [ + 0x4a, 0x95, 0xb2, 0x05, 0x52, 0x6c, 0xfc, 0xb4, 0xc4, 0xe1, 0xcc, 0x95, 0x51, 0x75, + 0xb3, 0xe8, 0xde, 0x1f, 0x5d, 0x81, 0xb1, 0x86, 0x69, 0x69, 0x23, 0x50, 0xaa, 0xa1, + 0xa1, 0xd7, 0x97, 0x61, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x75, 0x82, 0xe5, 0x4d, 0x7a, 0x5b, 0x57, 0xa6, 0x83, 0xb3, 0x2f, 0xb1, 0x09, + 0x80, 0x62, 0xda, 0xd7, 0xb0, 0xc2, 0xeb, 0x51, 0x8f, 0x68, 0x62, 0xe8, 0x3d, 0xb2, + 0x5e, 0x3d, 0xba, 0xf7, 0xae, 0xd5, 0x04, 0xde, 0x93, 0x2a, 0xcb, 0x99, 0xd7, 0x35, + 0x99, 0x2c, 0xe6, 0x2b, 0xae, 0x9e, 0xf8, 0x93, 0xff, 0x6a, 0xcc, 0x0f, 0xfc, 0xf8, + 0xe3, 0x48, 0x3e, 0x14, 0x6b, 0x9d, 0x49, 0xdd, 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, + 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, + 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, 0xc0, 0x09, 0xa5, 0x6d, + 0x4d, 0x95, 0xd1, 0xe8, 0x1d, 0x3b, 0x3e, 0xbc, 0xa7, 0xe5, 0x4c, 0xc1, 0xa1, 0x2d, + 0x12, 0x7b, 0x57, 0xc8, 0x13, 0x89, 0x76, 0xe7, 0x91, 0x01, 0x3b, 0x01, 0x5f, 0x06, + 0xa6, 0x24, 0xf5, 0x21, 0xb6, 0xee, 0x04, 0xec, 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, + 0x1a, 0x33, 0x62, 0x03, 0x59, 0x40, 0x94, 0xf8, 0x28, 0x33, 0xd7, 0x44, 0x5f, 0xe2, + 0xd0, 0x91, 0x30, 0xf6, 0x35, 0x11, 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, + 0xf4, 0x59, 0x9f, 0x5a, 0xa5, 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, 0x7e, + 0xef, 0xde, 0x89, 0xbe, 0x63, 0xf3, 0xf7, 0xc0, 0xd2, 0x32, 0x48, 0x47, 0xcc, 0xe1, + 0x40, 0x5d, 0xef, 0x7c, 0x46, 0x9b, 0x0e, 0x27, 0x24, 0x94, 0xe5, 0xdf, 0x54, 0xf5, + 0x68, 0x65, 0x6c, 0xb9, 0xc8, 0x81, 0x8d, 0x92, 0xb7, 0x2b, 0x8b, 0xc3, 0x4d, 0xb7, + 0xbb, 0x31, 0x12, 0x48, 0x7e, 0x74, 0x6e, 0xef, 0xe4, 0xe8, 0x08, 0xbb, 0xb2, 0x87, + 0xd9, 0x9b, 0xf0, 0x7d, 0x00, 0xda, 0xbe, 0xde, 0xdc, 0x5e, 0x5f, 0x07, 0x4f, 0xfe, + 0xae, 0x0c, 0xba, 0x7d, 0xa3, 0xa5, 0x16, 0xc1, 0x73, 0xbe, 0x1c, 0x51, 0x33, 0x23, + 0xe1, 0x19, 0xf6, 0x35, 0xe8, 0x20, 0x9a, 0x07, 0x4b, 0x21, 0x6b, 0x70, 0x23, 0xfa, + 0xdc, 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, 0x72, 0x6d, + 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, 0x9c, 0xc1, 0x4a, + 0xfe, 0x10, 0x10, 0x26, 0x21, 0xa9, 0xc9, 0xac, 0xcb, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, + 0xa8, 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, + 0x7c, 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, + 0x6a, 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, 0x1e, 0x43, 0xe3, 0x8c, 0xe1, 0x29, 0xfd, + 0xad, 0xb7, 0x59, 0xed, 0xdf, 0xa0, 0x8f, 0x00, 0xfc, 0x8e, 0x56, 0x7c, 0xef, 0x93, + 0xc6, 0x79, 0x2d, 0x01, 0xdf, 0x05, 0xe6, 0xd5, 0x80, 0xf4, 0xd5, 0xd4, 0x8d, 0xf0, + 0x42, 0x45, 0x1a, 0x33, 0x59, 0x0d, 0x3e, 0x8c, 0xf4, 0x9b, 0x26, 0x27, 0x21, 0x8f, + 0x0c, 0x29, 0x2f, 0xa6, 0x6a, 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, 0x48, 0xe3, + 0x3a, 0x83, 0xa5, 0x62, 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, 0x23, 0x62, + 0x29, 0x87, 0x36, 0xa8, 0xb7, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, 0x64, 0xb3, + 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, 0xae, 0xc6, + 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, 0x5c, 0xb8, + 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, 0x20, 0xd4, 0x81, + 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, 0x94, 0x9c, 0x12, 0x6f, + 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, + ], + cv_net: [ + 0xd2, 0xf9, 0xad, 0xff, 0x53, 0x1b, 0x65, 0x43, 0x2b, 0xa2, 0xd7, 0xda, 0xa6, 0xd8, + 0x6e, 0x62, 0xe4, 0xed, 0xc7, 0x86, 0xd9, 0xe0, 0xb2, 0x7d, 0x26, 0x62, 0x8b, 0x79, + 0xda, 0x6b, 0x15, 0x14, + ], + rho: [ + 0x9a, 0x09, 0xe4, 0x72, 0xe8, 0xe9, 0x96, 0xfc, 0xc3, 0x0e, 0xd5, 0x23, 0x72, 0x08, + 0xdb, 0xb0, 0x01, 0x71, 0x32, 0x0e, 0x6b, 0xea, 0x43, 0x91, 0x86, 0x00, 0x9d, 0xad, + 0x21, 0x38, 0xab, 0x29, + ], + cmx: [ + 0x18, 0xfc, 0xbd, 0x40, 0xac, 0xf1, 0xa7, 0xf4, 0xd6, 0x09, 0x87, 0x9a, 0x5f, 0x5e, + 0x3b, 0x39, 0x70, 0x09, 0x4f, 0xf8, 0xbe, 0x84, 0x18, 0x60, 0x70, 0x16, 0xc6, 0xa6, + 0x97, 0xf8, 0x9c, 0x20, + ], + esk: [ + 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, 0x6b, 0x8d, 0x6f, 0xea, + 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, 0xd5, 0xcb, 0xab, 0x1a, + 0xcc, 0xd5, 0x4e, 0x3a, + ], + ephemeral_key: [ + 0xcf, 0xe0, 0x3e, 0xb2, 0xd3, 0x36, 0x76, 0xb7, 0x73, 0x83, 0x7d, 0xa8, 0x39, 0x17, + 0x2d, 0x33, 0x33, 0x31, 0x88, 0xc9, 0xdf, 0xef, 0x05, 0xc8, 0x32, 0xa2, 0x5c, 0x86, + 0xd3, 0xbf, 0x0e, 0x8f, + ], + shared_secret: [ + 0xd2, 0xc2, 0x88, 0x9e, 0x03, 0x7e, 0xac, 0x60, 0x60, 0x58, 0x68, 0x2b, 0xaa, 0x38, + 0x86, 0xa4, 0xc2, 0xdd, 0x44, 0xea, 0xdf, 0x8b, 0x2c, 0xe4, 0x39, 0x95, 0xde, 0xd7, + 0x61, 0xfd, 0xaf, 0xb5, + ], + k_enc: [ + 0xfe, 0xe3, 0xe3, 0xb5, 0xfd, 0x6c, 0xd8, 0x54, 0x44, 0x2b, 0x2a, 0xc2, 0x97, 0x70, + 0xfb, 0x0e, 0x39, 0x32, 0xf4, 0x71, 0x52, 0x43, 0x26, 0xda, 0x4a, 0x57, 0xc2, 0x56, + 0x18, 0x06, 0x9e, 0x99, + ], + p_enc: [ + 0x03, 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, 0x91, 0x20, + 0xf4, 0xd4, 0x1e, 0x62, 0x91, 0x85, 0x4a, 0x95, 0xb2, 0x05, 0x52, 0x6c, 0xfc, 0xb4, + 0xc4, 0xe1, 0xcc, 0x95, 0x51, 0x75, 0xb3, 0xe8, 0xde, 0x1f, 0x5d, 0x81, 0xb1, 0x86, + 0x69, 0x69, 0x23, 0x50, 0xaa, 0xa1, 0xa1, 0xd7, 0x97, 0x61, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x75, 0x82, 0xe5, 0x4d, 0x7a, 0x5b, 0x57, 0xa6, 0x83, 0xb3, 0x2f, 0xb1, 0x09, + 0x80, 0x62, 0xda, 0xd7, 0xb0, 0xc2, 0xeb, 0x51, 0x8f, 0x68, 0x62, 0xe8, 0x3d, 0xb2, + 0x5e, 0x3d, 0xba, 0xf7, 0xae, 0xd5, 0x04, 0xde, 0x93, 0x2a, 0xcb, 0x99, 0xd7, 0x35, + 0x99, 0x2c, 0xe6, 0x2b, 0xae, 0x9e, 0xf8, 0x93, 0xff, 0x6a, 0xcc, 0x0f, 0xfc, 0xf8, + 0xe3, 0x48, 0x3e, 0x14, 0x6b, 0x9d, 0x49, 0xdd, 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, + 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, + 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, 0xc0, 0x09, 0xa5, 0x6d, + 0x4d, 0x95, 0xd1, 0xe8, 0x1d, 0x3b, 0x3e, 0xbc, 0xa7, 0xe5, 0x4c, 0xc1, 0xa1, 0x2d, + 0x12, 0x7b, 0x57, 0xc8, 0x13, 0x89, 0x76, 0xe7, 0x91, 0x01, 0x3b, 0x01, 0x5f, 0x06, + 0xa6, 0x24, 0xf5, 0x21, 0xb6, 0xee, 0x04, 0xec, 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, + 0x1a, 0x33, 0x62, 0x03, 0x59, 0x40, 0x94, 0xf8, 0x28, 0x33, 0xd7, 0x44, 0x5f, 0xe2, + 0xd0, 0x91, 0x30, 0xf6, 0x35, 0x11, 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, + 0xf4, 0x59, 0x9f, 0x5a, 0xa5, 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, 0x7e, + 0xef, 0xde, 0x89, 0xbe, 0x63, 0xf3, 0xf7, 0xc0, 0xd2, 0x32, 0x48, 0x47, 0xcc, 0xe1, + 0x40, 0x5d, 0xef, 0x7c, 0x46, 0x9b, 0x0e, 0x27, 0x24, 0x94, 0xe5, 0xdf, 0x54, 0xf5, + 0x68, 0x65, 0x6c, 0xb9, 0xc8, 0x81, 0x8d, 0x92, 0xb7, 0x2b, 0x8b, 0xc3, 0x4d, 0xb7, + 0xbb, 0x31, 0x12, 0x48, 0x7e, 0x74, 0x6e, 0xef, 0xe4, 0xe8, 0x08, 0xbb, 0xb2, 0x87, + 0xd9, 0x9b, 0xf0, 0x7d, 0x00, 0xda, 0xbe, 0xde, 0xdc, 0x5e, 0x5f, 0x07, 0x4f, 0xfe, + 0xae, 0x0c, 0xba, 0x7d, 0xa3, 0xa5, 0x16, 0xc1, 0x73, 0xbe, 0x1c, 0x51, 0x33, 0x23, + 0xe1, 0x19, 0xf6, 0x35, 0xe8, 0x20, 0x9a, 0x07, 0x4b, 0x21, 0x6b, 0x70, 0x23, 0xfa, + 0xdc, 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, 0x72, 0x6d, + 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, 0x9c, 0xc1, 0x4a, + 0xfe, 0x10, 0x10, 0x26, 0x21, 0xa9, 0xc9, 0xac, 0xcb, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, + 0xa8, 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, + 0x7c, 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, + 0x6a, 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, 0x1e, 0x43, 0xe3, 0x8c, 0xe1, 0x29, 0xfd, + 0xad, 0xb7, 0x59, 0xed, 0xdf, 0xa0, 0x8f, 0x00, 0xfc, 0x8e, 0x56, 0x7c, 0xef, 0x93, + 0xc6, 0x79, 0x2d, 0x01, 0xdf, 0x05, 0xe6, 0xd5, 0x80, 0xf4, 0xd5, 0xd4, 0x8d, 0xf0, + 0x42, 0x45, 0x1a, 0x33, 0x59, 0x0d, 0x3e, 0x8c, 0xf4, 0x9b, 0x26, 0x27, 0x21, 0x8f, + 0x0c, 0x29, 0x2f, 0xa6, 0x6a, 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, 0x48, 0xe3, + 0x3a, 0x83, 0xa5, 0x62, 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, 0x23, 0x62, + 0x29, 0x87, 0x36, 0xa8, 0xb7, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, 0x64, 0xb3, + 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, 0xae, 0xc6, + 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, 0x5c, 0xb8, + 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, 0x20, 0xd4, 0x81, + 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, 0x94, 0x9c, 0x12, 0x6f, + 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, + ], + c_enc: [ + 0xbf, 0x1d, 0xff, 0xd3, 0x37, 0x0c, 0x67, 0x56, 0x69, 0xcc, 0x9a, 0xe1, 0xd0, 0x30, + 0x2d, 0x7f, 0x90, 0x6d, 0x25, 0x23, 0x09, 0x3c, 0x24, 0xf4, 0x25, 0x7a, 0x83, 0xbc, + 0x4f, 0x36, 0x62, 0x3a, 0x08, 0x2c, 0xe6, 0xeb, 0x45, 0x21, 0x95, 0x71, 0x91, 0xd5, + 0x7e, 0x14, 0x11, 0xed, 0xe7, 0x1d, 0x44, 0xb5, 0x6c, 0x57, 0x53, 0x14, 0xfa, 0x95, + 0x27, 0xae, 0xc5, 0xaf, 0xd5, 0x06, 0xc2, 0x42, 0xac, 0xdc, 0xa9, 0xd3, 0xc9, 0xa5, + 0x53, 0xcf, 0xef, 0x49, 0x9e, 0x87, 0x30, 0xf7, 0x55, 0x6a, 0xd0, 0xba, 0xc0, 0xff, + 0xb6, 0xd0, 0x8e, 0x7c, 0xac, 0x9b, 0x6e, 0x71, 0xf6, 0x6d, 0x19, 0x17, 0xfc, 0x52, + 0xdc, 0x91, 0x33, 0xae, 0x12, 0x4a, 0x40, 0x9d, 0xda, 0x38, 0x75, 0xcb, 0xae, 0xb5, + 0xf2, 0x96, 0xd5, 0x3a, 0x9f, 0x17, 0xb0, 0x28, 0x7d, 0xaa, 0x31, 0xd6, 0x89, 0xa7, + 0xde, 0xaf, 0x05, 0x2d, 0xab, 0xa6, 0xd0, 0xe8, 0x87, 0xcd, 0x1a, 0x3a, 0x6d, 0xd4, + 0x67, 0x17, 0xe5, 0xda, 0x63, 0xe5, 0x59, 0x67, 0x95, 0xf8, 0xe1, 0xdb, 0x6a, 0x45, + 0x8e, 0xab, 0x64, 0xa7, 0xd0, 0x68, 0xe1, 0x67, 0xef, 0xf1, 0x9b, 0xf2, 0x3b, 0x1b, + 0xe7, 0x72, 0x87, 0xf9, 0x0e, 0xe5, 0xcd, 0x34, 0x13, 0x85, 0xad, 0xc9, 0xda, 0xb7, + 0xd0, 0xef, 0x05, 0xc3, 0x61, 0x7d, 0x9f, 0x4b, 0xd7, 0xa2, 0x78, 0xb0, 0xa7, 0xc7, + 0x57, 0x73, 0x57, 0x89, 0xd3, 0xff, 0x0e, 0x91, 0xfb, 0xe1, 0x31, 0x78, 0xae, 0x76, + 0xeb, 0x91, 0xd8, 0x35, 0xd0, 0x65, 0xd7, 0xb3, 0x83, 0x18, 0xf5, 0x64, 0xb7, 0x69, + 0xe8, 0xd9, 0x68, 0x97, 0xb7, 0xab, 0xc8, 0xaa, 0xf3, 0x41, 0x7a, 0x49, 0xe6, 0x8f, + 0x35, 0xcd, 0x7f, 0x45, 0x1d, 0x99, 0x4a, 0xd8, 0x7d, 0xd4, 0xbc, 0x55, 0xc4, 0x5d, + 0xb3, 0x21, 0xf8, 0x49, 0xce, 0xb9, 0x54, 0x30, 0xe8, 0xe6, 0xe2, 0xe4, 0x8c, 0x3b, + 0xbf, 0x8f, 0x7a, 0x1a, 0xaf, 0x1c, 0x52, 0xf2, 0x3f, 0xca, 0x52, 0xca, 0xcc, 0xfb, + 0x26, 0xa4, 0x58, 0x40, 0x42, 0x73, 0xe5, 0x69, 0x7f, 0xcc, 0xf5, 0xa5, 0x9a, 0x61, + 0xb3, 0xea, 0xd6, 0x6a, 0x03, 0xfd, 0xaf, 0x31, 0xb2, 0xeb, 0x2d, 0x32, 0xa9, 0x02, + 0x40, 0x50, 0x98, 0xa7, 0x67, 0xbb, 0x6d, 0x30, 0xbf, 0x1b, 0x48, 0x7d, 0xcc, 0x5d, + 0x38, 0xfb, 0x9d, 0x54, 0x9c, 0xc5, 0x21, 0x30, 0x75, 0xe1, 0x2d, 0x04, 0x34, 0x71, + 0xc3, 0xab, 0x03, 0x5b, 0x1d, 0xff, 0xd6, 0xe8, 0xaa, 0x61, 0x99, 0xc8, 0x0c, 0xe9, + 0x9d, 0x66, 0xa5, 0x07, 0x3b, 0x91, 0x73, 0xc3, 0x25, 0x4b, 0xd2, 0x4a, 0xf5, 0x9c, + 0x96, 0x27, 0xb9, 0x8c, 0xdb, 0x06, 0x0f, 0x07, 0x34, 0x04, 0xb4, 0xfb, 0xf6, 0x5b, + 0xdd, 0x1a, 0xcb, 0x1c, 0xb6, 0xc0, 0xa4, 0xc1, 0x8d, 0x55, 0x4f, 0x7a, 0x4c, 0x5a, + 0x1a, 0x93, 0x94, 0xb3, 0x85, 0xe8, 0xdf, 0xf4, 0xbb, 0xd1, 0x4a, 0x1a, 0x20, 0x1f, + 0xa8, 0x33, 0x20, 0x37, 0x34, 0x5a, 0x62, 0x29, 0x3d, 0x8c, 0xfc, 0x5c, 0xd9, 0x4c, + 0x0c, 0x21, 0xa9, 0xc8, 0x06, 0x52, 0x1c, 0xe2, 0x28, 0x01, 0xdb, 0xa5, 0xb5, 0xa3, + 0xb3, 0xf6, 0x9a, 0xbd, 0x01, 0xd4, 0x4c, 0xcb, 0xc2, 0x3b, 0x06, 0x3f, 0x41, 0x2c, + 0xa1, 0xa9, 0xd4, 0xfd, 0x17, 0xda, 0xbe, 0x54, 0x9f, 0x8b, 0x89, 0x11, 0x21, 0xe0, + 0x79, 0xb8, 0x2b, 0x5e, 0x6e, 0xa7, 0x43, 0xe6, 0x37, 0xb9, 0xd2, 0xd1, 0x1e, 0x86, + 0xa0, 0xc2, 0x76, 0x9a, 0xe3, 0xdc, 0xde, 0xcd, 0x74, 0xcb, 0xec, 0xe5, 0x6e, 0x52, + 0x74, 0xca, 0x1f, 0x23, 0x25, 0xc3, 0x93, 0xe5, 0xef, 0x18, 0xef, 0x99, 0x03, 0x04, + 0x22, 0x39, 0xe2, 0x5c, 0x2f, 0x10, 0x62, 0x21, 0x2a, 0x04, 0x67, 0x0d, 0xd3, 0xea, + 0xd5, 0xa9, 0x55, 0xf7, 0x8b, 0x6a, 0x00, 0xdd, 0x9f, 0x12, 0xc1, 0xdc, 0x0b, 0x3a, + 0x58, 0xaf, 0x82, 0x3b, 0x78, 0x73, 0x22, 0xaa, 0x8f, 0x2e, 0xde, 0xc8, 0x48, 0x41, + 0x99, 0x15, 0xb0, 0x6b, 0x60, 0xd9, 0x5a, 0xf2, 0xd4, 0x41, 0xba, 0xd4, 0x35, 0x7b, + 0xed, 0x8a, 0xdb, 0xf0, 0xd0, 0x5f, 0xc6, 0x37, 0xcb, 0xaa, 0xff, 0x15, 0x58, 0x26, + 0x8c, 0x9c, 0x92, 0x41, 0x9e, 0x97, 0x51, 0xc4, 0x18, 0xa6, 0x7a, 0xe3, 0x86, 0x29, + 0xf0, 0xcd, 0xf7, 0x7d, 0xaa, 0xd6, 0xf0, 0xac, 0xc9, 0x32, 0x98, 0x51, 0xcd, 0x17, + 0xda, 0x6a, 0xd7, 0xbb, 0x73, 0xf3, 0x5d, 0x23, 0xba, 0xc7, + ], + ock: [ + 0xeb, 0x3e, 0xd9, 0xfc, 0xb3, 0xaa, 0x91, 0xc4, 0xf5, 0xec, 0xfd, 0x43, 0xdb, 0xda, + 0x40, 0x33, 0x06, 0x93, 0xc3, 0xa6, 0x56, 0x75, 0x45, 0xfd, 0x23, 0x6a, 0xf1, 0x90, + 0x8e, 0x29, 0x42, 0xa3, + ], + op: [ + 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, + 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, + 0x67, 0xa8, 0x60, 0x9e, 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, + 0x6b, 0x8d, 0x6f, 0xea, 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, + 0xd5, 0xcb, 0xab, 0x1a, 0xcc, 0xd5, 0x4e, 0x3a, + ], + c_out: [ + 0x60, 0xf3, 0xe8, 0x94, 0xe3, 0x86, 0x4e, 0xfb, 0x48, 0xcc, 0xae, 0x50, 0xe1, 0x0d, + 0xa7, 0x73, 0xdc, 0xcf, 0x85, 0x62, 0x45, 0x5d, 0x1b, 0x73, 0x1a, 0xad, 0x44, 0xe1, + 0x5e, 0x3e, 0x40, 0x18, 0x31, 0xce, 0x6f, 0x92, 0xf4, 0x53, 0x2d, 0x90, 0x83, 0x92, + 0x59, 0xce, 0x9c, 0xb1, 0x44, 0x62, 0x1f, 0x12, 0x01, 0x77, 0x8f, 0x61, 0x5d, 0x09, + 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, + 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xc3, 0x7c, 0x7d, 0xbb, 0xe5, 0x51, 0xd9, 0xd3, 0xb1, 0xa4, 0x96, 0x88, 0x7d, 0xb2, + 0xe8, 0x42, 0xdc, 0x94, 0x52, 0x01, 0xf4, 0x08, 0x10, 0xdf, 0x4d, 0x76, 0x39, 0x32, + 0xed, 0x5c, 0x76, 0x39, 0x8b, 0x35, 0x73, 0xfe, 0x23, 0xf1, 0xe8, 0xb7, 0xe7, 0x9f, + 0x1c, 0x16, 0x95, 0xc0, 0x97, 0xc1, 0x24, 0xff, 0x1f, 0x7d, 0x6e, 0x61, 0xf2, 0xc5, + 0x8f, 0x14, 0x39, 0xa7, 0x56, 0x96, 0x9d, 0x19, + ], + ovk: [ + 0xa6, 0x68, 0xa0, 0xae, 0x2b, 0xb9, 0x34, 0xc8, 0x2c, 0x41, 0x42, 0xda, 0x69, 0xd1, + 0x2c, 0xa7, 0xde, 0x9a, 0x7d, 0xf7, 0x06, 0x40, 0x0e, 0xc7, 0x98, 0x78, 0xd8, 0x68, + 0xe1, 0x7e, 0x8f, 0x71, + ], + default_d: [ + 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, + ], + default_pk_d: [ + 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, + 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, + 0x6b, 0x80, 0xbb, 0xb7, + ], + v: 11137853725062838288, + rseed: [ + 0x25, 0x37, 0xb8, 0x71, 0xb4, 0x29, 0x4a, 0x65, 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, + 0xd9, 0xdc, 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, + 0xc4, 0x8f, 0x6e, 0xe9, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, 0x90, 0x8c, 0xda, + 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, 0x9f, 0x9b, 0xd7, 0xec, + 0x42, 0x67, 0xed, 0x8e, 0x96, 0x93, 0x0e, 0x10, 0x84, 0x78, 0x3c, 0x37, 0xd6, 0xf9, + 0xdd, 0x15, 0xfd, 0x29, 0xf4, 0xcc, 0x47, 0x7e, 0x66, 0xf1, 0x30, 0xd6, 0x30, 0x43, + 0x0d, 0xcc, 0x01, 0x04, 0x89, 0x9b, 0x4f, 0x9f, 0x46, 0xeb, 0x09, 0x0e, 0xf7, 0xfc, + 0x90, 0xb4, 0x79, 0xab, 0xf6, 0x1f, 0x93, 0x95, 0x5e, 0xe0, 0x0e, 0x6a, 0x18, 0x48, + 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, + 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, + 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, + 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, + 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, + 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, + 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, + 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, + 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, + 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, + 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, + 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, + 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, + 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, + 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, + 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, + 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, + 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, + 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, + 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, + 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, + 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, + 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, + 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, + 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, + 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, + 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, + 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, + 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, + 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, + 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x59, + ], + cv_net: [ + 0xb2, 0x7f, 0x48, 0x59, 0x15, 0x0d, 0x48, 0x45, 0xab, 0x57, 0x78, 0x82, 0x61, 0x50, + 0x0a, 0x12, 0x01, 0x2d, 0x63, 0xc0, 0x09, 0xc6, 0x77, 0x44, 0xba, 0xe0, 0xd5, 0x83, + 0x88, 0xff, 0xee, 0x2f, + ], + rho: [ + 0x54, 0x3e, 0xa7, 0x11, 0x56, 0xc9, 0xa6, 0xf8, 0x04, 0x1f, 0xa7, 0x7e, 0xc1, 0xc5, + 0xaf, 0x90, 0x28, 0x8f, 0x27, 0x20, 0xf1, 0x3f, 0xf0, 0x93, 0xc6, 0x86, 0x26, 0x6b, + 0x92, 0xd7, 0xa0, 0x24, + ], + cmx: [ + 0x1d, 0x51, 0xea, 0x92, 0xfa, 0x43, 0x55, 0x0a, 0x0e, 0xdd, 0xea, 0x23, 0x6e, 0x17, + 0xa0, 0x16, 0x93, 0xc2, 0x2d, 0x8d, 0xd8, 0x1c, 0x9c, 0x9e, 0xc8, 0x76, 0xa2, 0x4e, + 0x67, 0xd4, 0x93, 0x0b, + ], + esk: [ + 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, 0x14, 0xb0, 0xdf, 0x85, + 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, 0xc4, 0x84, 0xa9, 0xf4, + 0xc7, 0xda, 0x74, 0x36, + ], + ephemeral_key: [ + 0x8f, 0xbe, 0xb6, 0xb3, 0x03, 0x8e, 0x69, 0x49, 0x91, 0x6a, 0x2c, 0x06, 0x0e, 0xf9, + 0xa4, 0xb1, 0xfe, 0xf1, 0x3a, 0xce, 0x2f, 0xee, 0x00, 0x25, 0xda, 0x32, 0xc3, 0x6d, + 0x23, 0x1a, 0x61, 0x34, + ], + shared_secret: [ + 0x67, 0xd6, 0x8a, 0x5a, 0x05, 0x93, 0xfd, 0x16, 0x7d, 0x38, 0x08, 0x2e, 0x49, 0xd2, + 0x30, 0x30, 0x86, 0xe5, 0x5a, 0x43, 0xc1, 0x24, 0xd5, 0xaa, 0xa8, 0x20, 0xab, 0x0c, + 0x3f, 0x5c, 0xc5, 0x37, + ], + k_enc: [ + 0x6b, 0x8d, 0x83, 0xf2, 0xf1, 0xfd, 0x1e, 0xad, 0x7d, 0x45, 0x42, 0xb3, 0x63, 0x09, + 0x34, 0x07, 0xc5, 0x0a, 0x20, 0xed, 0x7f, 0x0e, 0x8c, 0xf2, 0xdb, 0x53, 0x6d, 0xb1, + 0xbe, 0x25, 0xe9, 0x8d, + ], + p_enc: [ + 0x03, 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, 0x10, 0xb8, + 0xa1, 0xba, 0xf3, 0x9a, 0x91, 0x9a, 0x25, 0x37, 0xb8, 0x71, 0xb4, 0x29, 0x4a, 0x65, + 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, 0xd9, 0xdc, 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, + 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, 0xc4, 0x8f, 0x6e, 0xe9, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, 0x90, 0x8c, 0xda, + 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, 0x9f, 0x9b, 0xd7, 0xec, + 0x42, 0x67, 0xed, 0x8e, 0x96, 0x93, 0x0e, 0x10, 0x84, 0x78, 0x3c, 0x37, 0xd6, 0xf9, + 0xdd, 0x15, 0xfd, 0x29, 0xf4, 0xcc, 0x47, 0x7e, 0x66, 0xf1, 0x30, 0xd6, 0x30, 0x43, + 0x0d, 0xcc, 0x01, 0x04, 0x89, 0x9b, 0x4f, 0x9f, 0x46, 0xeb, 0x09, 0x0e, 0xf7, 0xfc, + 0x90, 0xb4, 0x79, 0xab, 0xf6, 0x1f, 0x93, 0x95, 0x5e, 0xe0, 0x0e, 0x6a, 0x18, 0x48, + 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, + 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, + 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, + 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, + 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, + 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, + 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, + 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, + 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, + 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, + 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, + 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, + 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, + 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, + 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, + 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, + 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, + 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, + 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, + 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, + 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, + 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, + 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, + 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, + 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, + 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, + 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, + 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, + 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, + 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, + 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x59, + ], + c_enc: [ + 0x76, 0xc6, 0xef, 0xc8, 0xb5, 0x42, 0xa7, 0x07, 0xc0, 0xa5, 0xcf, 0x5c, 0xe3, 0xf3, + 0xb9, 0x6d, 0xe1, 0x91, 0x95, 0x7c, 0x9f, 0xa6, 0xe9, 0xbb, 0x4b, 0x8d, 0x89, 0x9e, + 0x1f, 0x19, 0xe0, 0x20, 0xba, 0x7b, 0xb3, 0xfe, 0xf1, 0x67, 0x81, 0xc8, 0x8c, 0xc5, + 0xd4, 0x4a, 0x5e, 0xf8, 0x17, 0x31, 0x47, 0xdc, 0x3d, 0x1b, 0xc9, 0xb7, 0x31, 0x44, + 0x93, 0x2b, 0x1e, 0xeb, 0x8c, 0x2a, 0x84, 0xf9, 0x3d, 0x9b, 0xdf, 0x53, 0x78, 0x67, + 0xab, 0x82, 0x4c, 0xc3, 0xa4, 0xc5, 0xdc, 0x5b, 0xeb, 0xd8, 0x95, 0x26, 0xba, 0x5c, + 0x2b, 0x5a, 0x76, 0x76, 0x4b, 0x33, 0x2f, 0x2d, 0xdc, 0x0f, 0x48, 0x2f, 0xd4, 0x57, + 0xb3, 0x6d, 0x16, 0x05, 0xca, 0xea, 0xe2, 0xc7, 0xf1, 0x5a, 0x05, 0x91, 0xfa, 0x40, + 0xa4, 0x57, 0x49, 0xa7, 0x58, 0xcb, 0x88, 0xaa, 0xd5, 0xd0, 0x85, 0x92, 0x11, 0x4e, + 0x75, 0x7b, 0x19, 0x37, 0xf4, 0x99, 0x73, 0xe5, 0xba, 0x72, 0x8c, 0xa4, 0xb0, 0x9c, + 0x71, 0xe2, 0x25, 0x54, 0xf8, 0x89, 0x34, 0x8d, 0xbe, 0x7b, 0x7d, 0x7b, 0xd5, 0x02, + 0x84, 0x71, 0x20, 0xe1, 0xfe, 0xb6, 0xaf, 0x86, 0xeb, 0x19, 0x1a, 0xb2, 0x1d, 0x21, + 0x20, 0xa6, 0xbd, 0x2c, 0x38, 0x04, 0x22, 0x28, 0xa7, 0xb0, 0xda, 0xc3, 0x16, 0xe3, + 0x39, 0x05, 0x4f, 0xb4, 0x30, 0xce, 0xac, 0x6c, 0xea, 0xa8, 0xd3, 0x18, 0x10, 0xa7, + 0x99, 0x7f, 0xfb, 0xc1, 0x58, 0xfc, 0x7b, 0x2c, 0xb6, 0x2b, 0x13, 0x5e, 0xde, 0x3f, + 0x65, 0x6e, 0x4b, 0x13, 0x57, 0xac, 0x31, 0x48, 0x96, 0xf1, 0x35, 0x58, 0xec, 0x32, + 0x90, 0x8e, 0x9d, 0xd6, 0x85, 0xb4, 0xee, 0x9a, 0x7d, 0x81, 0x4d, 0xdc, 0x50, 0x2c, + 0xe7, 0xac, 0xa1, 0xda, 0x00, 0xee, 0xda, 0xe4, 0x96, 0x03, 0x35, 0xe5, 0x75, 0x6a, + 0x42, 0xd6, 0xf4, 0x4f, 0x85, 0x2c, 0x8a, 0x7a, 0xd0, 0x0e, 0xf7, 0x9a, 0x4d, 0xb1, + 0x4e, 0xae, 0xc9, 0x56, 0x2a, 0xba, 0xc3, 0x08, 0x01, 0x1e, 0xbf, 0x00, 0x57, 0x6e, + 0x6c, 0xa3, 0xea, 0x16, 0xe5, 0x01, 0xbf, 0x35, 0x0f, 0x82, 0x14, 0xb6, 0x84, 0x04, + 0xdb, 0x24, 0x2e, 0x9f, 0x85, 0x3d, 0x82, 0xbe, 0x44, 0x25, 0x0d, 0xf0, 0xa8, 0x1d, + 0xe7, 0x0e, 0x10, 0x40, 0xfa, 0xde, 0x44, 0x69, 0x1e, 0xca, 0x6e, 0x03, 0xc4, 0x6c, + 0x4b, 0x57, 0xc7, 0x89, 0xc9, 0x74, 0x8e, 0x0e, 0x2e, 0xf4, 0x11, 0x9d, 0xbd, 0x7b, + 0x39, 0x3d, 0x63, 0x3c, 0x6e, 0xc8, 0xf0, 0xd0, 0x4d, 0x97, 0x1d, 0x2b, 0xd5, 0xab, + 0xed, 0x9f, 0x36, 0xc9, 0xb4, 0xb4, 0x6e, 0x3b, 0x32, 0x56, 0x9d, 0x31, 0x89, 0x45, + 0x6e, 0x65, 0x51, 0x67, 0x7e, 0xe7, 0x71, 0xb0, 0xf0, 0xa2, 0x6f, 0x84, 0xc2, 0x9f, + 0xdc, 0xa3, 0xd6, 0x42, 0x82, 0x60, 0x05, 0x37, 0x34, 0x7b, 0xd7, 0xf6, 0x0c, 0xe4, + 0x27, 0xbf, 0x55, 0xe9, 0xb1, 0xbf, 0xd4, 0xb7, 0x56, 0x4f, 0x9f, 0xb1, 0x93, 0x02, + 0xdc, 0x41, 0xe7, 0xde, 0xde, 0x7f, 0x4f, 0xc0, 0x0f, 0x57, 0x3e, 0x33, 0xf4, 0xbe, + 0x41, 0x40, 0xdd, 0xc9, 0x76, 0x93, 0xaf, 0x52, 0x48, 0x95, 0x87, 0xf0, 0xd0, 0x81, + 0x0f, 0x3d, 0x9c, 0x35, 0x6f, 0x32, 0xe9, 0x3d, 0x47, 0x56, 0x0c, 0x01, 0x1c, 0x0c, + 0x94, 0xe1, 0xa6, 0x49, 0x7e, 0x87, 0x45, 0x8e, 0xad, 0x8a, 0x34, 0x67, 0x84, 0xbc, + 0x42, 0x66, 0x16, 0x7f, 0x87, 0x7e, 0x38, 0x92, 0xa8, 0x98, 0x77, 0x4c, 0xe3, 0xad, + 0x3b, 0x82, 0x8d, 0x9d, 0xd1, 0xd2, 0xe4, 0x0a, 0x89, 0xf1, 0xfc, 0xe4, 0x9d, 0x6b, + 0x20, 0x18, 0x9e, 0x0c, 0x22, 0xe0, 0x17, 0xab, 0x55, 0x5b, 0x68, 0xa7, 0x4e, 0x66, + 0xb4, 0xeb, 0x31, 0xee, 0x78, 0xaf, 0xbe, 0x63, 0x25, 0xcb, 0xad, 0xd5, 0xa8, 0x38, + 0x29, 0x49, 0xf3, 0xc7, 0x48, 0xa9, 0xe7, 0x22, 0xfc, 0x58, 0xeb, 0xab, 0xdc, 0x69, + 0x64, 0x22, 0x4c, 0x48, 0x58, 0x6e, 0x94, 0x3c, 0x60, 0x2f, 0x70, 0x5e, 0x55, 0x4b, + 0xc0, 0x1c, 0x58, 0x90, 0x4d, 0x2f, 0xa7, 0x1e, 0x4c, 0x44, 0xe3, 0x8c, 0x3d, 0x19, + 0x04, 0x7d, 0xa9, 0x39, 0xaf, 0x3b, 0x3f, 0xba, 0x89, 0xad, 0x1b, 0x83, 0xb5, 0xb3, + 0xb4, 0xbd, 0x8c, 0xe5, 0x99, 0xeb, 0x69, 0x7a, 0xb6, 0x5d, 0x37, 0x04, 0x5e, 0xa9, + 0x15, 0x98, 0xdb, 0x59, 0x18, 0x75, 0xf6, 0xcc, 0x18, 0x02, 0x79, 0x0a, 0x3c, 0x1f, + 0x40, 0xeb, 0x68, 0x8e, 0x7c, 0xb8, 0xbb, 0x3d, 0x07, 0xde, + ], + ock: [ + 0xb4, 0xf8, 0x8a, 0x29, 0x2d, 0x09, 0xd9, 0x35, 0xb4, 0x77, 0x5a, 0x29, 0x30, 0xeb, + 0x38, 0xce, 0xbd, 0x5a, 0xf6, 0xff, 0x3f, 0x39, 0xef, 0x5b, 0xb2, 0x4c, 0xd5, 0x72, + 0x81, 0xf0, 0x8c, 0xfb, + ], + op: [ + 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, + 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, + 0x6b, 0x80, 0xbb, 0xb7, 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, + 0x14, 0xb0, 0xdf, 0x85, 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, + 0xc4, 0x84, 0xa9, 0xf4, 0xc7, 0xda, 0x74, 0x36, + ], + c_out: [ + 0x94, 0xe3, 0x7f, 0xd6, 0x62, 0x82, 0xc0, 0x2e, 0x90, 0xe7, 0x69, 0x91, 0x4c, 0xaf, + 0x95, 0xa4, 0x95, 0xf4, 0x89, 0x7f, 0x55, 0xa5, 0xae, 0x95, 0xad, 0xe8, 0xbf, 0x67, + 0x61, 0xe3, 0x1b, 0xa5, 0xd1, 0xcf, 0xeb, 0x30, 0x6f, 0x4e, 0x22, 0x01, 0x42, 0x51, + 0xcb, 0xe3, 0xf8, 0x72, 0x4b, 0xe7, 0x69, 0x21, 0xe2, 0xad, 0xa4, 0x6e, 0x3b, 0x14, + 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, + 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x74, 0xa8, 0x41, 0x1a, 0x20, 0xbc, 0x3c, 0x53, 0xf7, 0xe7, 0xab, 0xb9, 0x31, 0x6c, + 0x44, 0x2b, 0x4b, 0x09, 0xcf, 0x88, 0xbb, 0xed, 0x4a, 0x90, 0xb9, 0x2f, 0x5a, 0x1c, + 0xed, 0x93, 0x16, 0x2b, 0xc3, 0x37, 0x34, 0x67, 0x20, 0xec, 0x0c, 0xd0, 0xea, 0x73, + 0x5d, 0x9e, 0x32, 0x3f, 0x20, 0xdb, 0x77, 0x8a, 0xd1, 0x8a, 0x84, 0xc7, 0x9e, 0xe6, + 0x28, 0x77, 0x99, 0xef, 0x02, 0x76, 0x41, 0x07, + ], + ovk: [ + 0x0c, 0x81, 0x1e, 0x4c, 0x31, 0xfb, 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, + 0x62, 0xf3, 0x44, 0xe7, 0x07, 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, 0x4c, + 0x9e, 0x6b, 0x86, 0xbc, + ], + default_d: [ + 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, + ], + default_pk_d: [ + 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, + 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, + 0x17, 0x5b, 0xa9, 0x8b, + ], + v: 7387862906040043846, + rseed: [ + 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, 0x46, 0xa2, 0x10, 0x4e, 0x93, 0xf8, + 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, 0xf3, 0xd8, 0xbe, 0x2b, 0x98, 0x23, + 0xd3, 0x42, 0xf4, 0x62, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, + 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, + 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, + 0x50, 0x74, 0x15, 0x6c, 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, + 0xf5, 0x50, 0x41, 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, + 0x05, 0x10, 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, + 0xfe, 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, + 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, + 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, + 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, + 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, + 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, + 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, + 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, 0xe6, 0x09, 0x68, 0x6f, 0x46, 0x32, + 0x23, 0xb1, 0xe9, 0xbc, 0x03, 0xbd, 0xe8, 0x95, 0xd1, 0x23, 0x8f, 0xad, 0x04, 0xa3, + 0xbf, 0xce, 0x68, 0xa0, 0x75, 0xe8, 0xa3, 0x7c, 0x0e, 0x87, 0xbf, 0x46, 0xdd, 0x01, + 0x55, 0x45, 0xf9, 0xb4, 0xfb, 0x0e, 0xec, 0x64, 0x5f, 0xfc, 0xbb, 0xe0, 0xca, 0x5f, + 0x8c, 0x56, 0x1b, 0x25, 0x7d, 0x52, 0xd6, 0x02, 0xd8, 0xc9, 0x4c, 0x50, 0x28, 0x73, + 0xa0, 0x1d, 0x92, 0x51, 0xd8, 0xc8, 0x60, 0xc0, 0x41, 0x52, 0x5b, 0x3b, 0xf4, 0xe3, + 0xa2, 0xeb, 0x92, 0x72, 0x81, 0x5c, 0x75, 0x86, 0x76, 0x84, 0x28, 0xb4, 0xc2, 0xb2, + 0x5e, 0x37, 0x45, 0xf0, 0x09, 0xc5, 0xdc, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, + 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, + 0xe9, 0x41, 0x4c, 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, + 0xc4, 0x97, 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, + 0x6b, 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, + 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, + 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, + 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, + 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, + 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, + 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, + 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, + 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, + 0x3c, 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, + 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, + 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, + 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, + ], + cv_net: [ + 0x47, 0x35, 0xa6, 0xfd, 0x21, 0x5c, 0x7b, 0x95, 0x03, 0x3d, 0xab, 0x62, 0xcc, 0xf9, + 0xcd, 0x51, 0x00, 0x89, 0x08, 0xa6, 0xcd, 0xd0, 0xaa, 0x02, 0x1b, 0x88, 0x8b, 0x98, + 0xe2, 0x3c, 0x39, 0x11, + ], + rho: [ + 0xbd, 0xda, 0xe8, 0xdf, 0xf1, 0x20, 0x5e, 0x04, 0x96, 0x8f, 0xae, 0x1f, 0xd9, 0xbe, + 0x51, 0xd8, 0x25, 0xf5, 0xd8, 0x78, 0x1d, 0x93, 0x3d, 0x0f, 0x5b, 0xce, 0x9c, 0xa8, + 0x3e, 0xe8, 0xed, 0x20, + ], + cmx: [ + 0xbe, 0x43, 0xee, 0x84, 0x70, 0x70, 0x75, 0xac, 0x48, 0x08, 0xd0, 0x97, 0x54, 0x07, + 0xc0, 0x27, 0x36, 0xd7, 0x66, 0x64, 0xf4, 0xe7, 0xae, 0xce, 0x01, 0xd9, 0xcc, 0x68, + 0x32, 0x4a, 0xe9, 0x04, + ], + esk: [ + 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, 0x14, 0x49, 0x72, 0x62, + 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, 0xe2, 0x63, 0xf3, 0xe3, + 0x99, 0x07, 0xea, 0x0c, + ], + ephemeral_key: [ + 0xfa, 0x19, 0xa1, 0x52, 0x7b, 0x76, 0x04, 0x8f, 0xf3, 0x7f, 0xa4, 0xf8, 0x27, 0x89, + 0xfe, 0x80, 0xb0, 0xcd, 0xd3, 0x5d, 0x5d, 0xa9, 0xc2, 0xec, 0x3f, 0xe3, 0x04, 0x38, + 0x05, 0xc0, 0x61, 0x23, + ], + shared_secret: [ + 0x2d, 0xb5, 0xb8, 0x92, 0xb6, 0x1b, 0x9c, 0x55, 0x3b, 0x6c, 0x9b, 0x7a, 0xcc, 0x7d, + 0x71, 0x05, 0xc1, 0xdd, 0x4c, 0x28, 0xc6, 0x7f, 0x97, 0x8b, 0x6d, 0x79, 0xc7, 0x1b, + 0x98, 0xa0, 0xd0, 0x00, + ], + k_enc: [ + 0x16, 0xe3, 0xf9, 0x85, 0xc0, 0x7f, 0xef, 0xe5, 0x30, 0xd9, 0xe6, 0x94, 0x5e, 0xde, + 0xc1, 0x90, 0x3b, 0xb1, 0xca, 0x8d, 0xa5, 0xa2, 0x5b, 0xe9, 0x59, 0x78, 0x63, 0x7a, + 0x40, 0x8c, 0x2e, 0xfe, + ], + p_enc: [ + 0x03, 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, 0x46, 0x49, + 0xcd, 0xa3, 0x2b, 0xf6, 0x86, 0x66, 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, + 0x46, 0xa2, 0x10, 0x4e, 0x93, 0xf8, 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, + 0xf3, 0xd8, 0xbe, 0x2b, 0x98, 0x23, 0xd3, 0x42, 0xf4, 0x62, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, + 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, + 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, + 0x50, 0x74, 0x15, 0x6c, 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, + 0xf5, 0x50, 0x41, 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, + 0x05, 0x10, 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, + 0xfe, 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, + 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, + 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, + 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, + 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, + 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, + 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, + 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, 0xe6, 0x09, 0x68, 0x6f, 0x46, 0x32, + 0x23, 0xb1, 0xe9, 0xbc, 0x03, 0xbd, 0xe8, 0x95, 0xd1, 0x23, 0x8f, 0xad, 0x04, 0xa3, + 0xbf, 0xce, 0x68, 0xa0, 0x75, 0xe8, 0xa3, 0x7c, 0x0e, 0x87, 0xbf, 0x46, 0xdd, 0x01, + 0x55, 0x45, 0xf9, 0xb4, 0xfb, 0x0e, 0xec, 0x64, 0x5f, 0xfc, 0xbb, 0xe0, 0xca, 0x5f, + 0x8c, 0x56, 0x1b, 0x25, 0x7d, 0x52, 0xd6, 0x02, 0xd8, 0xc9, 0x4c, 0x50, 0x28, 0x73, + 0xa0, 0x1d, 0x92, 0x51, 0xd8, 0xc8, 0x60, 0xc0, 0x41, 0x52, 0x5b, 0x3b, 0xf4, 0xe3, + 0xa2, 0xeb, 0x92, 0x72, 0x81, 0x5c, 0x75, 0x86, 0x76, 0x84, 0x28, 0xb4, 0xc2, 0xb2, + 0x5e, 0x37, 0x45, 0xf0, 0x09, 0xc5, 0xdc, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, + 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, + 0xe9, 0x41, 0x4c, 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, + 0xc4, 0x97, 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, + 0x6b, 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, + 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, + 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, + 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, + 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, + 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, + 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, + 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, + 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, + 0x3c, 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, + 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, + 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, + 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, + ], + c_enc: [ + 0x2c, 0x40, 0x4a, 0x68, 0x81, 0xa6, 0xee, 0x76, 0x0c, 0xb5, 0x3b, 0x9c, 0xc2, 0x71, + 0x5c, 0xa7, 0x6a, 0x3a, 0x2f, 0xc9, 0x69, 0x3b, 0x1a, 0xbb, 0xcd, 0xc7, 0x5c, 0xb6, + 0xd6, 0xc3, 0x6e, 0xcf, 0x84, 0xd6, 0x93, 0x67, 0x2c, 0x53, 0xce, 0xd8, 0x79, 0x8c, + 0xc8, 0xf1, 0xe5, 0x3b, 0x8a, 0x9d, 0xe7, 0xbb, 0xb5, 0xe8, 0x5d, 0xf4, 0x7c, 0x42, + 0xbd, 0x4e, 0xe2, 0x7d, 0xa0, 0xd6, 0xf9, 0x5a, 0xa4, 0xf1, 0x10, 0xd4, 0x5a, 0xe2, + 0x8e, 0x6f, 0xea, 0x40, 0xe4, 0x7b, 0xc6, 0x08, 0x1b, 0x78, 0xe2, 0xcb, 0xa1, 0x78, + 0xf5, 0x3b, 0x2c, 0x0f, 0xfd, 0x71, 0xf1, 0x52, 0x54, 0x55, 0x70, 0x8a, 0x92, 0x50, + 0xb0, 0x28, 0x17, 0x90, 0x70, 0xc7, 0xd3, 0xbe, 0x38, 0xdc, 0x67, 0x3f, 0xc1, 0x20, + 0x6c, 0xce, 0x64, 0xd5, 0x13, 0xed, 0x14, 0x3e, 0xbf, 0x45, 0x76, 0x3c, 0xa5, 0xea, + 0x12, 0x6e, 0xc1, 0x4d, 0x01, 0xda, 0xcb, 0x64, 0x60, 0xa5, 0xdc, 0xd2, 0x26, 0xd1, + 0xa9, 0x5c, 0x8d, 0xf9, 0xc4, 0x64, 0xd9, 0x35, 0xb6, 0xaa, 0x60, 0x7f, 0xff, 0x2d, + 0x3d, 0x72, 0x55, 0x83, 0xf8, 0x82, 0x1a, 0xe9, 0xb4, 0x7f, 0xce, 0x87, 0x5e, 0xa8, + 0x7c, 0xea, 0x41, 0x21, 0xec, 0xc8, 0x5b, 0x93, 0xa6, 0x38, 0xf5, 0x6f, 0x48, 0xf7, + 0x0a, 0xc8, 0x85, 0xb4, 0x89, 0x03, 0x02, 0xdf, 0x12, 0x5f, 0x80, 0x20, 0x16, 0x4d, + 0xd0, 0x13, 0xc7, 0x3f, 0xd2, 0xb4, 0x0f, 0x38, 0xc6, 0x9b, 0xe8, 0xcf, 0x0a, 0x3b, + 0xaf, 0xa6, 0x3b, 0x2b, 0xa0, 0x4d, 0x98, 0x65, 0xa2, 0x55, 0xc2, 0x34, 0x60, 0x83, + 0x33, 0x04, 0xf6, 0xe7, 0xf6, 0xec, 0xd4, 0x7d, 0xa7, 0x8b, 0x29, 0xfa, 0x95, 0x15, + 0xba, 0x60, 0xed, 0x15, 0x78, 0x78, 0x02, 0xe7, 0xa9, 0xf6, 0x63, 0xe9, 0xad, 0xda, + 0x54, 0x64, 0x77, 0xf7, 0xa9, 0x94, 0xc1, 0x6b, 0x81, 0x41, 0xf4, 0x54, 0xc4, 0x34, + 0xd5, 0x7f, 0x8b, 0xd3, 0xb8, 0xc0, 0xe7, 0x21, 0x1c, 0x91, 0x5f, 0xc3, 0xfe, 0xb5, + 0xdd, 0xe3, 0xb9, 0x1c, 0xed, 0x14, 0x93, 0x7a, 0x00, 0xff, 0xfc, 0xba, 0x37, 0x2e, + 0x69, 0x28, 0x70, 0xca, 0x44, 0xd0, 0x0c, 0x24, 0xc0, 0x0d, 0x61, 0x0a, 0x75, 0xa5, + 0x18, 0xca, 0x83, 0x62, 0xcd, 0xb3, 0xcf, 0xb6, 0xdc, 0x10, 0x5a, 0xa6, 0x86, 0x37, + 0x69, 0x52, 0x03, 0x45, 0xae, 0x51, 0x3d, 0x60, 0x89, 0x85, 0xba, 0x9b, 0xab, 0x2f, + 0x61, 0x4c, 0xd8, 0xad, 0xfc, 0xe6, 0x07, 0x15, 0x6d, 0x04, 0xe7, 0x70, 0xe6, 0x3e, + 0x2c, 0xd4, 0x7a, 0xb8, 0x5f, 0x8e, 0x74, 0x51, 0x8e, 0x19, 0x70, 0x7d, 0x83, 0xe3, + 0xc4, 0x86, 0xad, 0x9e, 0x0a, 0x28, 0x34, 0xc5, 0x8b, 0x4b, 0x72, 0x7a, 0x9b, 0xb0, + 0xc3, 0x7e, 0x8f, 0xcb, 0xdd, 0x9a, 0x49, 0xe8, 0x23, 0x74, 0xd5, 0x24, 0x44, 0x42, + 0x9b, 0x6e, 0x9a, 0x0d, 0xf2, 0xaf, 0x47, 0xe9, 0xd4, 0x58, 0x1d, 0xbe, 0xc7, 0xc6, + 0x0f, 0xb9, 0x33, 0x79, 0x4e, 0xc6, 0x88, 0x16, 0xbe, 0xd4, 0x2e, 0x97, 0xfb, 0xbc, + 0x91, 0xbd, 0x5e, 0x25, 0x69, 0x07, 0xb3, 0x9d, 0x24, 0xad, 0x54, 0xb5, 0x06, 0x4a, + 0x46, 0xb4, 0x01, 0x83, 0x38, 0x26, 0xfe, 0x4d, 0xff, 0x2e, 0x9f, 0xcc, 0xca, 0x8c, + 0x54, 0xf7, 0x83, 0x25, 0x4d, 0x28, 0x05, 0xe9, 0x56, 0x04, 0x41, 0x72, 0xa7, 0x65, + 0x81, 0xff, 0xfd, 0x45, 0x8b, 0x6a, 0x64, 0x69, 0xdc, 0x40, 0xf9, 0x4e, 0x60, 0x65, + 0xf9, 0x9c, 0x3f, 0x63, 0xda, 0x89, 0xf3, 0x26, 0x0a, 0xfe, 0xde, 0x0f, 0xfa, 0x0c, + 0xd3, 0x3a, 0xb0, 0x89, 0xb1, 0x31, 0xed, 0x55, 0x40, 0x29, 0x06, 0xba, 0xf8, 0x0b, + 0xcc, 0x64, 0x3d, 0xf9, 0x34, 0x1c, 0xce, 0x9a, 0x55, 0x3b, 0x5a, 0xe5, 0x11, 0xe5, + 0xdc, 0xd2, 0x83, 0x5c, 0x3b, 0xf5, 0x71, 0xe8, 0xaa, 0xd1, 0x61, 0x8c, 0xf7, 0x06, + 0xd9, 0x14, 0xe6, 0xa3, 0x99, 0xd1, 0x8d, 0xeb, 0xf5, 0x6b, 0x3b, 0x46, 0xc5, 0xd4, + 0x56, 0x2f, 0x1c, 0x7d, 0x24, 0x2d, 0xdc, 0x53, 0xa5, 0x73, 0x63, 0x6e, 0x75, 0x3c, + 0x91, 0x52, 0x4c, 0xb9, 0x3f, 0xcd, 0x88, 0xa2, 0x3b, 0xe9, 0xb3, 0x4e, 0xca, 0xb4, + 0xbf, 0x89, 0x71, 0x01, 0x34, 0xfc, 0xe8, 0x34, 0x5b, 0xcd, 0x6a, 0x5a, 0x3d, 0x72, + 0x1e, 0xa8, 0xb6, 0x20, 0x7c, 0x2f, 0xcf, 0x81, 0x75, 0x80, 0xe0, 0xa6, 0x3d, 0xb4, + 0x37, 0x7c, 0x86, 0xe4, 0x15, 0x1e, 0xd8, 0xd3, 0x0a, 0x71, + ], + ock: [ + 0x8b, 0x0d, 0x29, 0x8e, 0xe8, 0xb4, 0x25, 0x34, 0xa4, 0x2f, 0xb9, 0x63, 0x5b, 0xa7, + 0x58, 0xea, 0x9f, 0x91, 0x8b, 0x83, 0x16, 0xc0, 0xe8, 0x94, 0xa9, 0x08, 0x48, 0x89, + 0x01, 0xd9, 0xfb, 0xa3, + ], + op: [ + 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, + 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, + 0x17, 0x5b, 0xa9, 0x8b, 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, + 0x14, 0x49, 0x72, 0x62, 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, + 0xe2, 0x63, 0xf3, 0xe3, 0x99, 0x07, 0xea, 0x0c, + ], + c_out: [ + 0xf3, 0xbf, 0x90, 0x76, 0xf3, 0xdb, 0x66, 0x32, 0x6d, 0xa6, 0x0c, 0xc7, 0x94, 0x3c, + 0x85, 0x4d, 0x8d, 0xe9, 0x9f, 0x57, 0x53, 0xf7, 0x0c, 0x32, 0xed, 0x01, 0xfb, 0x2e, + 0x84, 0x9c, 0x9d, 0xc7, 0x3f, 0x80, 0xb5, 0xcb, 0xaa, 0xb4, 0x99, 0x2d, 0xd7, 0xe7, + 0x38, 0xb9, 0x61, 0xfd, 0x75, 0x3f, 0x7c, 0x5b, 0x29, 0x24, 0xd1, 0xd9, 0x63, 0x06, + 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, + 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x73, 0xa2, 0x5e, 0xba, 0x9b, 0xd7, 0xa8, 0xed, 0x2b, 0x5b, 0x1b, 0x8d, 0x5a, 0x05, + 0x6b, 0xde, 0x8d, 0x05, 0xe6, 0xa2, 0x80, 0x67, 0xb3, 0x84, 0x57, 0x91, 0xbe, 0xbf, + 0xa7, 0xae, 0x2a, 0xcd, 0x36, 0x32, 0x6f, 0xe6, 0x27, 0xbe, 0xe8, 0x0e, 0x32, 0x92, + 0xe0, 0xe5, 0x13, 0x2d, 0xe1, 0x6c, 0xa4, 0xf8, 0x1e, 0x5a, 0x6f, 0xc0, 0x9c, 0x95, + 0xff, 0x13, 0xb5, 0x2e, 0x96, 0xb7, 0x89, 0x0f, + ], + ovk: [ + 0xf5, 0xe8, 0xde, 0xd8, 0x18, 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, 0x00, 0xb8, 0x32, + 0x71, 0x2a, 0x6d, 0x3b, 0xa5, 0x66, 0x65, 0x17, 0xbc, 0xd3, 0x56, 0x76, 0x21, 0xa7, + 0xcf, 0x84, 0x45, 0x58, + ], + default_d: [ + 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, + ], + default_pk_d: [ + 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, + 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, + 0x01, 0x70, 0x89, 0x1a, + ], + v: 17209482587585417762, + rseed: [ + 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, + 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, + 0x2b, 0xe4, 0xc2, 0xcd, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, + 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, + 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, + 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, + 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, + 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, + 0x63, 0xea, 0xd2, 0xc0, 0xc0, 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, + 0xfa, 0xd8, 0x75, 0x84, 0x2d, 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, + 0xd7, 0x98, 0x2d, 0x67, 0x99, 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, + 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, + 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, + 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, + 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, + 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, + 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, + 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, + 0x4a, 0x44, 0xf7, 0x1f, 0x1b, 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, + 0x4a, 0x14, 0x5f, 0xea, 0x51, 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, + 0x59, 0x54, 0x78, 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, + 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, + 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, + 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, 0x60, + 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, 0x46, 0x09, + 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, 0x60, 0xf7, 0xbf, 0xf1, 0xd9, + 0xfb, 0x83, 0x00, 0xed, 0x00, 0x92, 0x53, 0xba, 0x9b, 0x99, 0x6f, 0xa0, 0x52, 0x41, + 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, 0x92, 0x5b, 0x62, 0x6b, 0xb2, 0x1a, 0x47, + 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, 0xa8, + 0x66, 0x58, 0xc3, 0xfd, 0x9e, 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, 0x4a, + 0xb3, 0x6d, 0x2c, 0x7f, 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, 0xea, + 0x8f, 0xa9, 0x4b, 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, 0xb1, + 0xa1, 0x8e, 0xaf, 0x2d, 0x47, 0x1d, 0x13, 0xc1, 0xab, 0x39, 0xd9, 0x19, 0x4a, 0xe8, + 0x43, 0xab, 0x1d, 0x28, 0xff, 0xa8, 0xf6, 0x9d, 0xc7, 0xe1, 0x5c, 0xc3, 0x8b, 0x12, + 0xe8, 0xfc, 0xd7, 0x92, 0x55, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, 0x2f, + 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x51, 0xc1, 0xa0, 0x8b, 0x8a, 0x11, 0xd8, 0x4d, + 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0xd6, 0xb1, 0x8f, 0x50, 0x25, 0x86, + 0x83, 0xd3, 0xf9, 0xa7, 0x6d, 0x39, 0x9f, 0xd0, 0x47, 0xee, 0xe2, 0x88, 0xbb, 0x45, + 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, + ], + cv_net: [ + 0xe8, 0x06, 0x5c, 0x40, 0x96, 0xd3, 0x54, 0x33, 0x40, 0x01, 0x1f, 0x58, 0x90, 0xb1, + 0x7e, 0xed, 0xd2, 0xa7, 0x06, 0x44, 0x07, 0x34, 0x78, 0x41, 0x01, 0xae, 0x2d, 0x8e, + 0x87, 0xe5, 0x05, 0xad, + ], + rho: [ + 0xc2, 0x79, 0xfa, 0x9d, 0x1c, 0x84, 0x11, 0x93, 0xd3, 0x32, 0xf8, 0xcc, 0xf4, 0xd0, + 0xb1, 0xe4, 0x56, 0x01, 0xa8, 0xaf, 0x66, 0x76, 0xd7, 0x62, 0xfb, 0xa7, 0x31, 0x33, + 0x45, 0x89, 0x35, 0x14, + ], + cmx: [ + 0x6d, 0x29, 0x97, 0xd1, 0xce, 0x0a, 0x94, 0x9a, 0x63, 0x70, 0x0f, 0x46, 0x1b, 0x57, + 0x12, 0xae, 0xeb, 0x43, 0xd4, 0x55, 0x04, 0xe3, 0x5b, 0xda, 0x16, 0x52, 0x97, 0x77, + 0xc7, 0x4d, 0x19, 0x1b, + ], + esk: [ + 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, 0x6b, 0xa0, 0x02, 0x0c, + 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, 0x57, 0x32, 0x63, 0xf4, + 0x99, 0xbd, 0x4c, 0x13, + ], + ephemeral_key: [ + 0xe4, 0x76, 0x95, 0x86, 0x30, 0x4a, 0x6a, 0x9b, 0x3a, 0x2a, 0xef, 0x3a, 0xf5, 0x8b, + 0x97, 0xda, 0xc2, 0xcc, 0x4a, 0xeb, 0x38, 0x9f, 0x68, 0xc1, 0x28, 0x87, 0x73, 0x1e, + 0x0e, 0x12, 0xbc, 0x1e, + ], + shared_secret: [ + 0xf6, 0xba, 0x4b, 0x1f, 0xbe, 0x01, 0xfa, 0x2f, 0x1d, 0xd4, 0x09, 0x3c, 0x5c, 0xc4, + 0x85, 0xa9, 0xbf, 0xd9, 0xef, 0x0f, 0x57, 0x89, 0x49, 0xd6, 0xe1, 0x00, 0xb0, 0x05, + 0x5c, 0xb8, 0xf3, 0x31, + ], + k_enc: [ + 0xd3, 0xc2, 0x20, 0x51, 0x00, 0x3e, 0x88, 0x2a, 0x5d, 0xdd, 0xfb, 0x48, 0x23, 0xd6, + 0x77, 0x26, 0x96, 0xa7, 0xe9, 0x9f, 0x26, 0xb1, 0xa6, 0xac, 0xd2, 0x4b, 0xee, 0xd5, + 0xf2, 0x2f, 0x9f, 0xf8, + ], + p_enc: [ + 0x03, 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, 0x22, 0x92, + 0x4c, 0xd1, 0x3b, 0x5d, 0xd4, 0xee, 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, + 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, + 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, 0x2b, 0xe4, 0xc2, 0xcd, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, + 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, + 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, + 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, + 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, + 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, + 0x63, 0xea, 0xd2, 0xc0, 0xc0, 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, + 0xfa, 0xd8, 0x75, 0x84, 0x2d, 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, + 0xd7, 0x98, 0x2d, 0x67, 0x99, 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, + 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, + 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, + 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, + 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, + 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, + 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, + 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, + 0x4a, 0x44, 0xf7, 0x1f, 0x1b, 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, + 0x4a, 0x14, 0x5f, 0xea, 0x51, 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, + 0x59, 0x54, 0x78, 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, + 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, + 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, + 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, 0x60, + 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, 0x46, 0x09, + 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, 0x60, 0xf7, 0xbf, 0xf1, 0xd9, + 0xfb, 0x83, 0x00, 0xed, 0x00, 0x92, 0x53, 0xba, 0x9b, 0x99, 0x6f, 0xa0, 0x52, 0x41, + 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, 0x92, 0x5b, 0x62, 0x6b, 0xb2, 0x1a, 0x47, + 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, 0xa8, + 0x66, 0x58, 0xc3, 0xfd, 0x9e, 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, 0x4a, + 0xb3, 0x6d, 0x2c, 0x7f, 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, 0xea, + 0x8f, 0xa9, 0x4b, 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, 0xb1, + 0xa1, 0x8e, 0xaf, 0x2d, 0x47, 0x1d, 0x13, 0xc1, 0xab, 0x39, 0xd9, 0x19, 0x4a, 0xe8, + 0x43, 0xab, 0x1d, 0x28, 0xff, 0xa8, 0xf6, 0x9d, 0xc7, 0xe1, 0x5c, 0xc3, 0x8b, 0x12, + 0xe8, 0xfc, 0xd7, 0x92, 0x55, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, 0x2f, + 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x51, 0xc1, 0xa0, 0x8b, 0x8a, 0x11, 0xd8, 0x4d, + 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0xd6, 0xb1, 0x8f, 0x50, 0x25, 0x86, + 0x83, 0xd3, 0xf9, 0xa7, 0x6d, 0x39, 0x9f, 0xd0, 0x47, 0xee, 0xe2, 0x88, 0xbb, 0x45, + 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, + ], + c_enc: [ + 0x73, 0x29, 0xa0, 0xa5, 0x6a, 0x14, 0x4b, 0x04, 0x2c, 0x1e, 0xad, 0x91, 0x80, 0xac, + 0x54, 0xda, 0xc6, 0xc5, 0x5c, 0xf4, 0xc2, 0x2f, 0xbe, 0x7c, 0xde, 0x99, 0x96, 0x0b, + 0xc6, 0x20, 0xd4, 0xdd, 0x60, 0xe4, 0xbf, 0x18, 0xa0, 0xea, 0x7a, 0xd9, 0x09, 0x3b, + 0xcd, 0x3f, 0xf6, 0xd1, 0x61, 0x1c, 0x56, 0x5f, 0x88, 0xe7, 0xad, 0xc7, 0x88, 0x7c, + 0x34, 0x4d, 0x78, 0x79, 0x73, 0x3d, 0x26, 0x30, 0xbd, 0x45, 0x07, 0x25, 0xcd, 0xfc, + 0xef, 0x8f, 0xe4, 0x0f, 0xf0, 0xdc, 0x6f, 0x45, 0x9e, 0xc6, 0x67, 0x38, 0x5a, 0x94, + 0xfb, 0x63, 0x44, 0x5a, 0x61, 0xc7, 0x3d, 0x9d, 0x16, 0x1b, 0x77, 0x06, 0xf6, 0xb3, + 0x26, 0xf4, 0x07, 0xc2, 0xde, 0x59, 0xe3, 0xe6, 0x01, 0xdb, 0xa0, 0x00, 0xe7, 0x73, + 0x81, 0x5d, 0xb0, 0x97, 0x22, 0xe9, 0xbd, 0x23, 0x07, 0x4d, 0x20, 0x6d, 0xbe, 0xfd, + 0x0b, 0x7f, 0x8b, 0x55, 0x14, 0xee, 0x62, 0x46, 0xb5, 0xde, 0x97, 0x68, 0xad, 0x50, + 0x18, 0x17, 0xa4, 0x42, 0x04, 0x87, 0x07, 0x78, 0x61, 0xa0, 0x6c, 0xf5, 0xfa, 0xa0, + 0xae, 0x0d, 0xf9, 0x03, 0x02, 0x51, 0xa9, 0xe3, 0x9e, 0x7c, 0xde, 0x48, 0x3e, 0xd8, + 0x28, 0xd8, 0xb2, 0x7e, 0xbd, 0x6d, 0xa9, 0xca, 0x96, 0x54, 0xaf, 0xc1, 0xdf, 0x94, + 0x00, 0xb2, 0xbe, 0xc7, 0x60, 0xfb, 0x26, 0x00, 0xa4, 0x53, 0x67, 0x3f, 0x6e, 0x7c, + 0x89, 0x4b, 0x9c, 0xcd, 0x8a, 0x57, 0x2d, 0x24, 0xa5, 0x47, 0x31, 0x22, 0xfe, 0x40, + 0x06, 0xe8, 0x0c, 0x9a, 0x97, 0x5e, 0x93, 0xbe, 0xc5, 0x7e, 0xbc, 0x4c, 0x44, 0xb2, + 0x8e, 0xb0, 0x1f, 0xbc, 0xb2, 0xb2, 0xde, 0x55, 0x9b, 0xf0, 0x2d, 0x7b, 0x2c, 0xe4, + 0xf3, 0xd1, 0x1e, 0x86, 0xcb, 0xaa, 0x10, 0x00, 0xee, 0xbd, 0x0d, 0x1b, 0x58, 0x8c, + 0x99, 0xd7, 0xf9, 0xd9, 0x57, 0xc6, 0x4e, 0x0a, 0x1e, 0x59, 0x67, 0x66, 0xe7, 0x6c, + 0x0e, 0xdc, 0xc6, 0xd9, 0xef, 0x34, 0x58, 0x74, 0x52, 0x04, 0x46, 0x39, 0x48, 0xd9, + 0x78, 0xd1, 0x3c, 0x4b, 0xc0, 0xf4, 0x2c, 0xc9, 0xb8, 0x93, 0x65, 0x27, 0x71, 0xf6, + 0xd1, 0x17, 0x7c, 0x78, 0x58, 0xf5, 0x77, 0x03, 0xec, 0x38, 0x3c, 0x3b, 0xad, 0x82, + 0x1b, 0x2f, 0x82, 0x87, 0x9c, 0x3e, 0x1d, 0x39, 0x91, 0xd2, 0x09, 0xb5, 0xc8, 0x94, + 0xc4, 0x65, 0xdd, 0x5e, 0xd9, 0x57, 0x19, 0x27, 0x2f, 0x9f, 0x03, 0x4c, 0xd9, 0x41, + 0xa0, 0x32, 0x33, 0xe1, 0x10, 0xd5, 0x80, 0xc1, 0x93, 0xc1, 0x9a, 0x92, 0x91, 0x19, + 0x45, 0x5a, 0xa6, 0x2e, 0x10, 0x35, 0x78, 0xa2, 0xd6, 0x46, 0x06, 0x26, 0xba, 0x04, + 0x37, 0x82, 0xb8, 0xd1, 0x3a, 0x31, 0x4e, 0x51, 0xf4, 0xa2, 0x81, 0x59, 0x32, 0x5f, + 0xbb, 0x35, 0xbe, 0xbb, 0xba, 0xf5, 0x27, 0x25, 0x64, 0xa7, 0xf5, 0x3f, 0x4c, 0x38, + 0xb0, 0xf6, 0xea, 0xed, 0x1a, 0xfc, 0x71, 0x31, 0x59, 0x87, 0xac, 0xbc, 0x95, 0x91, + 0x82, 0xab, 0xd3, 0xee, 0x9d, 0x87, 0x18, 0xc2, 0x26, 0x2f, 0x53, 0x1b, 0xfb, 0x57, + 0x1b, 0xb7, 0x4e, 0x9a, 0xf3, 0x63, 0x61, 0x36, 0x75, 0xce, 0xed, 0x6f, 0x97, 0xbe, + 0x67, 0x4c, 0x43, 0xf2, 0xad, 0x13, 0xdf, 0x86, 0x8d, 0xf6, 0xd4, 0x6f, 0x80, 0x72, + 0x6b, 0xe7, 0x88, 0x79, 0x04, 0xdf, 0x5b, 0x6b, 0xb5, 0x15, 0x7a, 0x87, 0x42, 0x06, + 0xe1, 0x77, 0x8a, 0x5d, 0x08, 0x4f, 0xd7, 0x60, 0x98, 0x6d, 0xb8, 0x39, 0xb0, 0xd9, + 0x6c, 0xcd, 0x41, 0x34, 0x38, 0xef, 0x02, 0xc7, 0x9e, 0xba, 0xc9, 0xe7, 0x49, 0xf8, + 0x93, 0x60, 0xb7, 0x5d, 0xcd, 0x1e, 0xb7, 0x73, 0x94, 0x73, 0xe3, 0x1f, 0xa9, 0xca, + 0xe4, 0x94, 0x30, 0x6e, 0xa4, 0x82, 0x4a, 0xb4, 0xa9, 0xbf, 0x92, 0x5d, 0xb7, 0x4c, + 0xf3, 0xdb, 0xac, 0x38, 0x93, 0xe7, 0xf0, 0x71, 0x00, 0x77, 0xff, 0x37, 0x90, 0x2d, + 0x18, 0x7f, 0xce, 0xbe, 0xf9, 0x76, 0xd6, 0x2c, 0xae, 0xfd, 0xcc, 0x14, 0x8c, 0x68, + 0xd7, 0x7e, 0x3e, 0xb2, 0x1d, 0xd5, 0x0c, 0x34, 0x01, 0x08, 0x34, 0x23, 0xf0, 0x38, + 0x11, 0x73, 0x0b, 0xc5, 0xf8, 0x14, 0xe0, 0x99, 0x02, 0xf0, 0x60, 0x80, 0xbf, 0xb4, + 0x8b, 0x34, 0x1e, 0xce, 0x80, 0xac, 0x29, 0xcb, 0x41, 0xe3, 0x20, 0x9d, 0x07, 0x9a, + 0xc8, 0x4e, 0x85, 0x1b, 0xfb, 0x26, 0xdd, 0x39, 0xd9, 0x66, 0x2a, 0x11, 0x90, 0x28, + 0x17, 0xb0, 0x8d, 0xa3, 0x89, 0x7a, 0x5c, 0x87, 0x62, 0x22, + ], + ock: [ + 0x1b, 0xa4, 0xac, 0xd7, 0x75, 0x10, 0xc4, 0xf0, 0xc7, 0x66, 0xad, 0xf7, 0xc7, 0xdf, + 0x1d, 0x1c, 0x54, 0xd5, 0xbc, 0xe3, 0xd6, 0x0a, 0xf3, 0x5e, 0x8d, 0xd4, 0x8f, 0xdd, + 0x04, 0xa7, 0x8c, 0x0b, + ], + op: [ + 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, + 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, + 0x01, 0x70, 0x89, 0x1a, 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, + 0x6b, 0xa0, 0x02, 0x0c, 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, + 0x57, 0x32, 0x63, 0xf4, 0x99, 0xbd, 0x4c, 0x13, + ], + c_out: [ + 0x43, 0x0d, 0xaa, 0x6b, 0x75, 0x63, 0x22, 0x80, 0xd5, 0xe6, 0xda, 0xcb, 0xd2, 0xa0, + 0xff, 0xe2, 0xaf, 0x98, 0x60, 0xc8, 0x3a, 0x3d, 0x2a, 0x87, 0xf1, 0x79, 0x62, 0x88, + 0xeb, 0xed, 0x64, 0xd0, 0xcd, 0xc4, 0x60, 0xe2, 0xc8, 0x61, 0xc4, 0xf9, 0x38, 0x7d, + 0x92, 0x59, 0xfc, 0x60, 0x01, 0xac, 0xd0, 0xe7, 0x6f, 0x3b, 0x0f, 0xdb, 0x5d, 0xac, + 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, + 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xa4, 0xd7, 0x9c, 0x81, 0x9a, 0x6c, 0x5e, 0x01, 0x67, 0xfc, 0xa9, 0x8c, 0xe2, 0x62, + 0x98, 0x15, 0xf9, 0xba, 0xc9, 0x26, 0xb6, 0x27, 0x18, 0xcf, 0xbe, 0x50, 0x45, 0xd9, + 0x2d, 0xd7, 0x1c, 0xd3, 0x36, 0x75, 0xd5, 0x56, 0xe0, 0x77, 0x1e, 0x40, 0xcc, 0x3d, + 0x61, 0x8d, 0x9b, 0xda, 0x13, 0x2f, 0x13, 0x95, 0x3d, 0x82, 0x43, 0x2e, 0x81, 0x59, + 0x4a, 0x97, 0x1e, 0x98, 0xb0, 0x71, 0x40, 0x39, + ], + ovk: [ + 0x67, 0x79, 0x9a, 0x90, 0x01, 0xa2, 0xed, 0x36, 0x76, 0xa8, 0xb4, 0x03, 0xae, 0x25, + 0xff, 0xd7, 0x72, 0xf7, 0x08, 0x1e, 0x9a, 0x32, 0xbc, 0xc1, 0xc5, 0xe2, 0xed, 0xd4, + 0xe2, 0xa6, 0x57, 0x6b, + ], + default_d: [ + 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, + ], + default_pk_d: [ + 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, + 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, + 0x44, 0x6d, 0xf4, 0x39, + ], + v: 7122345086698755501, + rseed: [ + 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, 0xf2, 0xb7, 0x31, 0x77, 0x2b, 0x43, + 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, 0x48, 0x6c, 0x7a, 0x7d, 0x51, 0x71, 0xb1, + 0xde, 0x35, 0x9f, 0x6a, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0xd3, 0xa9, 0x6f, 0x64, 0x9c, 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, + 0xa1, 0xa4, 0x27, 0x9c, 0x68, 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, + 0x04, 0xa6, 0x16, 0x53, 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, + 0x80, 0x8b, 0x01, 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, 0x1a, + 0x56, 0xbf, 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, 0x49, 0xc1, + 0xcf, 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x69, 0x6d, 0x44, 0xec, 0xb1, 0x24, 0x79, 0xc5, + 0xeb, 0xef, 0x99, 0x5f, 0x10, 0x02, 0x9f, 0x8b, 0x53, 0x0e, 0xeb, 0x3f, 0xdc, 0x2e, + 0x50, 0xe8, 0x75, 0x7f, 0xc0, 0xbb, 0x9e, 0x26, 0x30, 0x23, 0xdb, 0x82, 0xf8, 0x78, + 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, 0xf1, 0xd8, 0x79, 0x89, 0x9a, 0x3e, + 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, 0x64, 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, + 0x6e, 0xdf, 0x71, 0xcd, 0x26, 0x28, 0xc9, 0x87, 0x42, 0x9f, 0x36, 0xdc, 0x50, 0x5c, + 0xcc, 0x43, 0xf3, 0x0e, 0x7a, 0x86, 0x9c, 0x9e, 0x25, 0x5e, 0x2a, 0xf9, 0xfc, 0xf3, + 0x0c, 0x12, 0x17, 0x96, 0xd1, 0x90, 0x00, 0x09, 0x60, 0xcb, 0x6f, 0xe2, 0xf1, 0xbf, + 0x24, 0x61, 0x18, 0xb4, 0x98, 0xf3, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, + 0x39, 0x30, 0x39, 0xe4, 0x53, 0x26, 0xb8, 0xff, 0xff, 0xb3, 0xe7, 0xe6, 0x15, 0x9c, + 0x46, 0x69, 0x9f, 0x10, 0x07, 0x92, 0xd4, 0x67, 0x29, 0x50, 0x34, 0x8a, 0x90, 0x55, + 0x2e, 0x45, 0x94, 0x3b, 0xee, 0xac, 0xf0, 0x3f, 0x32, 0x16, 0xf9, 0x4e, 0x27, 0x4d, + 0x63, 0xd6, 0x37, 0xd9, 0xf1, 0x90, 0xe8, 0xa2, 0x66, 0xcd, 0xee, 0xf1, 0x53, 0x53, + 0x0b, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, 0x5d, 0x99, 0x0f, + 0xff, 0xdc, 0x34, 0xec, 0x0f, 0xf7, 0xf1, 0xaf, 0x81, 0xb2, 0x4c, 0xed, 0x0e, 0xfa, + 0x62, 0x13, 0xda, 0x6c, 0x7c, 0x60, 0xc4, 0x87, 0xf5, 0xf7, 0xb0, 0x3f, 0x81, 0x60, + 0xa0, 0x57, 0xf4, 0x6d, 0x05, 0xbf, 0x82, 0x18, 0xb3, 0xad, 0xd9, 0xc0, 0x68, 0x93, + 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, + 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, + 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, + 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, 0xf8, 0xc8, 0x2e, 0x97, 0xe1, 0xb9, 0xc1, 0xb2, + 0x05, 0xe5, 0x85, 0xfb, 0xeb, 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, 0x5d, 0xca, 0x24, + 0x97, 0xe0, 0x9a, 0x70, 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, 0x28, 0x0e, 0x18, + 0x6f, 0x3f, 0xc1, 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, 0x16, 0x95, 0x21, + 0xcd, 0xc1, 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0xe2, 0xde, 0x74, + 0xb6, 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, 0x0d, 0x41, 0x51, + 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, 0xc7, 0x34, 0x77, + 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, 0xbf, 0x0f, 0x69, + 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, + 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, 0x5c, 0x6d, 0x71, 0x23, + 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, 0x5a, 0x43, 0xdb, 0x07, 0xe0, + 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, + ], + cv_net: [ + 0x00, 0x55, 0xf3, 0x5c, 0x6c, 0x82, 0x62, 0xac, 0x74, 0xfe, 0x27, 0xd7, 0x2a, 0x33, + 0xbd, 0xb9, 0x6f, 0x1c, 0xe0, 0x57, 0xc3, 0x30, 0xd1, 0xcc, 0xba, 0x2f, 0x7d, 0xa8, + 0x71, 0x55, 0x00, 0xb5, + ], + rho: [ + 0xea, 0x38, 0x44, 0x75, 0x9a, 0x9a, 0x1c, 0xc5, 0x28, 0xb2, 0x95, 0xce, 0x70, 0x13, + 0x7a, 0x85, 0xf9, 0xf0, 0x8e, 0x41, 0xa5, 0xc7, 0xc1, 0xca, 0xc1, 0x55, 0xa6, 0x69, + 0xa3, 0x18, 0x53, 0x3e, + ], + cmx: [ + 0x6a, 0xba, 0x28, 0x10, 0x5b, 0xc0, 0x72, 0xc5, 0x2a, 0xb8, 0xa3, 0x14, 0x79, 0x7f, + 0xf8, 0x66, 0x66, 0xdf, 0xb7, 0xcd, 0x8a, 0x2a, 0xe1, 0x7c, 0x58, 0x5f, 0xb7, 0xb6, + 0x51, 0x5b, 0x97, 0x1c, + ], + esk: [ + 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, 0xd5, 0x64, 0x6b, 0xc4, + 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, 0x15, 0x5b, 0xef, 0x4d, + 0x46, 0x1e, 0xec, 0x29, + ], + ephemeral_key: [ + 0x95, 0x9b, 0xea, 0x8e, 0x11, 0x96, 0x8b, 0x0f, 0x34, 0x3c, 0x04, 0xcd, 0x6d, 0x50, + 0x16, 0xfc, 0xd4, 0x33, 0x90, 0x75, 0x36, 0xa2, 0x46, 0xba, 0x1c, 0x5d, 0x3e, 0x88, + 0x97, 0xf3, 0x23, 0x1c, + ], + shared_secret: [ + 0xe2, 0x69, 0x19, 0xb4, 0x0c, 0x70, 0xaf, 0x74, 0x1d, 0xf9, 0x04, 0x51, 0x72, 0x55, + 0x03, 0x58, 0x89, 0xee, 0x5a, 0x44, 0x42, 0x6d, 0x6a, 0xb8, 0x5c, 0x07, 0x4b, 0x86, + 0x2b, 0xa0, 0x63, 0x08, + ], + k_enc: [ + 0x09, 0xda, 0xc6, 0x51, 0x1c, 0x38, 0x44, 0x58, 0x7f, 0x82, 0x9c, 0x2f, 0x1e, 0xa0, + 0x37, 0xa8, 0x1a, 0x8d, 0x54, 0x85, 0xed, 0x04, 0xea, 0xf2, 0x75, 0x80, 0x05, 0xb3, + 0x2a, 0x20, 0x47, 0x0b, + ], + p_enc: [ + 0x03, 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, 0xad, 0x95, + 0x6d, 0xdc, 0x1e, 0xa7, 0xd7, 0x62, 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, + 0xf2, 0xb7, 0x31, 0x77, 0x2b, 0x43, 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, 0x48, + 0x6c, 0x7a, 0x7d, 0x51, 0x71, 0xb1, 0xde, 0x35, 0x9f, 0x6a, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0xd3, 0xa9, 0x6f, 0x64, 0x9c, 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, + 0xa1, 0xa4, 0x27, 0x9c, 0x68, 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, + 0x04, 0xa6, 0x16, 0x53, 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, + 0x80, 0x8b, 0x01, 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, 0x1a, + 0x56, 0xbf, 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, 0x49, 0xc1, + 0xcf, 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x69, 0x6d, 0x44, 0xec, 0xb1, 0x24, 0x79, 0xc5, + 0xeb, 0xef, 0x99, 0x5f, 0x10, 0x02, 0x9f, 0x8b, 0x53, 0x0e, 0xeb, 0x3f, 0xdc, 0x2e, + 0x50, 0xe8, 0x75, 0x7f, 0xc0, 0xbb, 0x9e, 0x26, 0x30, 0x23, 0xdb, 0x82, 0xf8, 0x78, + 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, 0xf1, 0xd8, 0x79, 0x89, 0x9a, 0x3e, + 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, 0x64, 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, + 0x6e, 0xdf, 0x71, 0xcd, 0x26, 0x28, 0xc9, 0x87, 0x42, 0x9f, 0x36, 0xdc, 0x50, 0x5c, + 0xcc, 0x43, 0xf3, 0x0e, 0x7a, 0x86, 0x9c, 0x9e, 0x25, 0x5e, 0x2a, 0xf9, 0xfc, 0xf3, + 0x0c, 0x12, 0x17, 0x96, 0xd1, 0x90, 0x00, 0x09, 0x60, 0xcb, 0x6f, 0xe2, 0xf1, 0xbf, + 0x24, 0x61, 0x18, 0xb4, 0x98, 0xf3, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, + 0x39, 0x30, 0x39, 0xe4, 0x53, 0x26, 0xb8, 0xff, 0xff, 0xb3, 0xe7, 0xe6, 0x15, 0x9c, + 0x46, 0x69, 0x9f, 0x10, 0x07, 0x92, 0xd4, 0x67, 0x29, 0x50, 0x34, 0x8a, 0x90, 0x55, + 0x2e, 0x45, 0x94, 0x3b, 0xee, 0xac, 0xf0, 0x3f, 0x32, 0x16, 0xf9, 0x4e, 0x27, 0x4d, + 0x63, 0xd6, 0x37, 0xd9, 0xf1, 0x90, 0xe8, 0xa2, 0x66, 0xcd, 0xee, 0xf1, 0x53, 0x53, + 0x0b, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, 0x5d, 0x99, 0x0f, + 0xff, 0xdc, 0x34, 0xec, 0x0f, 0xf7, 0xf1, 0xaf, 0x81, 0xb2, 0x4c, 0xed, 0x0e, 0xfa, + 0x62, 0x13, 0xda, 0x6c, 0x7c, 0x60, 0xc4, 0x87, 0xf5, 0xf7, 0xb0, 0x3f, 0x81, 0x60, + 0xa0, 0x57, 0xf4, 0x6d, 0x05, 0xbf, 0x82, 0x18, 0xb3, 0xad, 0xd9, 0xc0, 0x68, 0x93, + 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, + 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, + 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, + 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, 0xf8, 0xc8, 0x2e, 0x97, 0xe1, 0xb9, 0xc1, 0xb2, + 0x05, 0xe5, 0x85, 0xfb, 0xeb, 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, 0x5d, 0xca, 0x24, + 0x97, 0xe0, 0x9a, 0x70, 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, 0x28, 0x0e, 0x18, + 0x6f, 0x3f, 0xc1, 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, 0x16, 0x95, 0x21, + 0xcd, 0xc1, 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0xe2, 0xde, 0x74, + 0xb6, 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, 0x0d, 0x41, 0x51, + 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, 0xc7, 0x34, 0x77, + 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, 0xbf, 0x0f, 0x69, + 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, + 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, 0x5c, 0x6d, 0x71, 0x23, + 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, 0x5a, 0x43, 0xdb, 0x07, 0xe0, + 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, + ], + c_enc: [ + 0x7a, 0x59, 0x87, 0x78, 0xa7, 0x28, 0x4d, 0x52, 0xa7, 0x47, 0x77, 0x4c, 0x54, 0xbd, + 0x92, 0x57, 0xb3, 0xf1, 0x7a, 0xf1, 0x3e, 0xcc, 0x72, 0xc0, 0xe3, 0xcd, 0x95, 0xeb, + 0xfa, 0xfa, 0xa3, 0x7d, 0x16, 0x65, 0x15, 0x53, 0xdd, 0x27, 0xf0, 0x1c, 0x9c, 0xf2, + 0x4b, 0x62, 0xd7, 0xdc, 0xfd, 0x52, 0xfa, 0x4b, 0x2b, 0x3b, 0xd2, 0x1c, 0xf9, 0xbe, + 0xf6, 0xc6, 0xc5, 0x47, 0x62, 0xfa, 0x2a, 0x61, 0x45, 0x53, 0xcd, 0x9b, 0x45, 0x3e, + 0x23, 0xbe, 0x78, 0x88, 0x56, 0x69, 0x77, 0xf6, 0xc4, 0xe0, 0xe7, 0x7c, 0x90, 0xe6, + 0x1b, 0x01, 0x1a, 0xe9, 0x95, 0x5e, 0x62, 0x87, 0x04, 0xd6, 0x20, 0x36, 0x6e, 0xda, + 0xef, 0xcc, 0x17, 0x13, 0xc7, 0x48, 0xc5, 0xb3, 0x6a, 0x32, 0x76, 0x51, 0xaf, 0x94, + 0xcf, 0x94, 0x82, 0x10, 0xb6, 0x10, 0x8b, 0xe4, 0x82, 0x5b, 0xe5, 0x75, 0x2e, 0x7f, + 0xcd, 0xe1, 0x2d, 0x1a, 0x03, 0x74, 0xa3, 0x85, 0xeb, 0x58, 0xfa, 0xde, 0x07, 0x3e, + 0x04, 0x87, 0xdc, 0x92, 0x17, 0x6c, 0x48, 0xc3, 0x6b, 0x7a, 0x2b, 0x34, 0x7a, 0x0f, + 0x96, 0x87, 0x5a, 0x31, 0x2a, 0xd5, 0x17, 0x9d, 0xa3, 0xfc, 0x81, 0x9c, 0xf0, 0xd4, + 0x8a, 0xb1, 0x46, 0xec, 0x2a, 0x2d, 0xd1, 0x45, 0xd7, 0x8d, 0x9d, 0x9f, 0x88, 0x84, + 0x82, 0x16, 0x55, 0x7d, 0x6e, 0x28, 0x30, 0x33, 0x56, 0xea, 0xfb, 0x2d, 0xbb, 0xe4, + 0xfd, 0x12, 0x24, 0x71, 0x37, 0x31, 0x73, 0x0e, 0xae, 0x6f, 0x52, 0x62, 0x5a, 0x59, + 0xe5, 0xb6, 0x06, 0xd2, 0xb2, 0x77, 0xe4, 0x09, 0x7e, 0x4f, 0x54, 0x24, 0x56, 0x84, + 0xeb, 0x3b, 0x64, 0xf5, 0x4d, 0xf6, 0x69, 0x7d, 0x6f, 0x39, 0x82, 0xba, 0xc4, 0x98, + 0xdf, 0x5a, 0x14, 0x43, 0x4f, 0x2e, 0x51, 0xab, 0x4c, 0xc2, 0x9d, 0x6f, 0x31, 0x28, + 0x8f, 0xf6, 0x67, 0x80, 0xb7, 0x89, 0xa8, 0x30, 0x6b, 0x20, 0xc6, 0x55, 0x3a, 0x52, + 0x46, 0x35, 0xb6, 0xec, 0xb6, 0x79, 0xe5, 0x03, 0x09, 0x54, 0x02, 0x96, 0xed, 0xef, + 0x53, 0x83, 0x31, 0x63, 0xc4, 0xa2, 0x86, 0x00, 0xd1, 0xca, 0xa8, 0x43, 0x7e, 0x6f, + 0xb9, 0xce, 0xc4, 0xb9, 0xea, 0xf5, 0x66, 0xe1, 0x7b, 0xe8, 0xf8, 0xcc, 0x34, 0xcd, + 0xdb, 0x35, 0x88, 0xce, 0xb2, 0xbf, 0xe8, 0x8c, 0xc3, 0xee, 0xb4, 0x1b, 0x92, 0x63, + 0x1f, 0x13, 0xc5, 0xeb, 0xa6, 0x86, 0x30, 0xbf, 0xa5, 0x35, 0x31, 0x30, 0x06, 0x57, + 0x49, 0x44, 0x83, 0x3c, 0xea, 0x59, 0xd9, 0xb2, 0xd1, 0x94, 0xd8, 0xc1, 0xac, 0xc1, + 0xa4, 0x17, 0x62, 0xf8, 0x98, 0x09, 0xf7, 0x8d, 0xab, 0xe9, 0x9b, 0x95, 0xb5, 0xdd, + 0xbe, 0xd1, 0xd0, 0x01, 0x03, 0x26, 0x84, 0x4f, 0x23, 0x04, 0x85, 0x84, 0xaa, 0x14, + 0x66, 0x0f, 0xe2, 0x54, 0x9c, 0xbe, 0xe9, 0xaf, 0x4b, 0x63, 0xdd, 0xde, 0x1c, 0xec, + 0x9f, 0x8d, 0x7c, 0xcb, 0xa6, 0x2a, 0x39, 0xf2, 0xf4, 0x48, 0x04, 0x96, 0xa1, 0x0f, + 0x17, 0xe9, 0xf9, 0x12, 0xc6, 0xc0, 0xa1, 0x3d, 0xbd, 0x90, 0x32, 0x60, 0x42, 0x89, + 0x4b, 0xcd, 0xf6, 0xa8, 0x07, 0x32, 0xc5, 0xfb, 0x03, 0x09, 0xee, 0xbd, 0xc4, 0x34, + 0x0c, 0x5e, 0xb5, 0x66, 0x41, 0x7c, 0xc6, 0xc8, 0xa6, 0xa6, 0x09, 0xdf, 0x5b, 0x41, + 0xc6, 0xc2, 0x95, 0xd6, 0x47, 0x3d, 0xab, 0xc7, 0x4c, 0xbb, 0x34, 0xb5, 0x5b, 0xa7, + 0x9a, 0x89, 0x46, 0x35, 0xa9, 0x00, 0x93, 0x27, 0xcc, 0x1e, 0x6d, 0x3e, 0x42, 0xba, + 0x3c, 0xba, 0xfb, 0x32, 0x1b, 0xc0, 0xb2, 0xee, 0x28, 0xe4, 0x1e, 0xf3, 0xba, 0xec, + 0xbe, 0x50, 0x46, 0x72, 0xf6, 0xe9, 0x35, 0x08, 0x66, 0x90, 0x87, 0xd5, 0x03, 0x34, + 0x36, 0x41, 0xb5, 0x9b, 0x90, 0x6a, 0x56, 0x4b, 0x7b, 0x67, 0x53, 0xd6, 0x19, 0xee, + 0xc4, 0xf5, 0xe8, 0x10, 0x62, 0x0e, 0x7b, 0x50, 0x65, 0x1a, 0xb6, 0x5e, 0x0a, 0x3d, + 0xbb, 0x1d, 0x0a, 0xb7, 0x72, 0x1c, 0x5b, 0xf0, 0xd5, 0x40, 0xe1, 0x30, 0x2d, 0x8c, + 0xce, 0x27, 0x07, 0x71, 0x91, 0x99, 0xfa, 0xa5, 0x32, 0x11, 0x06, 0xab, 0x06, 0x81, + 0x6a, 0x8c, 0x04, 0x6e, 0x47, 0x8b, 0xd5, 0xc3, 0xb4, 0x8f, 0xe6, 0x65, 0xc8, 0xd5, + 0x92, 0xfb, 0x30, 0x6b, 0xa9, 0x37, 0x10, 0x23, 0x30, 0xe4, 0x56, 0x48, 0xf1, 0xc1, + 0x6f, 0x3d, 0x1a, 0x96, 0x0f, 0x2f, 0x5f, 0x8c, 0x4d, 0x00, 0x12, 0x07, 0x8f, 0x9c, + 0xfd, 0xf6, 0xb6, 0x6d, 0xe9, 0x61, 0xca, 0x2e, 0x14, 0x0d, + ], + ock: [ + 0x4a, 0x25, 0x25, 0x4c, 0xcc, 0x44, 0x4e, 0xc6, 0x1c, 0x2b, 0xac, 0xeb, 0x2e, 0xe3, + 0x97, 0x7a, 0x63, 0x32, 0x44, 0x9a, 0x3a, 0x53, 0xad, 0xd2, 0x31, 0xab, 0xf3, 0xd1, + 0x8b, 0xb3, 0x29, 0x3d, + ], + op: [ + 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, + 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, + 0x44, 0x6d, 0xf4, 0x39, 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, + 0xd5, 0x64, 0x6b, 0xc4, 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, + 0x15, 0x5b, 0xef, 0x4d, 0x46, 0x1e, 0xec, 0x29, + ], + c_out: [ + 0x7b, 0xf4, 0x12, 0x7d, 0x22, 0xcc, 0x57, 0x35, 0x87, 0x51, 0x2f, 0xf8, 0x1e, 0x55, + 0x3e, 0x3c, 0x98, 0x23, 0x5f, 0x51, 0xc7, 0x23, 0x7e, 0x9e, 0x76, 0x1a, 0x08, 0xf2, + 0xe1, 0xe8, 0x0d, 0x04, 0x26, 0x98, 0xfc, 0x3b, 0x1d, 0x03, 0x18, 0xf1, 0xfd, 0xca, + 0x8e, 0x41, 0xa3, 0x16, 0xd6, 0xaf, 0x3a, 0xc0, 0xc4, 0x0c, 0xe1, 0x99, 0x47, 0xa2, + 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, + 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xdc, 0x10, 0x95, 0x20, 0x57, 0xc4, 0xbe, 0xaa, 0xd8, 0xaf, 0x37, 0xce, 0x4e, 0xee, + 0x9b, 0x10, 0xed, 0x84, 0xf4, 0x6b, 0xad, 0xd4, 0x8e, 0x0a, 0x22, 0x9b, 0xe8, 0x41, + 0x54, 0xa9, 0xbf, 0x75, 0x6b, 0xe0, 0x2e, 0xcf, 0xa9, 0xad, 0x6d, 0x9c, 0x02, 0xc8, + 0xf9, 0x54, 0xcb, 0x15, 0x71, 0x7b, 0x79, 0x46, 0x1f, 0x00, 0x4b, 0xf1, 0xbc, 0x5c, + 0x7e, 0x3f, 0xda, 0x73, 0x53, 0x7c, 0x1a, 0x0a, + ], + ovk: [ + 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, + 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, + 0x0f, 0x26, 0x3b, 0x35, + ], + default_d: [ + 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, + ], + default_pk_d: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, + ], + v: 2111628168871420429, + rseed: [ + 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, + 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, + 0x3b, 0xd5, 0xbc, 0x87, + ], + asset: [ + 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, + 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, + 0x4f, 0x95, 0x22, 0xb2, + ], + memo: [ + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, + 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, 0x0e, + 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, + ], + cv_net: [ + 0xba, 0x69, 0x9c, 0xe4, 0x21, 0x41, 0x85, 0x30, 0x94, 0xe2, 0x84, 0x00, 0x50, 0x17, + 0x2c, 0x3b, 0x94, 0x21, 0x3e, 0x86, 0x47, 0x3b, 0x5e, 0x2f, 0xdd, 0x70, 0x97, 0x80, + 0xbc, 0xca, 0x68, 0xb4, + ], + rho: [ + 0xf6, 0x5d, 0x22, 0x96, 0x09, 0x58, 0xd7, 0x28, 0x59, 0x60, 0x9c, 0x99, 0x46, 0xd8, + 0xa9, 0x4a, 0x06, 0x04, 0xb8, 0x00, 0x6c, 0xc7, 0x94, 0xbc, 0xab, 0x57, 0x73, 0x49, + 0xbc, 0xf8, 0x63, 0x37, + ], + cmx: [ + 0x85, 0xec, 0x16, 0xe8, 0x78, 0x77, 0x33, 0x37, 0x07, 0x9a, 0xec, 0xf3, 0x2c, 0x45, + 0x5e, 0xbf, 0x16, 0x96, 0x8d, 0xa1, 0xd4, 0x34, 0x51, 0xb7, 0xa3, 0x06, 0x87, 0x6c, + 0xa3, 0x08, 0xea, 0x3c, + ], + esk: [ + 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, 0x39, 0x16, 0x0f, 0xe5, + 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, 0xe0, 0xd2, 0x9b, 0x35, + 0x9a, 0xc4, 0xfa, 0x2c, + ], + ephemeral_key: [ + 0x10, 0x0d, 0xf0, 0x1d, 0x49, 0x86, 0x01, 0x21, 0x8a, 0x28, 0x6b, 0x8f, 0x4e, 0x54, + 0xda, 0x9b, 0x3f, 0x14, 0x5c, 0x34, 0x70, 0xa9, 0xdb, 0xc4, 0x14, 0x48, 0x0a, 0xa8, + 0xf2, 0xf4, 0x90, 0x9c, + ], + shared_secret: [ + 0x93, 0x68, 0xdd, 0x4f, 0x2a, 0xf6, 0x23, 0x34, 0xb8, 0x85, 0xb9, 0x6b, 0xc4, 0xc3, + 0x8f, 0x10, 0x3a, 0xec, 0x25, 0x6b, 0xed, 0xc2, 0x8b, 0x5e, 0x2e, 0x10, 0x36, 0x4c, + 0xdd, 0xf3, 0x84, 0xa4, + ], + k_enc: [ + 0x7a, 0xff, 0xfc, 0x6e, 0xae, 0x5d, 0x56, 0xb2, 0x7b, 0x86, 0xdb, 0x9e, 0xc8, 0xae, + 0xc2, 0x70, 0xbb, 0x0a, 0xb7, 0x31, 0x23, 0xfd, 0x2a, 0x0b, 0x83, 0xf4, 0xef, 0x84, + 0xc6, 0x98, 0xe1, 0x67, + ], + p_enc: [ + 0x03, 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, 0x0d, 0x22, + 0x4a, 0xb7, 0xa1, 0x02, 0x4e, 0x1d, 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, + 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, + 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, 0x3b, 0xd5, 0xbc, 0x87, 0xa9, 0x71, 0x5e, 0x65, + 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, + 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, + 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, 0x0e, + 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, + ], + c_enc: [ + 0x45, 0x6b, 0x2b, 0xb8, 0x03, 0xc7, 0xdf, 0xf7, 0xac, 0x82, 0xe6, 0x42, 0xf4, 0xd8, + 0x46, 0x1e, 0x0b, 0x7a, 0x3b, 0x3c, 0x95, 0xa4, 0xcb, 0xf1, 0xc0, 0x6f, 0xeb, 0x93, + 0xa1, 0x8b, 0xeb, 0xa2, 0x9f, 0x2b, 0x8f, 0x12, 0x1a, 0x61, 0x5c, 0xa5, 0x3f, 0xc2, + 0xa7, 0x60, 0x63, 0xb8, 0x0d, 0xaa, 0x71, 0x01, 0x8b, 0x66, 0x3b, 0x7c, 0x46, 0x6d, + 0xb2, 0x63, 0xf9, 0x04, 0x27, 0xd0, 0x11, 0x7f, 0x0b, 0x89, 0x90, 0x6e, 0x98, 0x41, + 0x7f, 0x3e, 0xe8, 0x5a, 0xcc, 0xed, 0xb1, 0x41, 0xfb, 0x10, 0x26, 0xa3, 0xb3, 0xf7, + 0xa4, 0xfd, 0x10, 0x24, 0xf9, 0xc8, 0x08, 0x9a, 0x2e, 0xbe, 0x1a, 0x27, 0x82, 0xf8, + 0xb0, 0xbf, 0x5c, 0x40, 0xb6, 0xd5, 0x2f, 0xfe, 0x38, 0x37, 0xf4, 0xe4, 0x42, 0x52, + 0x13, 0x41, 0xc2, 0x4d, 0x3e, 0x89, 0x55, 0x95, 0x08, 0x86, 0x27, 0x85, 0xea, 0x63, + 0x56, 0xb4, 0xe4, 0x66, 0xc3, 0x25, 0x9c, 0xeb, 0x0d, 0x28, 0x2e, 0x07, 0xbb, 0x35, + 0xdc, 0xf2, 0xd9, 0xa8, 0x62, 0xc7, 0x47, 0x58, 0xd3, 0x83, 0xaa, 0xa2, 0x82, 0xfa, + 0xc4, 0xfa, 0xcf, 0xe5, 0x39, 0xe4, 0xe1, 0xbb, 0xd5, 0x46, 0x8a, 0xcf, 0x25, 0xec, + 0x2b, 0x4b, 0xa5, 0x11, 0x9d, 0xea, 0xed, 0x01, 0x1d, 0x4f, 0x30, 0xb0, 0xc5, 0x82, + 0x01, 0xfe, 0xe1, 0xc6, 0xe4, 0xf6, 0xb5, 0x2e, 0x41, 0xad, 0xfa, 0x5d, 0x6f, 0xda, + 0x94, 0xa5, 0x23, 0x20, 0xe8, 0x3b, 0x80, 0xc6, 0xfc, 0xee, 0xb8, 0x97, 0x89, 0xd8, + 0x79, 0x94, 0xb7, 0xa0, 0x16, 0xec, 0x64, 0xe4, 0x70, 0x78, 0x07, 0xf8, 0xf2, 0xd2, + 0x30, 0x63, 0x10, 0x74, 0x10, 0x9f, 0xc5, 0x9d, 0xe3, 0xe4, 0x37, 0x10, 0xca, 0xe8, + 0x9c, 0xb1, 0x89, 0xa0, 0xa4, 0x64, 0x8b, 0x37, 0x54, 0x5d, 0x25, 0x49, 0x47, 0x95, + 0xa8, 0xdf, 0x3f, 0xfc, 0x7a, 0x3a, 0x21, 0xe3, 0xb9, 0x1c, 0x95, 0x96, 0xe0, 0xd5, + 0x10, 0x5d, 0xf8, 0xad, 0xa9, 0xcf, 0xe9, 0x31, 0x10, 0xb1, 0x9f, 0xf2, 0xaf, 0x83, + 0x03, 0xb5, 0xd2, 0x79, 0x3f, 0xff, 0xd0, 0x4d, 0x8e, 0x02, 0xf7, 0xb9, 0x30, 0x14, + 0x80, 0xdf, 0xd9, 0x35, 0x50, 0x2d, 0x98, 0xe2, 0xf3, 0xc3, 0xe9, 0xe9, 0x5e, 0x64, + 0xe4, 0x96, 0xeb, 0x7d, 0x15, 0xcf, 0x2c, 0x70, 0x11, 0x94, 0xe6, 0x25, 0xde, 0x52, + 0x1a, 0x02, 0x55, 0x20, 0xdf, 0x67, 0xac, 0x2b, 0xa4, 0x3b, 0x9c, 0x4a, 0x6d, 0x77, + 0xb8, 0x6a, 0x40, 0x18, 0x2d, 0x70, 0x31, 0x8b, 0x8f, 0xa3, 0x48, 0xb1, 0x86, 0x47, + 0xd8, 0x4e, 0x0e, 0xe5, 0xf0, 0x56, 0x07, 0xa2, 0xb8, 0xf2, 0x69, 0xe1, 0x86, 0xc7, + 0x94, 0x28, 0xbe, 0xa6, 0x7c, 0xbf, 0x71, 0xda, 0xcc, 0x98, 0xe9, 0xcc, 0x72, 0x5e, + 0x50, 0x53, 0xa4, 0x40, 0xca, 0xa6, 0xca, 0xd2, 0x41, 0xa5, 0x06, 0x28, 0x18, 0x3a, + 0xe9, 0xef, 0x9f, 0x0c, 0xbd, 0xfe, 0xf7, 0x0a, 0x42, 0xe5, 0xb7, 0x97, 0xbc, 0x99, + 0xd9, 0x22, 0xfc, 0xc2, 0x81, 0x37, 0x84, 0xea, 0xe4, 0x48, 0x60, 0x18, 0x0e, 0xf8, + 0xe8, 0x1f, 0x7b, 0x94, 0xf2, 0xad, 0x62, 0x12, 0x8b, 0xb6, 0x1f, 0x10, 0xd5, 0x0c, + 0x9c, 0xad, 0x9d, 0x80, 0x48, 0xd9, 0x78, 0x01, 0x8a, 0x1f, 0x3b, 0xc9, 0x24, 0x28, + 0xf8, 0x9d, 0x7d, 0xdc, 0xe5, 0x45, 0x4b, 0xc4, 0x49, 0x1f, 0xb4, 0xc2, 0xcb, 0x66, + 0x88, 0x35, 0xb2, 0x2f, 0xcc, 0x4d, 0xf2, 0x08, 0xf2, 0x16, 0x64, 0xf7, 0x12, 0x94, + 0xc5, 0xce, 0xd3, 0x3c, 0x8e, 0x11, 0xd4, 0x25, 0xd1, 0x39, 0x85, 0x23, 0xc2, 0x79, + 0x88, 0x3a, 0x38, 0x2f, 0x70, 0xfe, 0xfe, 0xc8, 0x25, 0xc5, 0xe3, 0x50, 0x85, 0xaf, + 0x82, 0xd0, 0xa0, 0xa9, 0xbf, 0x45, 0x11, 0x65, 0x0a, 0x2b, 0xfb, 0xf0, 0xb2, 0x18, + 0x82, 0x10, 0x5e, 0xc6, 0xe5, 0x99, 0x74, 0xd8, 0xd6, 0xce, 0x73, 0x07, 0x8f, 0xb4, + 0xb5, 0x63, 0x4e, 0x85, 0xd7, 0xe2, 0x0a, 0x97, 0xff, 0xb6, 0x5d, 0x4f, 0x5e, 0xaf, + 0x42, 0x63, 0x9b, 0x09, 0xf5, 0xed, 0xa5, 0x9a, 0xb1, 0x04, 0x97, 0x69, 0x95, 0x41, + 0xd1, 0xc8, 0x22, 0x8e, 0xca, 0x31, 0x3f, 0xd0, 0x0a, 0x21, 0xb3, 0x02, 0x7b, 0x40, + 0xd0, 0xc1, 0xfd, 0x4c, 0x2f, 0x0d, 0x97, 0xf1, 0xa9, 0x58, 0xe9, 0x2b, 0x45, 0xd5, + 0xd4, 0xbf, 0xc2, 0xef, 0x18, 0xef, 0xd6, 0xb2, 0x5b, 0x47, 0xa9, 0x4d, 0xae, 0x73, + 0xc3, 0xcf, 0xc9, 0xca, 0xd8, 0xdb, 0x82, 0x3f, 0xbd, 0x74, + ], + ock: [ + 0xc6, 0x7c, 0x23, 0x33, 0xc3, 0xcf, 0x4a, 0xc4, 0x6e, 0xde, 0x34, 0xe3, 0xe3, 0xe0, + 0xdb, 0xff, 0x1e, 0x96, 0xb7, 0xa7, 0x8f, 0x16, 0xaa, 0xef, 0x1c, 0x74, 0xa3, 0xef, + 0x07, 0xc5, 0x97, 0x16, + ], + op: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, + 0x39, 0x16, 0x0f, 0xe5, 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, + 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, + ], + c_out: [ + 0xe4, 0xba, 0x0e, 0xa2, 0x92, 0x3b, 0x40, 0x19, 0xac, 0x8a, 0xbc, 0xd1, 0x9b, 0xe6, + 0x1c, 0x90, 0xf1, 0x8e, 0xef, 0xae, 0x87, 0xc4, 0xed, 0x8c, 0x76, 0x70, 0x85, 0xba, + 0xa8, 0x3b, 0x4d, 0x61, 0x0c, 0xf3, 0x63, 0x70, 0xda, 0x07, 0x90, 0x1e, 0xad, 0x6d, + 0x4f, 0x4b, 0x71, 0xdc, 0xae, 0x31, 0x1f, 0xa0, 0x36, 0x40, 0x6d, 0x64, 0x7b, 0x7e, + 0xe1, 0x41, 0x1e, 0xf5, 0xae, 0xe0, 0x34, 0x68, 0xb1, 0x09, 0x13, 0xc9, 0x90, 0xcb, + 0x61, 0x61, 0x22, 0xeb, 0xbe, 0x49, 0xda, 0x67, 0x81, 0xc2, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xb6, 0x6c, 0x73, 0x33, 0x75, 0xda, 0xc6, 0xff, 0xcc, 0x98, 0xf5, 0x0f, 0x3a, 0xf0, + 0xb0, 0x76, 0x05, 0x53, 0xfe, 0x98, 0xed, 0x61, 0xff, 0xa4, 0x93, 0xea, 0xe6, 0x8d, + 0xf0, 0xb3, 0x33, 0x4e, 0xe8, 0xd4, 0x39, 0x37, 0xb7, 0xdb, 0x8e, 0xbb, 0xfe, 0xbd, + 0x54, 0x8a, 0x28, 0x02, 0x51, 0xea, 0x87, 0xaa, 0x5d, 0x8c, 0xa5, 0x36, 0x86, 0x1b, + 0x38, 0x4f, 0x20, 0x86, 0x9f, 0x8f, 0xe8, 0x01, + ], + ovk: [ + 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, 0x3f, 0x38, 0x0a, 0x4d, + 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, 0x3d, 0x73, 0x45, 0x9a, + 0xfe, 0x24, 0x1f, 0x72, + ], + default_d: [ + 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, + ], + default_pk_d: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, + ], + v: 16065731808124965111, + rseed: [ + 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, + 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, + 0x71, 0x8c, 0x29, 0xdd, + ], + asset: [ + 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, + 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, + 0xfd, 0x7d, 0x05, 0x8a, + ], + memo: [ + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, + 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, + 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, 0xe3, + ], + cv_net: [ + 0x0a, 0x1f, 0x28, 0x15, 0xb7, 0xaf, 0xe2, 0x19, 0x06, 0x87, 0x15, 0xfc, 0x76, 0x6b, + 0x87, 0x2e, 0xf2, 0x17, 0x35, 0x43, 0xac, 0x81, 0x4c, 0x32, 0xb4, 0xb6, 0x9c, 0x9c, + 0x34, 0x5e, 0x46, 0x98, + ], + rho: [ + 0x27, 0x3c, 0x68, 0xd1, 0x9c, 0xda, 0xa8, 0x62, 0x8b, 0xac, 0x37, 0xa2, 0xd4, 0x2c, + 0x51, 0x1c, 0x9b, 0xab, 0x65, 0xb6, 0xd8, 0xd5, 0xc5, 0xbd, 0x1e, 0x32, 0x77, 0x1a, + 0xb6, 0xf6, 0x4c, 0x26, + ], + cmx: [ + 0x40, 0x8f, 0x59, 0x4f, 0xdd, 0xc5, 0x0c, 0x67, 0xf5, 0x47, 0xe1, 0xeb, 0x3e, 0xa2, + 0x99, 0xa3, 0x1f, 0x69, 0xf5, 0x7f, 0xc9, 0x92, 0x03, 0x01, 0x42, 0x90, 0x35, 0xa6, + 0xc2, 0x49, 0x79, 0x1a, + ], + esk: [ + 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, 0xef, 0x08, 0xbd, 0xf6, + 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, 0xf5, 0x3b, 0x57, 0xc3, + 0x45, 0xa9, 0x87, 0x2f, + ], + ephemeral_key: [ + 0xa5, 0xc8, 0x0a, 0x29, 0xf2, 0xec, 0xdd, 0xd7, 0x01, 0x96, 0xef, 0x45, 0x9e, 0xd5, + 0x03, 0xc4, 0xb3, 0xc2, 0x22, 0x8d, 0x10, 0xcc, 0xbc, 0xad, 0x9a, 0x28, 0x23, 0x30, + 0x07, 0x7b, 0xca, 0x0c, + ], + shared_secret: [ + 0x37, 0x14, 0x15, 0xfc, 0x1e, 0x98, 0x42, 0xa1, 0x26, 0xa3, 0x7a, 0xa7, 0x7b, 0x8f, + 0x0f, 0x1a, 0xb6, 0x48, 0xa3, 0xf7, 0x43, 0x57, 0x34, 0x89, 0x6f, 0x07, 0x59, 0x52, + 0xe7, 0xd1, 0x60, 0x17, + ], + k_enc: [ + 0xd7, 0x36, 0xf0, 0x3c, 0x81, 0x2d, 0x9b, 0xf9, 0x54, 0xff, 0xd2, 0x41, 0x84, 0x07, + 0xf3, 0x36, 0xa5, 0xf9, 0x69, 0x8b, 0x62, 0x85, 0x23, 0x2f, 0x5c, 0x85, 0xf0, 0xd1, + 0x1d, 0x5e, 0x9d, 0x0a, + ], + p_enc: [ + 0x03, 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, 0xf7, 0x90, + 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, + 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, + 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, 0xdf, 0xfd, 0x79, 0xa9, + 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, + 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, + 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, + 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, 0xe3, + ], + c_enc: [ + 0xfc, 0x90, 0xcb, 0xe1, 0xcd, 0x9f, 0x59, 0x9a, 0x1a, 0x24, 0xc7, 0xa3, 0xea, 0xf6, + 0x07, 0xd9, 0x13, 0xbf, 0x48, 0xbd, 0xc1, 0xa4, 0x6d, 0xf7, 0xb1, 0x74, 0x7f, 0x12, + 0x60, 0x64, 0x49, 0x4b, 0xf5, 0x39, 0x61, 0xe9, 0xa5, 0xa2, 0xb9, 0x69, 0x80, 0x57, + 0x63, 0x44, 0x2e, 0x2c, 0x38, 0x8d, 0x21, 0x2d, 0x74, 0x84, 0x6e, 0x57, 0x27, 0x87, + 0x2d, 0x06, 0x3f, 0xc9, 0x94, 0xa4, 0x4f, 0x9e, 0xb6, 0x55, 0x25, 0xd6, 0x8f, 0x98, + 0x24, 0xa6, 0x03, 0x75, 0xfe, 0x43, 0xc0, 0x5f, 0x08, 0xfe, 0x45, 0x42, 0xa7, 0xe4, + 0x0c, 0x03, 0x8d, 0xe7, 0x10, 0x85, 0x01, 0x17, 0x95, 0x1b, 0x9a, 0x32, 0x1e, 0xea, + 0x4f, 0x8c, 0x91, 0xc0, 0x1d, 0x39, 0xdb, 0xb5, 0xd4, 0x12, 0x40, 0xf8, 0xb1, 0xb1, + 0xdb, 0xb3, 0x3f, 0x45, 0x87, 0x87, 0xdb, 0x8c, 0xda, 0x06, 0x9b, 0x64, 0x5a, 0x76, + 0x38, 0xc2, 0xec, 0xca, 0xd3, 0xd9, 0xa7, 0x39, 0xd6, 0x4c, 0x9a, 0xd5, 0xd5, 0xb3, + 0xa0, 0x24, 0x55, 0xa4, 0xec, 0xd6, 0x96, 0x7c, 0xf3, 0xb3, 0x3b, 0xf0, 0x4e, 0xf6, + 0xdd, 0x88, 0x10, 0xe1, 0x0c, 0x25, 0x86, 0xf7, 0x89, 0x32, 0x44, 0xea, 0x72, 0x80, + 0xd1, 0x34, 0xcf, 0x37, 0xb3, 0xdc, 0x0c, 0x32, 0x82, 0x3b, 0x1a, 0x29, 0xc5, 0x0c, + 0xa6, 0x48, 0x31, 0xd8, 0x4e, 0xbd, 0xf5, 0xe0, 0x1c, 0x14, 0xca, 0x36, 0x05, 0xbe, + 0x02, 0xf1, 0x5f, 0x31, 0x57, 0x90, 0xf7, 0x4e, 0x20, 0x57, 0x7f, 0x92, 0x39, 0x51, + 0x2f, 0xbd, 0xdd, 0x67, 0x63, 0x77, 0xae, 0x50, 0xc3, 0xfe, 0x71, 0xc9, 0x30, 0xa8, + 0x29, 0x57, 0xd1, 0x54, 0x70, 0xeb, 0x1b, 0x55, 0xb2, 0x0c, 0xe5, 0x02, 0x35, 0x64, + 0xfe, 0xa7, 0xe1, 0x81, 0xbe, 0x04, 0xa9, 0x33, 0xa7, 0xa3, 0xa1, 0x11, 0x89, 0x4d, + 0xec, 0xf7, 0x2a, 0x56, 0x54, 0xcb, 0x4e, 0xac, 0x32, 0xe1, 0xd5, 0x96, 0xad, 0x99, + 0x1a, 0x2f, 0x4c, 0x62, 0xe8, 0xe2, 0x82, 0x57, 0x13, 0x7b, 0xcb, 0xa5, 0x03, 0xdc, + 0x91, 0xed, 0x9e, 0x90, 0xb3, 0x08, 0xcd, 0xa5, 0xcc, 0xcc, 0xc9, 0xd1, 0x4e, 0xa6, + 0xd0, 0x3b, 0x3d, 0xec, 0xa1, 0x57, 0xd5, 0x30, 0xde, 0x63, 0x1e, 0x1e, 0x45, 0x8f, + 0x6a, 0x60, 0x8e, 0x1f, 0x9d, 0x57, 0x9b, 0x6e, 0xe6, 0x00, 0x5c, 0xd0, 0xa8, 0xc3, + 0xe2, 0xdf, 0x89, 0x46, 0x8a, 0xcf, 0xb4, 0x36, 0xcb, 0x59, 0x84, 0x56, 0xf0, 0x38, + 0x95, 0x5d, 0xc6, 0xb4, 0x07, 0xec, 0x33, 0x00, 0xa5, 0xcf, 0xcd, 0xc8, 0x45, 0x47, + 0xe3, 0xef, 0xe9, 0xfc, 0xa1, 0x7e, 0xd2, 0xc2, 0x74, 0xf0, 0x03, 0x0b, 0x63, 0xcc, + 0x42, 0xe2, 0x38, 0x94, 0xa5, 0xf2, 0x53, 0x66, 0xcb, 0xc3, 0xbf, 0xcb, 0x77, 0x2d, + 0x04, 0x17, 0xf6, 0x24, 0x4b, 0x2f, 0xd8, 0x17, 0xc4, 0xc6, 0x79, 0x06, 0xc3, 0x38, + 0x4d, 0x69, 0xd7, 0x93, 0xef, 0xca, 0x6e, 0x5d, 0x6a, 0xf2, 0x5e, 0x4e, 0xbc, 0x0f, + 0x53, 0x56, 0xeb, 0x74, 0x28, 0x85, 0x19, 0xe8, 0xf4, 0x49, 0x38, 0xeb, 0xf9, 0xb2, + 0x5b, 0xe5, 0x85, 0xe1, 0x35, 0x1f, 0x62, 0x59, 0x6c, 0x31, 0x79, 0xca, 0xe4, 0x5e, + 0x75, 0x49, 0xd7, 0xfb, 0xb5, 0x91, 0x3b, 0xe9, 0xc3, 0xba, 0xa5, 0x7c, 0xab, 0x7c, + 0xd4, 0xb5, 0x67, 0x12, 0x8d, 0x1b, 0xa5, 0x20, 0x31, 0xd7, 0xd5, 0xa5, 0xbd, 0x69, + 0xde, 0x61, 0x4a, 0xbb, 0x8c, 0xa3, 0x8a, 0x94, 0x51, 0xcd, 0x1b, 0xad, 0xd9, 0x71, + 0xb3, 0xf1, 0xb0, 0xb5, 0x0c, 0x7f, 0x21, 0xbf, 0xc4, 0x23, 0x04, 0xa4, 0xa5, 0x3e, + 0x0d, 0x55, 0x92, 0x0d, 0xa0, 0x53, 0x27, 0x14, 0x79, 0x13, 0x45, 0xfb, 0x07, 0x4c, + 0x66, 0xc4, 0xb7, 0xc9, 0x89, 0x28, 0x30, 0xf9, 0x62, 0x09, 0xb8, 0x1c, 0x26, 0xd1, + 0x74, 0xf8, 0xa9, 0x33, 0xc3, 0x77, 0x9d, 0x97, 0x88, 0x55, 0x3f, 0x6e, 0xeb, 0x21, + 0xf7, 0xdb, 0x57, 0x78, 0xf4, 0xf8, 0x17, 0x4c, 0xb4, 0x6f, 0x71, 0xfd, 0xdc, 0x4b, + 0xe4, 0xd8, 0x70, 0x3e, 0xbf, 0xbc, 0xd2, 0xa7, 0x72, 0x89, 0xee, 0xfa, 0x72, 0x76, + 0x56, 0x74, 0xdb, 0xf0, 0x43, 0xd4, 0x25, 0x8c, 0xcc, 0x4a, 0x2f, 0x16, 0x5c, 0x02, + 0xdc, 0xdb, 0x57, 0x2a, 0x70, 0x9d, 0x58, 0x45, 0x83, 0xe9, 0xde, 0x07, 0x8f, 0x1b, + 0x6c, 0x0c, 0x67, 0xf2, 0x8f, 0x17, 0xae, 0x52, 0x30, 0x19, 0x83, 0xf7, 0x9c, 0x28, + 0x83, 0x95, 0xa3, 0x99, 0x63, 0x65, 0xa2, 0x0c, 0x22, 0x9e, + ], + ock: [ + 0x2f, 0x88, 0x37, 0x27, 0xb5, 0x4d, 0x06, 0x25, 0xcf, 0xdc, 0x19, 0x5a, 0xce, 0x10, + 0xca, 0xc0, 0x26, 0x8a, 0xba, 0x3d, 0xe2, 0x8a, 0xd6, 0x08, 0x88, 0x06, 0x50, 0x6d, + 0x69, 0xc4, 0xdd, 0x8e, + ], + op: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, + 0xef, 0x08, 0xbd, 0xf6, 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, + 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, + ], + c_out: [ + 0x99, 0x96, 0x90, 0xd4, 0xcd, 0xd9, 0xe7, 0x6b, 0x07, 0x2c, 0x3c, 0x4c, 0x41, 0xbf, + 0xc7, 0x9a, 0xaa, 0xc6, 0x7f, 0xdc, 0x0f, 0x41, 0xe8, 0x0e, 0x95, 0x48, 0x80, 0x0e, + 0xef, 0xbc, 0x95, 0x74, 0xf1, 0x5d, 0x64, 0xa6, 0x9e, 0x44, 0x47, 0xc4, 0x5b, 0x07, + 0x0c, 0x6c, 0x9f, 0x50, 0x0a, 0xdd, 0xef, 0x6f, 0x57, 0x14, 0xa5, 0x76, 0x22, 0x1f, + 0x3f, 0xbc, 0x61, 0x22, 0x8d, 0x95, 0xc3, 0xac, 0xe4, 0x21, 0x4b, 0xb6, 0xcf, 0x5b, + 0xd9, 0x69, 0x84, 0xd7, 0x78, 0x96, 0x0d, 0xe9, 0x0c, 0x02, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x8c, 0x45, 0x43, 0xe1, 0x1f, 0x9f, 0x30, 0x7e, 0xc9, 0x04, 0x31, 0x61, 0x29, 0x46, + 0xfb, 0x01, 0x81, 0xb3, 0x6e, 0x1b, 0x52, 0xdb, 0x43, 0x1e, 0x6d, 0xf9, 0x38, 0x8c, + 0xac, 0xd3, 0x08, 0xe8, 0x99, 0xd9, 0x3f, 0x70, 0xad, 0x2a, 0xea, 0xec, 0x99, 0x5e, + 0xcc, 0xe1, 0x80, 0x1c, 0x61, 0x56, 0xe2, 0x3e, 0xc4, 0x1b, 0x1a, 0xe1, 0xcd, 0x2f, + 0xd6, 0xe3, 0x9b, 0x69, 0x98, 0x2f, 0x46, 0x33, + ], + ovk: [ + 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, 0xda, 0x57, 0x96, 0xfa, 0xae, + 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, 0x09, 0x3e, 0x2c, 0x1f, 0x3a, + 0xe8, 0x55, 0xf6, 0x5a, + ], + default_d: [ + 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, + ], + default_pk_d: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, + ], + v: 3775288302605163507, + rseed: [ + 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, + 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, + 0x3e, 0xcd, 0xd7, 0x99, + ], + asset: [ + 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, + 0x5a, 0x31, 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, + 0xb4, 0x42, 0x68, 0x3c, + ], + memo: [ + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, + 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, + 0xc2, 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, + ], + cv_net: [ + 0xde, 0x2b, 0xfc, 0x89, 0x5b, 0xa8, 0xb5, 0x43, 0x03, 0x93, 0x43, 0x4e, 0x20, 0x92, + 0xce, 0xe7, 0x81, 0xe4, 0x00, 0x28, 0x5c, 0xc6, 0x66, 0xbc, 0x6c, 0x41, 0x89, 0xdb, + 0x2d, 0xda, 0x71, 0x92, + ], + rho: [ + 0xea, 0x1d, 0x9d, 0x26, 0x5e, 0xf4, 0x8a, 0x18, 0x97, 0x89, 0x70, 0xb1, 0x76, 0x7b, + 0xe0, 0xe8, 0x14, 0x11, 0x94, 0x7e, 0x9e, 0x69, 0xb7, 0x19, 0xfa, 0xb7, 0x41, 0x72, + 0x1d, 0x40, 0x9b, 0x33, + ], + cmx: [ + 0x9e, 0x3d, 0x61, 0x35, 0x6b, 0x0d, 0x88, 0x95, 0x9e, 0x3f, 0x0f, 0xcc, 0x4a, 0x93, + 0x2e, 0x93, 0x2e, 0xac, 0xbc, 0x80, 0x1d, 0x48, 0xc0, 0x19, 0x5b, 0x9c, 0x8b, 0xd1, + 0x05, 0x5a, 0x8e, 0x2e, + ], + esk: [ + 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, 0xa9, 0x19, 0xa2, 0x06, + 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, 0x25, 0xec, 0xff, 0x47, + 0x72, 0x16, 0x8c, 0x05, + ], + ephemeral_key: [ + 0xc1, 0xce, 0x25, 0xfb, 0x89, 0xe5, 0xca, 0x89, 0x97, 0xf9, 0xb4, 0xbb, 0x0e, 0x1e, + 0xfb, 0xcc, 0x1a, 0x8c, 0xbf, 0x44, 0xec, 0xfd, 0x33, 0x2c, 0x6c, 0x5c, 0x17, 0x3b, + 0xb1, 0x1f, 0xb5, 0x87, + ], + shared_secret: [ + 0x2e, 0xe5, 0x69, 0xce, 0xb3, 0xfd, 0xb8, 0x67, 0xa5, 0xd8, 0x4c, 0x92, 0x68, 0x24, + 0xef, 0x54, 0x9f, 0x2d, 0xd2, 0x8f, 0x8b, 0x04, 0x8d, 0x67, 0xd0, 0x28, 0x81, 0x7d, + 0xbf, 0xf5, 0xd2, 0xb1, + ], + k_enc: [ + 0x41, 0x4d, 0x80, 0x67, 0xc9, 0xfe, 0xbd, 0x5e, 0xbc, 0xd9, 0xae, 0x8c, 0x05, 0x99, + 0x4e, 0x3b, 0x06, 0x85, 0xc8, 0x86, 0x6f, 0x88, 0x95, 0x94, 0xc3, 0x74, 0xb3, 0x75, + 0xac, 0x2c, 0x6d, 0x24, + ], + p_enc: [ + 0x03, 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, 0xf3, 0xdb, + 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, + 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, + 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0xa6, 0x33, 0x05, 0x44, + 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, 0xf6, 0x2e, + 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, 0x42, 0x68, 0x3c, + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, + 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, + 0xc2, 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, + ], + c_enc: [ + 0xbc, 0x8a, 0x16, 0xfd, 0x57, 0xbc, 0x03, 0x60, 0x59, 0xe5, 0x4d, 0xc2, 0xbc, 0xfa, + 0xad, 0x9c, 0xc1, 0xfa, 0xe8, 0xcb, 0x2b, 0xe2, 0xa0, 0xc8, 0x5e, 0x81, 0x6c, 0x67, + 0xfd, 0xcd, 0x0b, 0x93, 0xe6, 0xa1, 0xed, 0xc8, 0x3b, 0xfa, 0xc4, 0x1e, 0xb4, 0x19, + 0x1c, 0x56, 0x4b, 0xac, 0x58, 0x01, 0x62, 0x92, 0x2d, 0x88, 0x25, 0x30, 0x28, 0xeb, + 0x88, 0xed, 0x46, 0xbf, 0x24, 0x2d, 0x82, 0x28, 0x6c, 0xb0, 0xa5, 0x66, 0xce, 0x01, + 0x18, 0x09, 0x4c, 0x90, 0x8f, 0xc2, 0x68, 0xb3, 0x2b, 0xcb, 0xdc, 0x4c, 0x22, 0x82, + 0xc5, 0x24, 0x2a, 0x65, 0x15, 0x48, 0x8b, 0x83, 0x3d, 0x29, 0x8e, 0x49, 0xda, 0x33, + 0x3a, 0xdd, 0x96, 0xc9, 0x9b, 0x98, 0xac, 0x06, 0x7f, 0x21, 0x41, 0x28, 0x9a, 0xcd, + 0x89, 0x49, 0x64, 0xfc, 0xf8, 0x94, 0xc9, 0x26, 0xf1, 0x81, 0xb1, 0x19, 0x85, 0x68, + 0xb1, 0xdd, 0x6f, 0x5e, 0xd1, 0x22, 0xdc, 0x70, 0x44, 0xad, 0x96, 0x76, 0xa7, 0xc5, + 0xae, 0x8e, 0xa9, 0x0f, 0x64, 0xbc, 0x59, 0x09, 0x36, 0xe0, 0xdf, 0x53, 0x1c, 0x1b, + 0x94, 0xb7, 0x35, 0xcd, 0x7b, 0x18, 0x73, 0xc8, 0x51, 0x6f, 0xea, 0x83, 0x64, 0x91, + 0x40, 0xbc, 0xbb, 0x9b, 0x42, 0xea, 0x6c, 0xb7, 0xaf, 0x67, 0xdc, 0x2d, 0xdb, 0xb4, + 0x7a, 0xb2, 0x25, 0xe7, 0x98, 0x29, 0xcd, 0xaf, 0x77, 0x04, 0xfb, 0x56, 0x5b, 0x43, + 0x91, 0x76, 0xf3, 0x35, 0xe4, 0x2b, 0x64, 0xc1, 0x6d, 0xdf, 0xe0, 0x88, 0x45, 0x38, + 0xbf, 0x43, 0x33, 0xe3, 0x2c, 0xa1, 0xe6, 0x27, 0x41, 0xc3, 0xe7, 0x4c, 0x8f, 0xaa, + 0xde, 0x0d, 0x89, 0xfa, 0x10, 0x30, 0xcd, 0x8e, 0xfd, 0x20, 0x22, 0x3e, 0x41, 0xc3, + 0xfc, 0xca, 0xaa, 0xe7, 0x76, 0xe6, 0x8e, 0xe8, 0x40, 0x56, 0x6f, 0x4d, 0x13, 0xc1, + 0xc9, 0xd5, 0xcb, 0xbe, 0xcf, 0xa7, 0x49, 0x9d, 0x43, 0x12, 0x7c, 0xe8, 0xfd, 0x83, + 0xdb, 0x6e, 0x89, 0x67, 0x90, 0x32, 0x25, 0x24, 0x87, 0x21, 0x40, 0x0d, 0x5e, 0x3e, + 0xc0, 0xc1, 0x8e, 0x10, 0xf5, 0xe6, 0x6e, 0x10, 0x17, 0x0c, 0xb3, 0x74, 0x48, 0x22, + 0x4a, 0xde, 0x39, 0x9f, 0x1d, 0x74, 0xa2, 0x16, 0x7d, 0x9f, 0xdb, 0xfe, 0x36, 0xe1, + 0x28, 0xe4, 0x8c, 0x01, 0x62, 0x61, 0x16, 0xc1, 0xa2, 0xdf, 0x3c, 0xb0, 0x23, 0xd8, + 0x0a, 0xed, 0x9b, 0xfc, 0x02, 0x71, 0xb8, 0x1f, 0xf9, 0x79, 0x81, 0x01, 0x6f, 0xff, + 0x19, 0x61, 0x08, 0x88, 0x8b, 0xcb, 0xca, 0x84, 0x5b, 0x5d, 0x97, 0x1b, 0xd5, 0x4f, + 0x49, 0x7d, 0x3f, 0x3a, 0x09, 0x29, 0x9e, 0x56, 0x50, 0xd3, 0x26, 0xd8, 0x9b, 0x9a, + 0x5e, 0xff, 0x3e, 0xbd, 0x27, 0x39, 0x34, 0xc4, 0x9f, 0x81, 0x46, 0x7e, 0xb8, 0x4f, + 0x56, 0x98, 0x90, 0xcf, 0x89, 0x05, 0xb7, 0x4c, 0xd3, 0xed, 0xa6, 0x3c, 0x53, 0x88, + 0xd5, 0x51, 0x5e, 0x3f, 0xd8, 0x1c, 0x70, 0xc1, 0x5e, 0x2a, 0x98, 0x2d, 0x59, 0x0e, + 0x87, 0xb8, 0x64, 0x45, 0x4b, 0xcd, 0xf5, 0xf8, 0x4d, 0x9f, 0x11, 0xcb, 0x9c, 0xf2, + 0xb5, 0xde, 0x3c, 0x5e, 0x0e, 0x2a, 0x6c, 0x48, 0x16, 0x61, 0x64, 0x96, 0x6f, 0xb9, + 0x0d, 0xac, 0xf8, 0x67, 0x4f, 0x9f, 0x1a, 0x34, 0xd2, 0xcd, 0xc7, 0xc9, 0x48, 0xab, + 0x99, 0xc3, 0x58, 0xa1, 0x95, 0x47, 0x0a, 0xdd, 0x06, 0x5e, 0xaf, 0x79, 0x24, 0xfa, + 0xed, 0x63, 0x27, 0xa6, 0x10, 0xf5, 0x2e, 0xd5, 0xd3, 0xa8, 0x7e, 0x11, 0xb5, 0x97, + 0x4f, 0xa0, 0x60, 0x45, 0xa4, 0x08, 0x95, 0xcd, 0xad, 0x60, 0x1c, 0xae, 0x01, 0xed, + 0xda, 0x17, 0x52, 0x81, 0x62, 0xd7, 0x21, 0x24, 0xf2, 0x05, 0x6b, 0x9a, 0xb8, 0xc0, + 0xc0, 0xf5, 0xc6, 0xdd, 0xaa, 0x0f, 0x5e, 0x33, 0xfb, 0x04, 0x23, 0x0b, 0x61, 0x1b, + 0xff, 0xd8, 0xbd, 0xdc, 0x63, 0x4c, 0x79, 0x60, 0xa3, 0xd4, 0xe6, 0x8f, 0x21, 0xe7, + 0x83, 0x04, 0xe4, 0xc4, 0xd2, 0xdc, 0xd6, 0xa1, 0x9c, 0xfc, 0x04, 0x57, 0x97, 0x09, + 0xf0, 0x33, 0xf1, 0x95, 0x78, 0xae, 0x7f, 0x0b, 0xc6, 0x46, 0x32, 0xa6, 0xd7, 0xda, + 0x40, 0xdc, 0x0c, 0x38, 0x1d, 0xd4, 0x49, 0xe1, 0xa0, 0xb0, 0xe7, 0xf8, 0xc5, 0xfe, + 0x88, 0xaa, 0x93, 0x4e, 0x16, 0xc8, 0xf1, 0xdb, 0xef, 0x72, 0x88, 0x34, 0xcf, 0x25, + 0x30, 0xe3, 0x3f, 0xb9, 0x27, 0xe9, 0x96, 0xce, 0x48, 0x89, 0xf9, 0xf6, 0xf4, 0x42, + 0x1c, 0x60, 0x78, 0xb0, 0x8d, 0x72, 0x2d, 0xc4, 0x4a, 0xb7, + ], + ock: [ + 0x9c, 0xba, 0xd2, 0xf3, 0x8b, 0xf8, 0x8f, 0x39, 0x47, 0xce, 0xf6, 0x4d, 0xe7, 0xa6, + 0xf4, 0x3e, 0x4c, 0xbb, 0x41, 0xe6, 0xe0, 0x37, 0xf1, 0x42, 0x01, 0xae, 0xe8, 0xab, + 0xfd, 0xf8, 0xa2, 0x35, + ], + op: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, + 0xa9, 0x19, 0xa2, 0x06, 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, + 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, + ], + c_out: [ + 0xf6, 0x25, 0xcd, 0x3d, 0x19, 0x97, 0xb0, 0xd3, 0xf2, 0x29, 0x5a, 0xac, 0xc0, 0x3a, + 0xe0, 0xc9, 0x47, 0x28, 0xb3, 0x3c, 0xc4, 0xf1, 0x6f, 0xd4, 0x28, 0xd6, 0x5f, 0x3c, + 0x78, 0x5e, 0x8c, 0x0b, 0xb4, 0x66, 0xc1, 0x33, 0xd4, 0x83, 0xdf, 0xc5, 0xb1, 0xb3, + 0x15, 0x1d, 0xa2, 0xd5, 0xf2, 0x4a, 0x2b, 0x32, 0x0d, 0x8e, 0x9c, 0xd3, 0x41, 0x5c, + 0x25, 0xb6, 0xf9, 0x76, 0x1f, 0x42, 0x70, 0x04, 0xce, 0xe5, 0x4f, 0x75, 0xf1, 0x25, + 0xbc, 0x50, 0x5e, 0xf6, 0x26, 0xef, 0xc9, 0xdd, 0x63, 0x66, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x47, 0x30, 0x68, 0xbf, 0x68, 0xe5, 0x0b, 0xe3, 0x85, 0x7d, 0xec, 0xb2, 0xef, 0xd5, + 0xde, 0x20, 0xea, 0xc8, 0x1b, 0x37, 0x5b, 0xd0, 0xbb, 0xe8, 0x36, 0x86, 0x6e, 0x99, + 0x36, 0x3b, 0x37, 0x50, 0x9d, 0x53, 0x8f, 0xcc, 0xa9, 0x33, 0x37, 0xad, 0xbc, 0x24, + 0x81, 0xe2, 0x70, 0x26, 0x18, 0x4c, 0x3f, 0x4f, 0x48, 0xcc, 0x5d, 0x5a, 0x0e, 0x4a, + 0x4c, 0xfa, 0x4d, 0x6a, 0x24, 0x7f, 0x2e, 0x39, + ], + ovk: [ + 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, 0x66, 0x46, 0x61, 0x9a, 0xf0, 0x24, 0x56, + 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, + 0xd3, 0x33, 0xe1, 0x84, + ], + default_d: [ + 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, + ], + default_pk_d: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, + ], + v: 15119422206032203650, + rseed: [ + 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, + 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, + 0x2d, 0x9b, 0x4c, 0x8f, + ], + asset: [ + 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, + 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, + 0x38, 0xe1, 0x73, 0x29, + ], + memo: [ + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, 0x02, 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, + 0x68, 0xbc, 0x1c, 0xae, 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, + 0x6b, 0x3f, 0xd5, 0xd4, 0x61, 0xb0, 0x95, 0x1c, + ], + cv_net: [ + 0x45, 0x37, 0x85, 0x3e, 0x18, 0xac, 0x2c, 0xe9, 0x37, 0x79, 0x8c, 0x9b, 0xce, 0xa9, + 0x80, 0x2d, 0x65, 0x00, 0x74, 0xdb, 0xd7, 0xe0, 0x6a, 0x48, 0x98, 0x03, 0x15, 0x30, + 0x78, 0xe9, 0x97, 0x0b, + ], + rho: [ + 0x9a, 0xd0, 0x7f, 0x1c, 0x28, 0x7b, 0xdd, 0x53, 0x4f, 0x6f, 0x7e, 0xae, 0x08, 0xf7, + 0x85, 0x72, 0xa3, 0x05, 0xfa, 0x3b, 0x70, 0x68, 0xa3, 0x78, 0x38, 0x27, 0xaf, 0xe2, + 0x14, 0x7a, 0x27, 0x10, + ], + cmx: [ + 0xf2, 0x04, 0x22, 0x51, 0xa0, 0x59, 0xa2, 0xf5, 0x8a, 0xb8, 0xe9, 0x0b, 0x52, 0x64, + 0xd0, 0xa4, 0x3f, 0x96, 0xd7, 0x7e, 0xdd, 0x54, 0xf8, 0x0f, 0xf4, 0x9d, 0x43, 0x86, + 0x81, 0x4d, 0x73, 0x2e, + ], + esk: [ + 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, 0x1d, 0xa4, 0xb1, 0x44, + 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, 0xaf, 0x2b, 0xd1, 0xa0, + 0x8c, 0x67, 0xd9, 0x3f, + ], + ephemeral_key: [ + 0x46, 0x73, 0x1f, 0xff, 0xc5, 0x9a, 0xf4, 0xc1, 0x28, 0x82, 0xbc, 0xca, 0xea, 0xa7, + 0xb8, 0xed, 0x39, 0x0b, 0x14, 0x66, 0x72, 0xe1, 0x36, 0x51, 0xc3, 0x2e, 0x57, 0x80, + 0x62, 0x68, 0x65, 0xa7, + ], + shared_secret: [ + 0x9d, 0x56, 0xbd, 0x96, 0x00, 0x39, 0x62, 0x5e, 0x11, 0x7d, 0x7b, 0xfe, 0xd4, 0x3a, + 0x57, 0x3b, 0x11, 0x51, 0x7f, 0xfa, 0x76, 0x14, 0xea, 0x2d, 0xa7, 0x7e, 0xdf, 0x62, + 0x7f, 0x6f, 0x13, 0xaa, + ], + k_enc: [ + 0x04, 0x2f, 0x92, 0x82, 0x13, 0x44, 0xde, 0x97, 0x7c, 0xee, 0x89, 0x9e, 0xd2, 0x1b, + 0xc8, 0x48, 0xf5, 0xc4, 0xfe, 0xdc, 0x39, 0xf2, 0xdf, 0xed, 0xad, 0x62, 0xcc, 0x7a, + 0x92, 0x7f, 0x74, 0xfd, + ], + p_enc: [ + 0x03, 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, 0x82, 0xcf, + 0xb3, 0xe7, 0x63, 0xfa, 0xd2, 0xd1, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, + 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, + 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0x61, 0x16, 0xcf, 0xec, + 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, + 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, 0x02, 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, + 0x68, 0xbc, 0x1c, 0xae, 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, + 0x6b, 0x3f, 0xd5, 0xd4, 0x61, 0xb0, 0x95, 0x1c, + ], + c_enc: [ + 0x16, 0x76, 0x72, 0x3a, 0x18, 0xff, 0x58, 0x77, 0x70, 0x15, 0x8d, 0x6b, 0x85, 0x09, + 0x3c, 0x49, 0x20, 0x16, 0xf8, 0x7e, 0xc3, 0xfa, 0xe8, 0xb0, 0xb4, 0x7c, 0xd9, 0x29, + 0x8f, 0xa2, 0x07, 0xc4, 0xb6, 0x09, 0xc6, 0x92, 0xdd, 0xb9, 0x10, 0x19, 0x72, 0xc9, + 0x4c, 0x71, 0x87, 0x84, 0x85, 0x42, 0x1e, 0xfb, 0x70, 0x1c, 0xf5, 0x15, 0xa2, 0x3f, + 0xbf, 0x36, 0xfe, 0x93, 0x54, 0x0d, 0x82, 0xd6, 0x9a, 0x72, 0x62, 0x4e, 0x25, 0x4f, + 0xe3, 0xa0, 0x11, 0xc5, 0xdb, 0xdb, 0xd2, 0xbd, 0xff, 0xb8, 0x83, 0x8a, 0xf3, 0x7d, + 0x03, 0xce, 0x69, 0x12, 0x6b, 0x2f, 0x68, 0x21, 0x25, 0xb7, 0xa9, 0xb2, 0xa3, 0xee, + 0x11, 0x8a, 0xe5, 0xad, 0xb4, 0x60, 0xa4, 0x68, 0x7c, 0x24, 0x30, 0x18, 0x7b, 0xfd, + 0x0f, 0x6c, 0x2a, 0x3d, 0x5d, 0x74, 0x30, 0x1c, 0xbd, 0x8f, 0xd0, 0x26, 0xc8, 0x64, + 0x4f, 0xbf, 0xa2, 0x65, 0x69, 0x88, 0xe9, 0x58, 0x59, 0x0b, 0x81, 0x6a, 0x1e, 0x64, + 0x0e, 0x46, 0x71, 0x0e, 0x46, 0xfa, 0x15, 0x94, 0xff, 0x2a, 0x61, 0xd6, 0xf6, 0xe7, + 0xb4, 0xa9, 0xf6, 0xe0, 0xde, 0x68, 0x3d, 0x95, 0xe5, 0x9d, 0x43, 0x57, 0xf7, 0x9a, + 0xc4, 0x93, 0x86, 0x6d, 0xab, 0x06, 0x57, 0x76, 0xc0, 0xb1, 0x43, 0x6b, 0x8e, 0x04, + 0x47, 0x68, 0x43, 0xc2, 0x8b, 0x48, 0x45, 0xea, 0xff, 0x17, 0x83, 0xa8, 0x50, 0xc2, + 0x4a, 0x90, 0x65, 0xc3, 0x36, 0x51, 0xc4, 0xb3, 0xdd, 0x19, 0x92, 0xf4, 0xf2, 0x08, + 0xb8, 0x51, 0xbf, 0xff, 0xe9, 0xb7, 0xbb, 0x7a, 0xad, 0x76, 0x7c, 0x23, 0x60, 0xb0, + 0x5c, 0x11, 0x23, 0x09, 0x66, 0xda, 0x55, 0x7e, 0x31, 0x3a, 0xe6, 0x1c, 0x95, 0x42, + 0x97, 0x66, 0x10, 0x6b, 0x4b, 0x1b, 0x35, 0x47, 0x64, 0xe4, 0xe1, 0xe4, 0xdf, 0x90, + 0xc1, 0x2d, 0x24, 0x37, 0x9d, 0x67, 0xba, 0xc6, 0x66, 0x97, 0xaf, 0x23, 0x44, 0x97, + 0xf2, 0xd6, 0xf9, 0xa6, 0x12, 0x85, 0x0d, 0xd7, 0x1d, 0x1c, 0x98, 0xce, 0x65, 0xd8, + 0x50, 0x7f, 0xa3, 0x46, 0x35, 0x83, 0x12, 0x39, 0xe2, 0x10, 0xf7, 0xdb, 0xb3, 0x05, + 0x04, 0x2d, 0x47, 0x50, 0xd9, 0x5a, 0xdf, 0xff, 0xc9, 0x8d, 0xeb, 0x0f, 0x17, 0x13, + 0xbc, 0x01, 0xaf, 0x5d, 0xb5, 0x99, 0x29, 0x89, 0x76, 0xab, 0xba, 0xdb, 0x0f, 0x4d, + 0xed, 0x1a, 0x2f, 0xe4, 0xcf, 0x90, 0x60, 0x0e, 0x0d, 0x28, 0xd3, 0x07, 0xc6, 0x41, + 0xf7, 0x52, 0x3c, 0x16, 0x66, 0x40, 0x1d, 0x78, 0x6f, 0xd2, 0x4a, 0xe1, 0x68, 0x0f, + 0xe9, 0x26, 0x70, 0x4c, 0xb6, 0xe2, 0xaf, 0x80, 0x1a, 0x0d, 0x82, 0x75, 0x9d, 0xd8, + 0x7a, 0x8c, 0xd8, 0x7b, 0x85, 0xbb, 0x07, 0x51, 0xa7, 0x08, 0xc9, 0xf4, 0xa7, 0xd3, + 0x24, 0xe5, 0xc9, 0x3a, 0xd2, 0x2b, 0x86, 0x43, 0xdf, 0xfa, 0x5f, 0x50, 0x79, 0xfc, + 0x6f, 0x01, 0x6d, 0x94, 0x3c, 0x99, 0x09, 0x27, 0x5c, 0x96, 0xf5, 0xfe, 0x7b, 0x56, + 0x33, 0x3c, 0x24, 0x01, 0x99, 0x73, 0xd9, 0x4f, 0x06, 0xeb, 0xf6, 0xc0, 0xf6, 0xef, + 0xdd, 0x42, 0xea, 0xb0, 0x63, 0x49, 0xd5, 0xe8, 0xb9, 0x60, 0xba, 0x8c, 0x68, 0xee, + 0xfd, 0x44, 0x49, 0x99, 0xf6, 0xfa, 0x3d, 0x6a, 0x3a, 0xe3, 0x1a, 0xe8, 0x54, 0x6e, + 0xdc, 0x62, 0x78, 0x25, 0x63, 0x7e, 0x1e, 0x86, 0x39, 0x8d, 0x0e, 0xd3, 0xd8, 0x8b, + 0xfa, 0xea, 0x8b, 0x4b, 0x08, 0x50, 0xd8, 0xa8, 0x28, 0x6e, 0xa9, 0xf3, 0xd1, 0x3f, + 0xa8, 0xf4, 0x16, 0x53, 0x45, 0x1b, 0x97, 0xb3, 0x8b, 0x06, 0x3a, 0x5f, 0xc6, 0xdb, + 0xe4, 0xe9, 0x19, 0x94, 0x87, 0xc9, 0x73, 0xef, 0x8f, 0x2c, 0x26, 0x3f, 0x85, 0x05, + 0xf4, 0xc3, 0xbe, 0xc9, 0xd1, 0x79, 0xbb, 0xd6, 0x5d, 0x1e, 0xdc, 0x58, 0x95, 0xa1, + 0x6c, 0xc7, 0x98, 0x6b, 0xcf, 0xc4, 0xba, 0xe8, 0x7e, 0xc0, 0xb2, 0x9b, 0xf1, 0xb3, + 0x97, 0x61, 0x5c, 0x95, 0x13, 0xfa, 0x52, 0xeb, 0xe1, 0xe9, 0xfc, 0xfb, 0xf1, 0x92, + 0xed, 0x49, 0x26, 0x27, 0x27, 0xa0, 0x8a, 0xd3, 0xc2, 0x95, 0x5b, 0x3d, 0xf2, 0xee, + 0xad, 0x30, 0x24, 0x3e, 0x32, 0xb2, 0x54, 0x1e, 0x8f, 0x9f, 0xce, 0x6c, 0xa5, 0xe7, + 0x0f, 0xf3, 0xa5, 0xe9, 0x35, 0x2b, 0xb8, 0x93, 0xe3, 0xdc, 0xa2, 0x74, 0xa1, 0x11, + 0xbb, 0xd6, 0x9c, 0x2b, 0x4c, 0x2e, 0xc9, 0x49, 0x81, 0x3d, 0xb7, 0x8c, 0x5e, 0x16, + 0xbc, 0x7a, 0xf6, 0x72, 0xb2, 0x0d, 0x7a, 0x16, 0xec, 0x48, + ], + ock: [ + 0x97, 0x9b, 0x31, 0x5d, 0x3e, 0x1f, 0x5c, 0xa1, 0x8a, 0x92, 0x86, 0xd9, 0x2c, 0xc8, + 0x8e, 0x63, 0x62, 0x4b, 0x39, 0x9b, 0x29, 0x19, 0xbf, 0x4e, 0x67, 0xda, 0x7c, 0xd3, + 0x94, 0xf4, 0x5c, 0x49, + ], + op: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, + 0x1d, 0xa4, 0xb1, 0x44, 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, + 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, + ], + c_out: [ + 0x83, 0xf7, 0xa1, 0xda, 0x72, 0x4d, 0xd1, 0x54, 0xe7, 0xd9, 0x47, 0xc0, 0xfc, 0x83, + 0x42, 0x87, 0xf3, 0x3c, 0xd4, 0xb3, 0x4a, 0xfa, 0xc0, 0xda, 0x55, 0xe4, 0x37, 0xaf, + 0xae, 0x67, 0xa9, 0x9c, 0xbd, 0x89, 0x75, 0xc9, 0x54, 0xcf, 0x41, 0xaa, 0x1e, 0x9a, + 0x8f, 0x99, 0x98, 0x3d, 0x58, 0x6f, 0x5e, 0x35, 0x37, 0xda, 0xb7, 0x2a, 0xe1, 0x82, + 0x7a, 0xa5, 0xdf, 0xc9, 0xdd, 0xad, 0x06, 0x26, 0x78, 0x84, 0x6f, 0xf8, 0x09, 0x3d, + 0xfd, 0x15, 0xf6, 0x3d, 0x47, 0xe5, 0xa3, 0xbb, 0x74, 0x39, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xfc, 0x8c, 0x64, 0x1c, 0x0b, 0x28, 0xbe, 0xbf, 0x85, 0x24, 0x25, 0xae, 0x95, 0x5f, + 0xe6, 0x40, 0x1c, 0xfd, 0x9e, 0x60, 0x63, 0xf2, 0x50, 0x11, 0x3d, 0xa0, 0xb5, 0x8b, + 0x2a, 0x0f, 0x49, 0xb9, 0x12, 0x0b, 0x89, 0x9f, 0x08, 0x10, 0x6b, 0x30, 0x86, 0xb2, + 0xf4, 0x11, 0x63, 0x6f, 0x50, 0xab, 0x48, 0x7c, 0xfb, 0x28, 0x81, 0x89, 0x77, 0x8f, + 0xe4, 0xe5, 0xa1, 0x91, 0x8b, 0x98, 0xd5, 0x0a, + ], + ovk: [ + 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, 0x17, 0xdb, 0xbc, + 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, 0x27, 0x00, 0x2c, + 0xe2, 0x1c, 0x02, 0x14, + ], + default_d: [ + 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, + ], + default_pk_d: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, + ], + v: 7555450289479839818, + rseed: [ + 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, + 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, + 0x03, 0xaa, 0xe0, 0x4b, + ], + asset: [ + 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, + 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, + 0x82, 0x1a, 0x41, 0x84, + ], + memo: [ + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, + 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, + 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, + ], + cv_net: [ + 0x71, 0x00, 0xa7, 0x52, 0x93, 0xf4, 0xae, 0xfd, 0x89, 0xa1, 0x66, 0xa5, 0xf8, 0x4d, + 0x34, 0xda, 0xf4, 0xe5, 0x98, 0x34, 0xcd, 0x65, 0xd7, 0x9f, 0xfc, 0x41, 0xdd, 0xf0, + 0x68, 0x2d, 0xc2, 0xab, + ], + rho: [ + 0x31, 0x70, 0x5e, 0xfb, 0xf8, 0x0c, 0x7a, 0x7a, 0xb7, 0x81, 0xdf, 0x53, 0x77, 0xf8, + 0x4d, 0x4b, 0x32, 0x36, 0xdb, 0x1f, 0x32, 0xac, 0xa7, 0x94, 0x5c, 0xf2, 0x6e, 0xc8, + 0xb9, 0xd0, 0xb7, 0x32, + ], + cmx: [ + 0xe1, 0xc7, 0x67, 0xf3, 0x30, 0x15, 0xb5, 0xe2, 0x4a, 0x9a, 0xa5, 0x8b, 0x64, 0x7b, + 0x6b, 0x61, 0x32, 0x3c, 0xd3, 0x47, 0xe7, 0x21, 0x4c, 0x29, 0x1d, 0x09, 0x95, 0xc0, + 0xf5, 0xa6, 0x93, 0x2f, + ], + esk: [ + 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, 0x58, 0x93, 0x20, 0x26, + 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, 0x44, 0x72, 0x83, 0xf9, + 0x4e, 0xd5, 0x95, 0x3d, + ], + ephemeral_key: [ + 0xce, 0x67, 0x94, 0x31, 0x5f, 0x46, 0x2d, 0xed, 0xf3, 0xc5, 0x77, 0x4a, 0xac, 0x7f, + 0x3c, 0x7b, 0x70, 0xba, 0x7d, 0x72, 0x43, 0xbb, 0x0c, 0xc3, 0xb0, 0x67, 0xdc, 0x28, + 0x38, 0xf1, 0x11, 0xa3, + ], + shared_secret: [ + 0xea, 0x22, 0x6b, 0x69, 0xec, 0x2d, 0x9f, 0xcf, 0x91, 0x9c, 0xe5, 0x70, 0x06, 0x09, + 0x89, 0x94, 0xf7, 0x14, 0xb3, 0x9c, 0x34, 0x61, 0x52, 0xbc, 0x11, 0x51, 0xa0, 0xc6, + 0x9e, 0xe0, 0x04, 0x06, + ], + k_enc: [ + 0xb4, 0x56, 0x1b, 0xdb, 0xe0, 0xea, 0x44, 0x20, 0x75, 0xe7, 0xe6, 0x6f, 0xb3, 0xc0, + 0xfa, 0xd3, 0xaf, 0xc2, 0x85, 0x6e, 0xf4, 0xf3, 0x61, 0xb4, 0xac, 0x33, 0xaa, 0xe0, + 0x15, 0x52, 0xfd, 0x49, + ], + p_enc: [ + 0x03, 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, 0x4a, 0x70, + 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, + 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, + 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, 0x03, 0xaa, 0xe0, 0x4b, 0x29, 0x8a, 0xc0, 0xaf, + 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, + 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, + 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, + 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, + ], + c_enc: [ + 0x59, 0x9a, 0x4d, 0x9f, 0x53, 0x3c, 0x46, 0xa9, 0x6f, 0x92, 0xaf, 0x8c, 0x08, 0xae, + 0x59, 0x71, 0x10, 0x23, 0x0e, 0xb8, 0x41, 0xc2, 0xf7, 0xc9, 0xd4, 0xf1, 0x45, 0x87, + 0x76, 0x36, 0xc8, 0x9d, 0xd8, 0xf3, 0x84, 0xa9, 0x40, 0xdc, 0x89, 0x72, 0x55, 0x53, + 0x57, 0xbc, 0x07, 0x48, 0x2a, 0x0a, 0x32, 0x3d, 0x87, 0xae, 0x10, 0xeb, 0x99, 0x82, + 0x5a, 0xe4, 0xe0, 0x06, 0x0e, 0x25, 0x6c, 0x3c, 0x3b, 0xeb, 0xa3, 0x2f, 0xa2, 0xb2, + 0xd2, 0x7f, 0x04, 0x6f, 0x7a, 0x93, 0x6d, 0xf8, 0xa9, 0x61, 0xc8, 0x18, 0x4e, 0xe3, + 0xc6, 0x8e, 0xbc, 0xe9, 0x80, 0x64, 0x45, 0xb4, 0x3e, 0x66, 0x67, 0x19, 0x95, 0xa2, + 0x43, 0x7a, 0x7f, 0x70, 0x91, 0x47, 0x14, 0x8a, 0x76, 0x03, 0x6d, 0x25, 0x5e, 0xba, + 0xc4, 0xd0, 0xd8, 0x34, 0x82, 0x93, 0x23, 0x9a, 0x78, 0x64, 0xe7, 0x9b, 0xef, 0xf7, + 0x6f, 0x61, 0x50, 0xe0, 0xc4, 0xf4, 0x7a, 0x85, 0x26, 0xe3, 0xed, 0x06, 0x75, 0xfa, + 0xc6, 0xac, 0xcc, 0x30, 0xa4, 0xd6, 0x73, 0xca, 0x80, 0x85, 0x95, 0x96, 0xfe, 0xc9, + 0xcd, 0x6a, 0x93, 0xfb, 0xa0, 0xe8, 0x9e, 0xf5, 0x3f, 0x3e, 0x26, 0x74, 0xd3, 0x2a, + 0x4b, 0x43, 0xf9, 0xa4, 0x38, 0x7d, 0xce, 0x33, 0xac, 0xa1, 0xe4, 0xff, 0xdc, 0x6d, + 0x2d, 0x31, 0x89, 0xc6, 0x23, 0xca, 0x56, 0x4d, 0x03, 0xac, 0x5b, 0x35, 0xb1, 0xa7, + 0x47, 0xff, 0x44, 0x6b, 0xc2, 0x5e, 0xd2, 0x2d, 0x09, 0x68, 0x2c, 0xef, 0x3a, 0x30, + 0xff, 0xa5, 0xc4, 0x0e, 0x27, 0x70, 0xf1, 0x84, 0x98, 0xb1, 0x2f, 0x86, 0x8b, 0xa9, + 0x2a, 0x13, 0xaa, 0x4f, 0xa2, 0x14, 0xb0, 0x62, 0xe3, 0x64, 0x9c, 0xf9, 0xc8, 0x5e, + 0x7a, 0x8a, 0x55, 0xf5, 0xf3, 0xdd, 0x68, 0x84, 0x2a, 0xea, 0x7c, 0x92, 0x79, 0x2a, + 0x52, 0x60, 0x0f, 0x86, 0x6c, 0x34, 0xa1, 0x0c, 0x51, 0x14, 0x13, 0x62, 0x02, 0x24, + 0xfb, 0x85, 0xaf, 0xc6, 0x06, 0xdd, 0x4f, 0x7b, 0x2f, 0x76, 0xbe, 0x76, 0x0c, 0xa1, + 0x94, 0xb6, 0xd4, 0x88, 0x2e, 0x5a, 0x4a, 0x76, 0x3d, 0x75, 0x0d, 0xb7, 0xe1, 0x68, + 0xa4, 0x18, 0x11, 0x92, 0x35, 0xda, 0xf9, 0xcb, 0x1b, 0xdb, 0x07, 0xff, 0x46, 0x83, + 0x3a, 0x87, 0xa3, 0x92, 0x6b, 0x14, 0xa5, 0x26, 0x4f, 0x10, 0x4f, 0x7f, 0x89, 0xf7, + 0x6f, 0x10, 0x10, 0x8f, 0x2b, 0x6e, 0xa5, 0x05, 0xd4, 0xf0, 0xd2, 0x6d, 0x58, 0x31, + 0x1c, 0xc7, 0x21, 0x9c, 0x6b, 0xc4, 0x38, 0xd0, 0xe1, 0xb3, 0x17, 0x60, 0x18, 0x73, + 0x9e, 0x6f, 0x75, 0xd0, 0x73, 0x59, 0xf5, 0xe8, 0x95, 0x7e, 0x12, 0xc3, 0x03, 0xaa, + 0x52, 0x9b, 0x11, 0xa1, 0x81, 0x66, 0x25, 0xa1, 0x20, 0xf3, 0x6d, 0xcd, 0xdd, 0xff, + 0x9c, 0x65, 0xbc, 0xac, 0x8f, 0x10, 0x67, 0xc7, 0xfe, 0x88, 0xf6, 0x44, 0x85, 0x94, + 0xcf, 0x1d, 0xff, 0x8e, 0x29, 0x00, 0xae, 0x84, 0xd2, 0xa7, 0xc8, 0x1b, 0x90, 0x6d, + 0xd0, 0xbc, 0x86, 0x96, 0xe3, 0x70, 0x98, 0x07, 0x4b, 0x75, 0xd8, 0x38, 0xd8, 0xab, + 0xdc, 0x90, 0x46, 0x08, 0x2b, 0xe4, 0xa6, 0x09, 0x95, 0xc4, 0xf4, 0xed, 0x80, 0xe2, + 0xd7, 0x87, 0x38, 0x25, 0x77, 0x3b, 0xa6, 0x3e, 0xe4, 0xcb, 0x97, 0x36, 0x9a, 0x50, + 0x70, 0xb5, 0x72, 0x5c, 0x5f, 0xeb, 0x32, 0x62, 0x45, 0x87, 0x80, 0x1e, 0x5a, 0xc0, + 0x30, 0xe6, 0x45, 0xbd, 0xf2, 0xe5, 0x86, 0xcf, 0x98, 0x66, 0xea, 0xfb, 0x76, 0xf5, + 0x59, 0x76, 0xa3, 0x3d, 0x62, 0xae, 0xdc, 0x76, 0x27, 0x78, 0x3b, 0x48, 0x48, 0x93, + 0x61, 0xf9, 0x9c, 0xae, 0xb1, 0xb1, 0x9c, 0x55, 0x22, 0x58, 0x9f, 0xd2, 0x1d, 0x51, + 0x45, 0x49, 0xd7, 0x4a, 0xb1, 0x92, 0x25, 0xed, 0x6e, 0x4c, 0x20, 0x3a, 0xdd, 0xfa, + 0x55, 0xfc, 0x9e, 0xc9, 0x89, 0xb6, 0x69, 0x02, 0x3c, 0xf3, 0x05, 0xb4, 0x2b, 0x33, + 0x0f, 0xc2, 0x30, 0x80, 0xab, 0xe4, 0x25, 0x01, 0xe5, 0x9c, 0x85, 0x1c, 0x54, 0xc7, + 0x49, 0x66, 0xf6, 0x0b, 0xe9, 0xdc, 0x56, 0x1a, 0x2d, 0x91, 0xf5, 0xd3, 0x2a, 0xdd, + 0x19, 0xb8, 0x9a, 0xca, 0xbe, 0x92, 0x1b, 0x99, 0x25, 0x3a, 0xfe, 0xfb, 0x2f, 0xf6, + 0x42, 0xd8, 0x6e, 0x65, 0x59, 0x51, 0x95, 0x8e, 0xfb, 0x82, 0xab, 0xe5, 0x84, 0x5d, + 0xad, 0xf0, 0x13, 0x27, 0x03, 0x7e, 0xda, 0x01, 0xf9, 0x97, 0xd4, 0x19, 0x4f, 0x97, + 0xb7, 0xd7, 0xef, 0xa4, 0xf4, 0xd0, 0x18, 0x2d, 0xa4, 0xc4, + ], + ock: [ + 0x55, 0x0e, 0xbf, 0x98, 0x83, 0x6c, 0xce, 0x43, 0x52, 0x25, 0xa1, 0x4b, 0xa6, 0x52, + 0xa7, 0xd5, 0x58, 0xcf, 0x5f, 0x3f, 0x7a, 0xfb, 0x00, 0xb0, 0x24, 0x70, 0xe8, 0xe4, + 0xd2, 0x6d, 0xb7, 0x9c, + ], + op: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, + 0x58, 0x93, 0x20, 0x26, 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, + 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, + ], + c_out: [ + 0x9a, 0x01, 0xb7, 0x5e, 0x27, 0xea, 0x97, 0x51, 0x45, 0x5d, 0x54, 0xf2, 0xa5, 0x2b, + 0x88, 0x4b, 0x45, 0x6a, 0x6f, 0xc3, 0xda, 0xdb, 0xec, 0x79, 0xbf, 0x4d, 0x10, 0xbe, + 0x06, 0x7b, 0xef, 0x3e, 0xa2, 0xa5, 0xc0, 0x59, 0x81, 0xd4, 0x06, 0x05, 0x6a, 0x2f, + 0xf6, 0x4c, 0xb4, 0xc6, 0xfd, 0x46, 0x7d, 0xa8, 0x0b, 0xa1, 0x17, 0x48, 0xe9, 0xe2, + 0xae, 0x07, 0xb7, 0x62, 0xdf, 0x9d, 0x4a, 0x23, 0x58, 0x77, 0xf5, 0x8f, 0x43, 0x24, + 0xd8, 0x00, 0x3c, 0x32, 0x4f, 0xd9, 0xc6, 0x39, 0xbc, 0xa6, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x53, 0x3d, 0xc3, 0xd4, 0x93, 0xf2, 0xb8, 0x7a, 0x03, 0x3d, 0xf5, 0x07, 0x05, 0xf2, + 0x90, 0x54, 0x16, 0x38, 0xe9, 0x08, 0x7d, 0xcd, 0xbc, 0xfe, 0x52, 0x7e, 0x77, 0x5a, + 0xaf, 0x09, 0x30, 0x29, 0xac, 0xec, 0x74, 0xdd, 0xe6, 0x02, 0xfc, 0x7c, 0x73, 0xcb, + 0x38, 0x50, 0xbd, 0xfb, 0xf2, 0x61, 0x79, 0x4c, 0x9c, 0x29, 0x9d, 0x0b, 0x98, 0xee, + 0x0f, 0x20, 0x71, 0xd6, 0xd4, 0xe3, 0x7b, 0x05, + ], + ovk: [ + 0x32, 0x4d, 0xce, 0x2a, 0x1e, 0xa1, 0xe4, 0x30, 0x4f, 0x49, 0xe4, 0x3a, 0xe0, 0x65, + 0xe3, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, 0xd1, + 0x8d, 0xea, 0x5f, 0xb6, + ], + default_d: [ + 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, + ], + default_pk_d: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, + ], + v: 12711846894898776584, + rseed: [ + 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, + 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, + 0xad, 0xe8, 0x24, 0xf3, + ], + asset: [ + 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, + 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, + 0xe3, 0x81, 0x93, 0xbc, + ], + memo: [ + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, 0x78, 0xf4, 0xfb, 0x11, 0x12, 0xf4, 0x02, 0x8a, 0x70, 0x4f, + 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, 0x08, 0x5e, 0x90, 0x6c, 0xf8, 0x4c, + 0xa2, 0xc1, 0x20, 0x7c, 0x87, 0xa2, 0xbc, 0xe2, + ], + cv_net: [ + 0x5d, 0xd1, 0x3d, 0xcf, 0x9a, 0xf3, 0x52, 0xf5, 0xfe, 0x0b, 0x2b, 0xcb, 0xd0, 0xdb, + 0xd7, 0xda, 0xfb, 0xbe, 0x53, 0xb0, 0xa9, 0x6b, 0x08, 0x1c, 0x90, 0xba, 0xde, 0xd9, + 0xbe, 0x4b, 0x4f, 0x87, + ], + rho: [ + 0x56, 0xbc, 0x48, 0x21, 0xa5, 0x3d, 0x5e, 0x9e, 0x6d, 0x7a, 0x04, 0x44, 0x44, 0x45, + 0x4f, 0xfb, 0xc2, 0x36, 0x9c, 0xb1, 0x48, 0xeb, 0x76, 0xf1, 0xed, 0xf1, 0xb5, 0xc7, + 0x41, 0x84, 0x28, 0x2a, + ], + cmx: [ + 0xd7, 0x60, 0xac, 0xdb, 0xca, 0xda, 0xd1, 0x88, 0x08, 0x4f, 0xe4, 0x1a, 0x5c, 0x03, + 0xc2, 0xc8, 0xce, 0x34, 0xe1, 0x5f, 0x9d, 0xf4, 0x7b, 0x86, 0x9c, 0x44, 0xc7, 0x21, + 0x13, 0xa4, 0x0c, 0x3d, + ], + esk: [ + 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, 0xdf, 0x7c, 0xe2, 0xd2, + 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, 0x86, 0x48, 0x56, 0x2c, + 0xbd, 0x86, 0x3f, 0x09, + ], + ephemeral_key: [ + 0x5a, 0x48, 0x58, 0x15, 0xc4, 0xa7, 0x47, 0x06, 0xe9, 0xde, 0x87, 0xfa, 0x60, 0xa2, + 0x81, 0x6f, 0x89, 0x0b, 0xe3, 0xdb, 0x54, 0xeb, 0x3f, 0x4b, 0xaf, 0x37, 0xdb, 0xc9, + 0xbd, 0xe5, 0xfe, 0x9d, + ], + shared_secret: [ + 0x96, 0x8d, 0xf2, 0xe8, 0x5d, 0x7b, 0xd1, 0x08, 0xf5, 0x72, 0x12, 0x53, 0x93, 0x76, + 0xaf, 0x25, 0x83, 0x2e, 0xf4, 0xdb, 0xd6, 0x40, 0x2a, 0x41, 0x4d, 0x73, 0xc5, 0x6b, + 0xee, 0xe4, 0xf2, 0xa8, + ], + k_enc: [ + 0xf7, 0x73, 0x91, 0x24, 0x3f, 0xdb, 0x35, 0xb2, 0x26, 0x94, 0xdb, 0x91, 0xde, 0xbd, + 0x78, 0x55, 0x79, 0x3c, 0xa7, 0x1e, 0x82, 0xbd, 0xc2, 0xee, 0x74, 0xc9, 0xb7, 0xb6, + 0x97, 0xc0, 0x24, 0x71, + ], + p_enc: [ + 0x03, 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, 0x08, 0x0a, + 0x98, 0x91, 0x66, 0x8d, 0x69, 0xb0, 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, + 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, + 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0xf9, 0x78, 0x1e, 0xbe, + 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, + 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, 0x78, 0xf4, 0xfb, 0x11, 0x12, 0xf4, 0x02, 0x8a, 0x70, 0x4f, + 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, 0x08, 0x5e, 0x90, 0x6c, 0xf8, 0x4c, + 0xa2, 0xc1, 0x20, 0x7c, 0x87, 0xa2, 0xbc, 0xe2, + ], + c_enc: [ + 0xf9, 0x09, 0x97, 0x73, 0x8b, 0x14, 0xd8, 0xa8, 0x4e, 0x32, 0x74, 0xbb, 0x70, 0x76, + 0x31, 0x15, 0xb7, 0x2e, 0x0a, 0x3d, 0xde, 0x8e, 0xa4, 0x70, 0x91, 0x1f, 0xb4, 0x58, + 0x70, 0xb0, 0x14, 0x8e, 0x7d, 0x37, 0x2b, 0xf2, 0x26, 0x8b, 0x3e, 0xe8, 0xda, 0xe5, + 0xfd, 0xe5, 0xea, 0x9b, 0x61, 0x59, 0x8e, 0xf1, 0x1b, 0x73, 0x14, 0x4f, 0x75, 0x53, + 0xb2, 0x13, 0xa0, 0x4c, 0x85, 0xf2, 0x5c, 0x54, 0x6c, 0x8a, 0x38, 0xa6, 0x0e, 0x50, + 0x86, 0x08, 0xb9, 0xca, 0x59, 0x3b, 0x94, 0xd8, 0x68, 0x8d, 0x6e, 0xff, 0xa5, 0x36, + 0x04, 0xd4, 0xdb, 0xc0, 0xf3, 0x45, 0x03, 0xaa, 0xe4, 0x6f, 0x3c, 0x8a, 0x8d, 0x2e, + 0x46, 0xa8, 0x1f, 0x09, 0x12, 0x6c, 0x45, 0x36, 0xfd, 0x02, 0x58, 0xf5, 0x97, 0x40, + 0xad, 0x0d, 0xb8, 0x02, 0xcc, 0x02, 0x42, 0x53, 0x4d, 0xdf, 0x52, 0xa6, 0xbf, 0x6a, + 0x03, 0x4d, 0xe6, 0x26, 0xf0, 0x18, 0x84, 0x4a, 0xdc, 0xb2, 0x6d, 0xcd, 0xc2, 0x85, + 0x16, 0x37, 0x16, 0xdd, 0x54, 0x65, 0x1c, 0x88, 0x73, 0x53, 0xf1, 0xff, 0xef, 0xa0, + 0x37, 0x71, 0x2a, 0xc0, 0xdf, 0x3a, 0x92, 0x98, 0x19, 0x06, 0x87, 0x54, 0x9d, 0x79, + 0xc6, 0xa3, 0x60, 0x0c, 0xc1, 0xc7, 0x29, 0xa3, 0x93, 0xd4, 0x4f, 0xec, 0xe5, 0x7f, + 0xd4, 0xcb, 0x0c, 0x0f, 0xb0, 0xc7, 0x86, 0x1b, 0x92, 0x5b, 0x94, 0xcd, 0x6a, 0x26, + 0x90, 0xf0, 0x02, 0xc4, 0x3a, 0x16, 0x6e, 0x56, 0x77, 0x72, 0x9f, 0x35, 0x52, 0xae, + 0xe0, 0xf2, 0xc1, 0x95, 0xaa, 0x91, 0xb2, 0xdd, 0xe3, 0x65, 0xdd, 0x14, 0xf2, 0xf0, + 0x7b, 0x3c, 0x38, 0x34, 0x7f, 0x6c, 0x0d, 0xab, 0x82, 0x84, 0x1e, 0xba, 0xde, 0x1e, + 0xf8, 0x13, 0xf2, 0xcd, 0x88, 0x5b, 0x57, 0x84, 0x37, 0x44, 0x45, 0x24, 0x93, 0x6a, + 0x65, 0x46, 0xc4, 0x55, 0xd6, 0xc9, 0x2e, 0x6d, 0x3d, 0xc5, 0x38, 0xb6, 0xcd, 0x9f, + 0x6d, 0x4c, 0xc0, 0xd7, 0x4d, 0x7b, 0xc2, 0x46, 0x7e, 0x21, 0x5b, 0xe8, 0xc3, 0xd4, + 0xff, 0x91, 0x8a, 0x2d, 0x98, 0x71, 0x00, 0xff, 0x34, 0x02, 0x4c, 0x88, 0x62, 0x79, + 0xd6, 0x4c, 0xaf, 0xdf, 0xd9, 0x0f, 0x1c, 0x04, 0xc4, 0x6b, 0xc9, 0xd5, 0xe9, 0xe2, + 0xaf, 0xd0, 0x3a, 0xb7, 0x55, 0xe4, 0x0f, 0x08, 0x7e, 0xb5, 0x1e, 0xe3, 0xd1, 0x02, + 0xb6, 0xb0, 0x69, 0xb6, 0x50, 0xf5, 0xd8, 0x55, 0x03, 0x35, 0x47, 0x1b, 0x24, 0x46, + 0x5d, 0x93, 0x4d, 0x63, 0x34, 0x39, 0xb1, 0x08, 0xd9, 0x04, 0x2b, 0x37, 0xf9, 0xf7, + 0x2e, 0x74, 0xfd, 0x6b, 0xa0, 0x01, 0x58, 0x5b, 0x08, 0x62, 0xdb, 0x99, 0x4a, 0x5e, + 0xc1, 0x2d, 0xc9, 0x1e, 0x01, 0x48, 0x6a, 0x8d, 0xc6, 0x8a, 0xb9, 0xa3, 0x41, 0x93, + 0x52, 0x61, 0x73, 0xec, 0xc0, 0xd1, 0x55, 0xb5, 0xcd, 0xd6, 0xbc, 0x07, 0xe6, 0x3e, + 0x41, 0xaf, 0x9e, 0x52, 0x4c, 0xd3, 0xe6, 0x55, 0x5d, 0x38, 0xb4, 0x6d, 0xb2, 0xd9, + 0x9e, 0x5b, 0xa4, 0xa4, 0x95, 0xff, 0x30, 0xfe, 0xf2, 0x54, 0xc9, 0xfe, 0x7b, 0x79, + 0x0c, 0xe5, 0x6a, 0x40, 0xf4, 0x00, 0x27, 0xbb, 0x62, 0x05, 0x86, 0x38, 0xc4, 0x94, + 0x17, 0x7b, 0x7f, 0x5c, 0x8f, 0x29, 0x44, 0x9e, 0x9e, 0xc3, 0xbd, 0xb3, 0xab, 0x04, + 0x16, 0x0d, 0x96, 0xd0, 0xd4, 0x04, 0x79, 0x5d, 0x54, 0x28, 0x40, 0x82, 0xb6, 0x35, + 0x7d, 0x58, 0x1d, 0xc2, 0x64, 0x81, 0x13, 0x67, 0xbb, 0xb1, 0x31, 0x9a, 0x31, 0xf7, + 0x66, 0x4a, 0x4e, 0xca, 0x93, 0x2a, 0xbb, 0xd7, 0x33, 0xa7, 0x1a, 0x31, 0xaf, 0x23, + 0x11, 0xc4, 0x9a, 0xc9, 0xaf, 0x22, 0xf8, 0x16, 0x7b, 0x25, 0x51, 0xac, 0xf5, 0x73, + 0xd9, 0x1b, 0x40, 0x98, 0xc4, 0xde, 0xa8, 0xa9, 0x79, 0x9d, 0x9d, 0x54, 0x52, 0x0c, + 0xc6, 0x3e, 0x55, 0x71, 0x8a, 0x24, 0x85, 0xbf, 0x6f, 0x63, 0x16, 0x30, 0x7c, 0xea, + 0x21, 0x5e, 0x22, 0x22, 0x8d, 0x45, 0x34, 0x9a, 0x03, 0x50, 0x31, 0xa4, 0xcb, 0x67, + 0x7b, 0x52, 0x3a, 0x3a, 0x51, 0x25, 0x2c, 0x6c, 0x61, 0xd0, 0xe2, 0x43, 0x2b, 0x94, + 0xac, 0x9c, 0x0d, 0xb5, 0x0d, 0xbc, 0xb9, 0xa2, 0xaf, 0x76, 0xb9, 0xf9, 0x11, 0x0a, + 0xd6, 0xcc, 0x2e, 0x7d, 0xe6, 0x49, 0x3a, 0x8e, 0x3c, 0xd1, 0xab, 0xf0, 0x6f, 0x4a, + 0x2d, 0x47, 0x5e, 0xc7, 0x60, 0xeb, 0x7c, 0x36, 0xbb, 0xb1, 0x27, 0x50, 0x61, 0x10, + 0x2d, 0xb3, 0x35, 0x6e, 0x11, 0x4d, 0xbc, 0xa3, 0xc5, 0xd8, + ], + ock: [ + 0x53, 0x29, 0x6e, 0xed, 0x43, 0xb4, 0xeb, 0x30, 0xa4, 0x3d, 0x88, 0x90, 0x2f, 0x74, + 0x04, 0x26, 0x62, 0x1d, 0x85, 0x21, 0x3a, 0x36, 0xc5, 0x20, 0xa1, 0x84, 0xa4, 0x3a, + 0xfb, 0xd4, 0x89, 0x6d, + ], + op: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, + 0xdf, 0x7c, 0xe2, 0xd2, 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, + 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, + ], + c_out: [ + 0x38, 0xee, 0x14, 0xef, 0xb0, 0x63, 0x94, 0x64, 0x44, 0x6f, 0x5f, 0xb8, 0x79, 0x5d, + 0x23, 0xf8, 0x8c, 0xf5, 0x65, 0x37, 0xe6, 0x4e, 0x1a, 0x46, 0x63, 0x17, 0xb3, 0x6f, + 0x22, 0x2e, 0x00, 0x5b, 0x92, 0x4c, 0xc9, 0x10, 0xd6, 0x29, 0x06, 0x6e, 0x05, 0x07, + 0xcb, 0x91, 0x2b, 0x0b, 0xc1, 0xd3, 0x16, 0xc2, 0x00, 0xb1, 0xa9, 0x56, 0x49, 0xc0, + 0xc5, 0x30, 0xb4, 0xf3, 0xd0, 0x43, 0x06, 0x8e, 0xf6, 0xf4, 0x2d, 0xcb, 0xef, 0xd0, + 0x2a, 0x34, 0x80, 0xe3, 0x2a, 0xa4, 0x5e, 0x33, 0xce, 0x25, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x77, 0x5c, 0x7f, 0x5c, 0xab, 0x43, 0x86, 0x88, 0x64, 0x3d, 0xdd, 0x15, 0x8d, 0xda, + 0xed, 0xf9, 0xa0, 0xea, 0xef, 0x61, 0x4b, 0x54, 0x90, 0x60, 0xf1, 0xe4, 0xd7, 0xcc, + 0x3e, 0x7e, 0x8b, 0x64, 0x49, 0x9a, 0x81, 0x8a, 0x6d, 0x0e, 0x33, 0x57, 0x68, 0x6e, + 0x65, 0xbc, 0x27, 0x4e, 0x3f, 0x7d, 0x45, 0x5b, 0x91, 0x1f, 0x13, 0x9f, 0x19, 0xf0, + 0x81, 0x61, 0x57, 0x51, 0x91, 0x3e, 0xb4, 0x12, + ], + ovk: [ + 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, 0x0c, + 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, 0x64, 0xe8, + 0x4b, 0xac, 0x37, 0x92, + ], + default_d: [ + 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, + ], + default_pk_d: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, + ], + v: 10238534295395242511, + rseed: [ + 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, + 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, + 0xa5, 0xfa, 0x38, 0x5d, + ], + asset: [ + 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, + 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, + 0xf6, 0x99, 0x03, 0x18, + ], + memo: [ + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, + 0xa7, 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, + 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, + ], + cv_net: [ + 0x43, 0x94, 0x47, 0xab, 0x14, 0x5a, 0x6f, 0x0e, 0x5a, 0x3b, 0x43, 0x63, 0x04, 0x4c, + 0x73, 0x07, 0x93, 0xf4, 0x36, 0x33, 0x1f, 0xfe, 0x66, 0x30, 0xc7, 0xca, 0x2d, 0x9b, + 0x23, 0x2a, 0xe1, 0x98, + ], + rho: [ + 0xd6, 0xff, 0xc4, 0x74, 0x88, 0xad, 0x05, 0x93, 0x89, 0x70, 0xc4, 0xb1, 0x56, 0xd0, + 0x53, 0xb9, 0x3b, 0xcb, 0xb4, 0x37, 0x57, 0x1c, 0x62, 0xf3, 0x75, 0x60, 0x7e, 0x90, + 0x4e, 0xb3, 0xa2, 0x08, + ], + cmx: [ + 0x8f, 0x56, 0xd1, 0x3f, 0xd9, 0xc8, 0x3e, 0xb7, 0x1b, 0x95, 0x87, 0x7a, 0x4f, 0x29, + 0x39, 0x64, 0xbf, 0x3f, 0x73, 0x1d, 0x8d, 0xf2, 0x04, 0x32, 0x2c, 0xed, 0xcb, 0x38, + 0x68, 0x21, 0x90, 0x3c, + ], + esk: [ + 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, 0x44, 0xb0, 0xb0, 0x4f, + 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, 0xa9, 0xec, 0x88, 0x17, + 0x18, 0x65, 0x40, 0x33, + ], + ephemeral_key: [ + 0x51, 0x66, 0x26, 0x31, 0x6e, 0xea, 0x63, 0xa6, 0x45, 0xae, 0x56, 0x23, 0x81, 0x5a, + 0x31, 0x74, 0xb3, 0xed, 0x36, 0x64, 0xc3, 0x3e, 0x6a, 0x51, 0x81, 0xa9, 0xf5, 0xb5, + 0x42, 0x76, 0x7a, 0x2d, + ], + shared_secret: [ + 0xf6, 0x04, 0x23, 0x98, 0x7f, 0x0e, 0x67, 0x6d, 0x1a, 0x3b, 0xb6, 0xef, 0xe0, 0x39, + 0x42, 0x1d, 0xbb, 0xc8, 0x24, 0xb6, 0x90, 0xc1, 0x94, 0xa4, 0x90, 0xe4, 0x17, 0x1d, + 0xde, 0x21, 0x58, 0x19, + ], + k_enc: [ + 0x20, 0x98, 0x25, 0x7e, 0x2b, 0x9b, 0x7f, 0xc0, 0x62, 0x82, 0x38, 0x03, 0x38, 0x59, + 0x7d, 0xcb, 0x62, 0x7d, 0xdf, 0x47, 0x3e, 0x83, 0xa7, 0x2e, 0x61, 0xb0, 0xf2, 0x2c, + 0xcf, 0xaf, 0xbe, 0x4e, + ], + p_enc: [ + 0x03, 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, 0x0f, 0x12, + 0xb0, 0x11, 0xb2, 0x94, 0x16, 0x8e, 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, + 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, + 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, 0xfa, 0x38, 0x5d, 0x76, 0xba, 0x24, 0x3f, + 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, + 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, + 0xa7, 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, + 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, + ], + c_enc: [ + 0xa4, 0x01, 0xab, 0x60, 0x1f, 0x8d, 0x69, 0xd9, 0x38, 0x0c, 0x3d, 0xef, 0x1f, 0x1a, + 0x34, 0xbe, 0x6c, 0xfa, 0x4d, 0x83, 0x8b, 0xf8, 0x7f, 0x00, 0xe3, 0x6b, 0xe6, 0xbe, + 0x68, 0x60, 0xbe, 0xa8, 0x3d, 0xab, 0xdd, 0x00, 0xab, 0xe7, 0xe0, 0xd1, 0x21, 0x90, + 0xfb, 0x54, 0xb0, 0xf2, 0xad, 0xcf, 0xef, 0x9e, 0xf4, 0x2b, 0xa2, 0x31, 0x77, 0x6a, + 0xd3, 0xee, 0x09, 0x86, 0xdb, 0x3f, 0x4f, 0xc0, 0xa8, 0xa1, 0xc6, 0xa7, 0xfe, 0x54, + 0xa6, 0x6b, 0xd7, 0x68, 0xa9, 0xde, 0xd2, 0x5b, 0xb1, 0x89, 0xd5, 0x87, 0x1c, 0xaf, + 0x4d, 0xf8, 0x95, 0x6c, 0x2f, 0x30, 0x70, 0x15, 0x89, 0xa4, 0xdc, 0xdb, 0x68, 0x11, + 0x6d, 0x0f, 0x50, 0x9b, 0x34, 0x1e, 0x8f, 0x25, 0x8e, 0x17, 0x38, 0xb5, 0x51, 0x9c, + 0x99, 0xf1, 0xdb, 0xd0, 0x86, 0x31, 0x56, 0x2f, 0x90, 0xd1, 0x5e, 0x72, 0x8a, 0x85, + 0x25, 0xa1, 0x1b, 0xfe, 0x53, 0x95, 0x24, 0x5d, 0x71, 0x79, 0xcf, 0x8e, 0x97, 0xa8, + 0x3f, 0xaa, 0x4c, 0xf3, 0xb2, 0xa8, 0xb5, 0xef, 0x62, 0x13, 0xe3, 0x30, 0x89, 0xb4, + 0xeb, 0x03, 0xe7, 0xc2, 0xf0, 0x12, 0x11, 0xfc, 0x53, 0xbc, 0x01, 0x16, 0x40, 0x05, + 0x01, 0x5d, 0xbf, 0x33, 0xc6, 0x50, 0xa3, 0xf8, 0x33, 0xba, 0x67, 0x77, 0xcf, 0xf1, + 0xd7, 0x38, 0xe2, 0x1c, 0x58, 0xdc, 0x05, 0xc3, 0xb4, 0xec, 0xb9, 0x7a, 0x6c, 0xe0, + 0xb0, 0xc5, 0xee, 0x94, 0x4c, 0x24, 0xb3, 0x3b, 0xb0, 0xce, 0x32, 0xbe, 0x02, 0x3e, + 0x21, 0x3f, 0xf7, 0xc9, 0xd4, 0x12, 0x4f, 0xc9, 0xdc, 0x4a, 0xa7, 0xca, 0x47, 0x13, + 0x86, 0x48, 0xe2, 0xbb, 0x80, 0x7c, 0xea, 0x7a, 0x58, 0xe7, 0x67, 0xd3, 0x27, 0x07, + 0x4a, 0xe5, 0xe3, 0x9c, 0x3c, 0x17, 0xb7, 0x7c, 0x09, 0x0a, 0xf9, 0x42, 0x5b, 0xc6, + 0x40, 0xd2, 0x1d, 0xd6, 0x81, 0xa6, 0x37, 0x45, 0xe9, 0x02, 0x59, 0xe2, 0xd1, 0x09, + 0x0c, 0x88, 0x48, 0x8e, 0x21, 0x48, 0xb9, 0xee, 0x24, 0x31, 0xc5, 0xae, 0xf5, 0x10, + 0x95, 0xb3, 0x5a, 0x37, 0x7c, 0xfa, 0x76, 0x5d, 0x82, 0x24, 0x98, 0x83, 0x00, 0x04, + 0x71, 0x79, 0xa5, 0x09, 0x40, 0x28, 0xbe, 0x52, 0x7d, 0x5d, 0xe1, 0xc2, 0x69, 0xff, + 0x45, 0x2c, 0x0a, 0xaf, 0x5a, 0x47, 0x7e, 0x93, 0x90, 0xa0, 0xf0, 0xa8, 0x68, 0x11, + 0x3c, 0x7c, 0xd1, 0x9e, 0x2e, 0xac, 0x54, 0x0d, 0xc6, 0x59, 0xda, 0x29, 0x60, 0x06, + 0x77, 0x6e, 0xda, 0x0d, 0xf9, 0x81, 0xc4, 0x11, 0xc1, 0x50, 0x01, 0xa9, 0x8b, 0x6a, + 0xd6, 0x58, 0xd9, 0xa6, 0x4c, 0x12, 0x6a, 0xbe, 0xfc, 0x73, 0x9a, 0xa1, 0xf4, 0x44, + 0xbb, 0x83, 0xf3, 0xf1, 0x4d, 0x11, 0x3d, 0x02, 0x8f, 0xae, 0x10, 0xe4, 0xc5, 0xdb, + 0xe7, 0x78, 0x51, 0x96, 0x83, 0xcd, 0xf4, 0xc2, 0xf4, 0x6c, 0x4a, 0x52, 0xae, 0x12, + 0x09, 0xe1, 0x12, 0x7f, 0x9d, 0xc4, 0xed, 0x86, 0x7d, 0x8e, 0xda, 0x02, 0x4a, 0x68, + 0x9f, 0x6b, 0x15, 0xb8, 0x05, 0x38, 0x03, 0x02, 0x44, 0x02, 0xa1, 0xce, 0x6f, 0x1c, + 0x63, 0x6f, 0x2e, 0xfc, 0xf9, 0xd0, 0x60, 0x51, 0x5c, 0xd6, 0x14, 0x71, 0x8d, 0x51, + 0x52, 0x7d, 0x26, 0x7a, 0xd8, 0x95, 0xfa, 0xd8, 0xec, 0xfb, 0x23, 0x51, 0xf8, 0x92, + 0x45, 0x0d, 0xc8, 0x74, 0xe8, 0x74, 0x39, 0x2c, 0x91, 0xed, 0x3a, 0xf1, 0x18, 0x38, + 0xc4, 0xb5, 0x48, 0x2e, 0x8c, 0x92, 0xeb, 0xc7, 0xa0, 0x08, 0x8e, 0x49, 0xd2, 0xb0, + 0xb4, 0xa1, 0xbd, 0x33, 0x3b, 0x38, 0x7f, 0x49, 0xe3, 0x0f, 0xd2, 0x1a, 0x6e, 0xdc, + 0x89, 0x94, 0x83, 0x4f, 0x28, 0xe9, 0xf2, 0x52, 0x9a, 0x7e, 0x27, 0x24, 0x21, 0x6d, + 0x9e, 0x1a, 0xe5, 0xb4, 0x6e, 0xb1, 0x9a, 0x53, 0xea, 0x2b, 0x97, 0x99, 0x65, 0xf7, + 0x5b, 0x83, 0xf6, 0x86, 0xed, 0xc0, 0x1d, 0x25, 0x7a, 0x06, 0x58, 0xd7, 0x4e, 0x25, + 0xc0, 0xe1, 0xa8, 0xb0, 0x65, 0x60, 0x43, 0x1f, 0x85, 0x10, 0x5c, 0xf9, 0x8a, 0x1f, + 0xfe, 0x28, 0x40, 0x8a, 0x64, 0xf4, 0xc0, 0x27, 0x8d, 0x36, 0xed, 0xea, 0x76, 0x40, + 0xa2, 0x18, 0x26, 0xc3, 0xae, 0xba, 0xcb, 0x41, 0x4d, 0xa1, 0x8c, 0xc1, 0xd1, 0xe8, + 0x64, 0xc1, 0x6e, 0x97, 0x71, 0x0d, 0x56, 0xe0, 0xa1, 0x0e, 0x2c, 0xae, 0x86, 0xcb, + 0x27, 0x50, 0x14, 0x21, 0xdf, 0x52, 0xeb, 0x3c, 0x2f, 0x6e, 0x9d, 0x15, 0x59, 0xc1, + 0xb9, 0x5e, 0x7f, 0x63, 0xcb, 0x5c, 0xfa, 0xf5, 0xca, 0xc1, + ], + ock: [ + 0x2a, 0x2e, 0x0d, 0x99, 0x69, 0xf0, 0x2e, 0xbd, 0xb6, 0xd9, 0xc8, 0xe7, 0xe6, 0xfd, + 0xde, 0x20, 0x85, 0x12, 0x4b, 0x19, 0xad, 0x70, 0x90, 0xcc, 0x26, 0x15, 0x1d, 0x4d, + 0xa4, 0x2a, 0x00, 0x3e, + ], + op: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, + 0x44, 0xb0, 0xb0, 0x4f, 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, + 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, + ], + c_out: [ + 0x74, 0x6a, 0xae, 0x9d, 0xa6, 0x1c, 0x02, 0xae, 0xaa, 0x8b, 0xed, 0xbe, 0x2b, 0x6c, + 0x84, 0x1b, 0xc4, 0x36, 0x17, 0x3c, 0x7c, 0x91, 0x13, 0x66, 0x3a, 0x39, 0xc1, 0x74, + 0x69, 0x29, 0x0b, 0xd2, 0x19, 0xea, 0xdc, 0x4a, 0x97, 0x5a, 0xd0, 0x52, 0xd0, 0x5d, + 0xc0, 0xa3, 0x08, 0xf3, 0x63, 0xf9, 0x22, 0x68, 0x2d, 0x75, 0x21, 0x9d, 0xaa, 0x33, + 0x6f, 0x69, 0xb5, 0x9e, 0x86, 0x7c, 0x85, 0xd9, 0x37, 0x34, 0x4c, 0x19, 0xd3, 0x88, + 0x01, 0x63, 0x19, 0xb3, 0xf6, 0x0f, 0x76, 0xd0, 0x28, 0x93, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x9c, 0xe9, 0x20, 0x37, 0x6a, 0x6a, 0x54, 0x1e, 0x6a, 0xad, 0x66, 0x0e, 0xfa, 0x09, + 0x8d, 0xc5, 0x4c, 0x18, 0xfc, 0xeb, 0x13, 0xd0, 0x99, 0x9f, 0xbc, 0xc7, 0xfd, 0x45, + 0xa5, 0x7c, 0xcc, 0x10, 0xb8, 0xaa, 0x86, 0xc4, 0x54, 0x0d, 0x0a, 0x9f, 0xc6, 0x6d, + 0xf8, 0x5d, 0xad, 0xd6, 0x21, 0x56, 0x36, 0x5e, 0x28, 0xa3, 0xe9, 0x80, 0xb9, 0x8d, + 0x13, 0x1b, 0x50, 0x3a, 0xa0, 0x6a, 0x6c, 0x19, + ], + ovk: [ + 0xf8, 0x1a, 0xd6, 0x17, 0xfa, 0x26, 0xf0, 0xdf, 0xb8, 0x36, 0x55, 0xb8, 0xa2, 0x9a, + 0x7f, 0x83, 0x42, 0x32, 0x42, 0x5e, 0x8c, 0x47, 0x45, 0x88, 0xf1, 0x8d, 0xd3, 0x26, + 0xaa, 0x39, 0x6c, 0x3e, + ], + default_d: [ + 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, + ], + default_pk_d: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, + ], + v: 2690686290017047047, + rseed: [ + 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, + 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, + 0xee, 0xba, 0xe6, 0xfa, + ], + asset: [ + 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, + 0xc3, 0x93, 0x11, 0x78, 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, + 0xe5, 0xf5, 0xd4, 0xbc, + ], + memo: [ + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, 0x4d, 0xfa, 0xfe, 0x87, 0x52, 0x62, 0xdd, 0x7b, 0xe4, 0x1c, + 0xbb, 0xc6, 0x24, 0x20, 0xd4, 0xad, 0x6d, 0xf5, 0xc9, 0xb7, 0x13, 0x60, 0x4f, 0x65, + 0x60, 0x88, 0xa4, 0x48, 0x5e, 0x93, 0xbe, 0x19, + ], + cv_net: [ + 0xf4, 0x5c, 0xba, 0x14, 0x6a, 0xe7, 0x18, 0x85, 0xfd, 0x61, 0xb4, 0xa0, 0xf3, 0x6b, + 0x95, 0x26, 0xa6, 0xe9, 0x4a, 0x49, 0x70, 0x10, 0xe3, 0x2a, 0x8a, 0x76, 0xbc, 0xdf, + 0xa7, 0x20, 0xb8, 0xa6, + ], + rho: [ + 0x85, 0x2f, 0x5c, 0x39, 0xd3, 0xf3, 0x55, 0xa3, 0x85, 0xe2, 0xab, 0xd2, 0x54, 0x3a, + 0xa5, 0xed, 0x09, 0xc6, 0xee, 0x3b, 0x7f, 0x39, 0x34, 0x14, 0xe1, 0x1c, 0xd4, 0x20, + 0x4c, 0x3f, 0x8d, 0x26, + ], + cmx: [ + 0x69, 0x4b, 0x6f, 0x3a, 0xb8, 0x37, 0xa9, 0x26, 0xd6, 0x77, 0x3e, 0xc4, 0xa6, 0x76, + 0x5d, 0xef, 0x82, 0x89, 0x33, 0x74, 0x2d, 0x93, 0x29, 0xfc, 0x88, 0x67, 0x1c, 0xcd, + 0x81, 0x21, 0xa4, 0x23, + ], + esk: [ + 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, 0xa5, 0xd8, 0x9a, 0xa8, + 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, 0x6a, 0x72, 0xcb, 0x74, + 0xfb, 0x18, 0xd1, 0x17, + ], + ephemeral_key: [ + 0x3c, 0x04, 0xbe, 0x6e, 0x42, 0xa6, 0xca, 0x7f, 0x5d, 0xda, 0x0d, 0x82, 0xdf, 0x30, + 0x7b, 0xd9, 0x6b, 0xb7, 0xb1, 0xae, 0x8d, 0x62, 0x31, 0x87, 0xe3, 0x9c, 0x00, 0xa4, + 0x8c, 0x25, 0xaa, 0x9d, + ], + shared_secret: [ + 0x3a, 0x60, 0x2b, 0xaf, 0xb8, 0xa2, 0x66, 0x5a, 0x74, 0xdf, 0x34, 0xab, 0x6e, 0x3c, + 0x48, 0x8b, 0x09, 0xe2, 0x28, 0x4e, 0xa1, 0x7d, 0x56, 0x02, 0x62, 0xe2, 0x1f, 0x7f, + 0x3c, 0xba, 0xa3, 0x95, + ], + k_enc: [ + 0x1b, 0x6d, 0xd1, 0x03, 0x49, 0x63, 0x67, 0xc9, 0x2b, 0x36, 0x8f, 0xc2, 0xf1, 0xc6, + 0x2e, 0x56, 0xc8, 0xc9, 0xfb, 0xe3, 0x4a, 0x35, 0x84, 0x1f, 0xe1, 0xa3, 0x70, 0x96, + 0x43, 0xe1, 0x35, 0xe1, + ], + p_enc: [ + 0x03, 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, 0x07, 0xd2, + 0x7a, 0xc6, 0xec, 0x3c, 0x57, 0x25, 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, + 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, + 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, 0xee, 0xba, 0xe6, 0xfa, 0x64, 0xd0, 0x87, 0x40, + 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, 0xc3, 0x93, 0x11, 0x78, + 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, 0xe5, 0xf5, 0xd4, 0xbc, + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, 0x4d, 0xfa, 0xfe, 0x87, 0x52, 0x62, 0xdd, 0x7b, 0xe4, 0x1c, + 0xbb, 0xc6, 0x24, 0x20, 0xd4, 0xad, 0x6d, 0xf5, 0xc9, 0xb7, 0x13, 0x60, 0x4f, 0x65, + 0x60, 0x88, 0xa4, 0x48, 0x5e, 0x93, 0xbe, 0x19, + ], + c_enc: [ + 0xb4, 0x15, 0x88, 0x23, 0x1d, 0x6b, 0xa2, 0x9c, 0xc5, 0xb9, 0xaa, 0xf0, 0xc1, 0xf0, + 0xba, 0x44, 0x16, 0x6e, 0xdb, 0x8a, 0x27, 0x29, 0xca, 0xba, 0x53, 0x71, 0xe7, 0xac, + 0x36, 0x90, 0x0f, 0xaa, 0x64, 0xf5, 0x76, 0x0d, 0xce, 0x55, 0x20, 0xda, 0x82, 0x8d, + 0x5e, 0x25, 0xbd, 0x83, 0x51, 0x95, 0x11, 0x64, 0x12, 0x11, 0x80, 0x9d, 0xff, 0xd8, + 0xcf, 0xeb, 0xff, 0xf3, 0xcd, 0xdc, 0xd2, 0x75, 0x88, 0x1e, 0x39, 0xb6, 0x3d, 0xac, + 0x4d, 0x98, 0x6b, 0x10, 0xc0, 0xe4, 0xc5, 0x52, 0x63, 0xde, 0x3e, 0x02, 0x54, 0x94, + 0x81, 0x8a, 0x38, 0x08, 0xd9, 0xab, 0xc6, 0xec, 0x38, 0x8f, 0x95, 0x26, 0x73, 0x95, + 0x0a, 0xa2, 0xd0, 0xe4, 0xba, 0x00, 0x53, 0x75, 0xac, 0x60, 0x5d, 0xc8, 0x25, 0xde, + 0x4d, 0xd8, 0x93, 0x8b, 0x94, 0x7f, 0xf7, 0x19, 0x4c, 0xfe, 0x7c, 0x1d, 0x79, 0xa1, + 0x27, 0x15, 0x5d, 0x11, 0xcb, 0xe3, 0x43, 0xf3, 0x2f, 0xd1, 0x0c, 0x7d, 0xae, 0x39, + 0x1f, 0x00, 0xb4, 0x4f, 0xbe, 0x30, 0x1c, 0x63, 0xfd, 0x4b, 0xf1, 0xc0, 0xdf, 0xb6, + 0xc9, 0xec, 0xb4, 0xc3, 0xf3, 0xfe, 0xf5, 0x40, 0xb6, 0x7e, 0xb9, 0x23, 0x13, 0x71, + 0x9c, 0x5a, 0x30, 0x7a, 0xd3, 0x95, 0x6b, 0xb9, 0x4e, 0x29, 0x86, 0x85, 0x2a, 0x64, + 0x5a, 0x95, 0xd6, 0xdc, 0x75, 0xaa, 0x27, 0x4c, 0xcf, 0xd2, 0x71, 0xd0, 0xea, 0xe2, + 0x65, 0x81, 0xf5, 0xf5, 0x5d, 0x64, 0x74, 0xaa, 0xad, 0x37, 0x4c, 0x86, 0x45, 0x05, + 0xe6, 0x92, 0x37, 0xf6, 0x66, 0x99, 0xee, 0x39, 0xe9, 0xfc, 0xf5, 0xb1, 0xb7, 0x03, + 0x35, 0x1e, 0x71, 0xf6, 0x3b, 0x02, 0x33, 0x40, 0x82, 0xee, 0xbe, 0xd8, 0x68, 0xb5, + 0x61, 0x2a, 0x33, 0x95, 0x78, 0x5a, 0x33, 0x2a, 0x52, 0x43, 0xe4, 0x98, 0x6e, 0x1f, + 0xf5, 0xb4, 0x2d, 0x06, 0x69, 0xc1, 0x5c, 0x45, 0xff, 0x81, 0xe2, 0x2e, 0xea, 0xe4, + 0xde, 0x7d, 0x9a, 0x4f, 0x57, 0x24, 0xc8, 0x96, 0x03, 0x94, 0x92, 0x5b, 0xa1, 0xa1, + 0x90, 0x0f, 0xa2, 0xb5, 0x59, 0x3d, 0x55, 0x45, 0x5e, 0x0b, 0xe0, 0x31, 0x8c, 0x80, + 0x23, 0x81, 0xec, 0x9c, 0x0a, 0x83, 0xc2, 0xe5, 0xf9, 0x33, 0x9f, 0x02, 0x9c, 0x44, + 0x24, 0x72, 0x8f, 0x91, 0x9d, 0x18, 0x4f, 0x36, 0x16, 0x50, 0xba, 0x65, 0xd6, 0x98, + 0xa8, 0xd1, 0x67, 0xbe, 0xd9, 0xdd, 0x01, 0xfa, 0x70, 0x74, 0xe4, 0x6a, 0xf6, 0x57, + 0x16, 0xdd, 0xd9, 0x7e, 0x7b, 0xb6, 0x00, 0x13, 0x05, 0x96, 0x8c, 0xd5, 0xb4, 0x87, + 0x0d, 0xf2, 0x00, 0x42, 0xe7, 0x69, 0xe0, 0x2d, 0xf1, 0x8b, 0x9f, 0xde, 0x9f, 0xda, + 0xa7, 0x6b, 0x00, 0xca, 0x26, 0x45, 0x9d, 0x54, 0x37, 0x19, 0x19, 0x72, 0xd7, 0x08, + 0xde, 0xda, 0xbf, 0x1d, 0x61, 0x7f, 0x73, 0x3a, 0x60, 0xeb, 0xfe, 0xc6, 0xac, 0xf0, + 0x0b, 0xb1, 0xdf, 0xbf, 0x11, 0x2d, 0x3a, 0xaa, 0xc9, 0xfb, 0xd2, 0x30, 0xcc, 0xaa, + 0x9c, 0xf3, 0x58, 0x45, 0x93, 0x54, 0xac, 0x5b, 0x29, 0xbd, 0xb7, 0x3a, 0x45, 0x27, + 0x1b, 0x1f, 0x9e, 0xd0, 0x0e, 0x3e, 0x20, 0xb1, 0x2f, 0xed, 0x5c, 0xd5, 0x6a, 0xbb, + 0xb0, 0xb9, 0x4a, 0x9e, 0xee, 0x5f, 0xf8, 0xf9, 0x36, 0x1d, 0xfd, 0x6c, 0x94, 0x08, + 0x5d, 0x28, 0x98, 0xe5, 0x46, 0xeb, 0x92, 0xe6, 0xdb, 0xe9, 0xf0, 0x2e, 0xb5, 0xbf, + 0x7d, 0x12, 0x67, 0x5d, 0x3c, 0x6a, 0xc7, 0x18, 0x4b, 0x26, 0x01, 0xe4, 0xf4, 0x05, + 0x37, 0x3a, 0x4f, 0x1c, 0x5d, 0xf7, 0x6b, 0x3c, 0xb5, 0x29, 0x99, 0xd8, 0x0f, 0x59, + 0xb3, 0x94, 0xbc, 0xed, 0x9f, 0x66, 0xbc, 0xf7, 0xdc, 0x37, 0xc2, 0xb4, 0xc6, 0xf7, + 0x74, 0x5b, 0xc6, 0xf0, 0x37, 0x74, 0xfa, 0xc6, 0x24, 0x5d, 0x7c, 0x63, 0x6d, 0xfc, + 0x5f, 0x76, 0x58, 0xb2, 0xd2, 0xfd, 0x84, 0xac, 0xa9, 0xe0, 0xef, 0xcd, 0xe0, 0x09, + 0x3e, 0x62, 0x29, 0x38, 0xb7, 0x5d, 0xae, 0x66, 0xcf, 0x63, 0xf6, 0xd2, 0x35, 0x17, + 0x2e, 0x5a, 0x0b, 0xbe, 0xcd, 0x15, 0x56, 0x6c, 0x61, 0xfe, 0x5a, 0x58, 0x94, 0x7c, + 0x18, 0xb9, 0xb5, 0xa1, 0x27, 0x29, 0x4b, 0x67, 0x67, 0xd0, 0x2b, 0x0f, 0x66, 0x4c, + 0xef, 0x25, 0x8e, 0x26, 0x11, 0x1c, 0xf0, 0x9c, 0x9b, 0x61, 0xd4, 0x41, 0x52, 0x8d, + 0x8c, 0xa2, 0xd8, 0x00, 0x5c, 0xad, 0x2a, 0xe4, 0x16, 0xe3, 0x4b, 0xb2, 0x6b, 0x41, + 0xa1, 0x85, 0x5a, 0xf9, 0x90, 0xcd, 0xb6, 0x77, 0xaf, 0x0d, + ], + ock: [ + 0x67, 0x1c, 0xed, 0xd6, 0xf5, 0x73, 0xa4, 0x6f, 0xf1, 0xea, 0xd0, 0x48, 0x21, 0x98, + 0x56, 0x36, 0xe2, 0x3f, 0xb1, 0x5c, 0x6f, 0x48, 0x05, 0xfd, 0x57, 0x63, 0x12, 0xc2, + 0x07, 0x02, 0xa4, 0x24, + ], + op: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, + 0xa5, 0xd8, 0x9a, 0xa8, 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, + 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, + ], + c_out: [ + 0x59, 0x97, 0x53, 0xe4, 0x0a, 0xda, 0xea, 0xff, 0x6f, 0xaa, 0xf5, 0xa6, 0xf3, 0x0e, + 0x39, 0x13, 0x8f, 0xde, 0x82, 0x0f, 0x7b, 0xec, 0x7c, 0x8d, 0x0f, 0xd8, 0x4b, 0x48, + 0x36, 0x94, 0xe5, 0x0c, 0x4b, 0xdd, 0xee, 0x2f, 0xb1, 0xa4, 0xf9, 0x95, 0xb1, 0xa3, + 0xba, 0x40, 0xf4, 0x66, 0xb4, 0x2e, 0x8b, 0x5d, 0x01, 0x38, 0xfd, 0x30, 0xbf, 0xf6, + 0xae, 0x8c, 0xb1, 0x55, 0xf4, 0x0c, 0xdc, 0x37, 0x39, 0xfa, 0xbf, 0x2f, 0x00, 0xda, + 0x3a, 0xc6, 0xa7, 0x36, 0x3b, 0xc2, 0xf4, 0xaa, 0x10, 0xfe, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xb4, 0x9e, 0x3c, 0x5b, 0xb9, 0x9e, 0x47, 0xc5, 0x3d, 0x6e, 0x5c, 0x34, 0x7c, 0x99, + 0x8f, 0x30, 0x2d, 0x3f, 0xf4, 0x75, 0x23, 0xe7, 0xc3, 0xd7, 0xb6, 0x4c, 0x82, 0x98, + 0xdc, 0x7b, 0x10, 0xe9, 0x54, 0xdf, 0x06, 0x00, 0x0b, 0xc0, 0xcc, 0x30, 0xec, 0xf6, + 0x75, 0x5d, 0x92, 0x7e, 0xee, 0xce, 0xe6, 0xec, 0x9e, 0x8e, 0x0c, 0xba, 0xa3, 0x1b, + 0x71, 0xe0, 0xa4, 0x33, 0x4a, 0xd6, 0x42, 0x1b, + ], + ovk: [ + 0x97, 0x9f, 0x06, 0x58, 0x66, 0x73, 0xbc, 0x6f, 0xf1, 0xc5, 0xd3, 0xb3, 0x20, 0xf3, + 0x49, 0xa5, 0xb3, 0xa8, 0xb3, 0x55, 0x59, 0x22, 0x96, 0xaa, 0xf6, 0x1c, 0x5b, 0x72, + 0x52, 0xf7, 0x3e, 0xc0, + ], + default_d: [ + 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, + ], + default_pk_d: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, + ], + v: 5531329397987978327, + rseed: [ + 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, + 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, + 0xd0, 0x11, 0x8b, 0xbd, + ], + asset: [ + 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, + 0xe3, 0x7a, 0x83, 0xec, 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, + 0x29, 0x03, 0x35, 0xaa, + ], + memo: [ + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, 0xa8, 0xf2, 0xdc, 0x53, 0xf4, 0x6f, 0x6c, 0x9b, 0x07, 0xad, + 0xdf, 0x14, 0x6f, 0x4f, 0xfa, 0x50, 0x1f, 0x9d, 0xd3, 0xcf, 0xf9, 0x24, 0xe3, 0x01, + 0x0f, 0xaf, 0x50, 0x4e, 0x2b, 0x8a, 0xca, 0x73, + ], + cv_net: [ + 0x1a, 0xa2, 0x3d, 0x96, 0x79, 0xbc, 0x66, 0x04, 0xb6, 0x25, 0x2c, 0x4f, 0x48, 0x1b, + 0x3a, 0x2a, 0xf5, 0x46, 0x32, 0xf8, 0x30, 0x08, 0x14, 0x68, 0x29, 0x65, 0x94, 0x5e, + 0x7e, 0x33, 0x2a, 0x0d, + ], + rho: [ + 0x09, 0x1d, 0x83, 0x73, 0x3a, 0x9f, 0xfb, 0x18, 0xc1, 0x7a, 0xd1, 0x93, 0x8d, 0xd2, + 0x67, 0x93, 0xc3, 0xfe, 0xfa, 0xda, 0xee, 0xa8, 0xe2, 0x3c, 0x44, 0xd5, 0xe0, 0x18, + 0x4b, 0xc8, 0x45, 0x10, + ], + cmx: [ + 0x76, 0xf1, 0xbd, 0x50, 0xf9, 0xb9, 0x06, 0xcb, 0x9f, 0xf2, 0xdd, 0x91, 0x8a, 0x36, + 0x7e, 0x5f, 0xb1, 0xa2, 0xef, 0x39, 0xf1, 0x4f, 0x6c, 0xe9, 0x4f, 0xf9, 0xf0, 0x91, + 0x55, 0xf8, 0xc2, 0x11, + ], + esk: [ + 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, 0xa1, 0xe6, 0xfb, 0x57, + 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, 0xb9, 0x5f, 0xc8, 0x7e, + 0xa7, 0x37, 0x3e, 0x2f, + ], + ephemeral_key: [ + 0xda, 0x72, 0x84, 0xa0, 0xe0, 0xde, 0x52, 0x09, 0x3c, 0xc2, 0xe1, 0x9c, 0x0a, 0xf1, + 0x93, 0xbd, 0xb4, 0x2c, 0x80, 0xc9, 0xc7, 0xf9, 0xf2, 0x36, 0x00, 0xe6, 0x08, 0x01, + 0x72, 0xc5, 0xf5, 0x39, + ], + shared_secret: [ + 0x9b, 0xcf, 0xb9, 0x6f, 0x4c, 0xf1, 0x83, 0xc1, 0x7f, 0xb1, 0x99, 0xda, 0x16, 0x5f, + 0xbf, 0x8a, 0x47, 0x47, 0x7e, 0x00, 0x36, 0x6d, 0x1c, 0xb7, 0x3b, 0x32, 0xec, 0x0e, + 0x3a, 0xc1, 0x98, 0x0f, + ], + k_enc: [ + 0x21, 0xe0, 0x97, 0x87, 0x0a, 0xee, 0xc0, 0x19, 0x76, 0x86, 0xee, 0x37, 0x22, 0x78, + 0xfe, 0x4a, 0xa2, 0x23, 0x8d, 0x87, 0x65, 0x32, 0x63, 0x84, 0x8a, 0x2f, 0xf5, 0x27, + 0x9f, 0x2b, 0x1d, 0x9b, + ], + p_enc: [ + 0x03, 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, 0x57, 0xac, + 0xbf, 0xfe, 0xc7, 0x3a, 0xc3, 0x4c, 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, + 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, + 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, 0xd0, 0x11, 0x8b, 0xbd, 0xc3, 0xcc, 0x4f, 0x43, + 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, 0xe3, 0x7a, 0x83, 0xec, + 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, 0x29, 0x03, 0x35, 0xaa, + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, 0xa8, 0xf2, 0xdc, 0x53, 0xf4, 0x6f, 0x6c, 0x9b, 0x07, 0xad, + 0xdf, 0x14, 0x6f, 0x4f, 0xfa, 0x50, 0x1f, 0x9d, 0xd3, 0xcf, 0xf9, 0x24, 0xe3, 0x01, + 0x0f, 0xaf, 0x50, 0x4e, 0x2b, 0x8a, 0xca, 0x73, + ], + c_enc: [ + 0x13, 0xd7, 0xdf, 0xcd, 0x1d, 0x75, 0x4d, 0xcd, 0x16, 0x52, 0x32, 0x83, 0x8f, 0x14, + 0xdd, 0x80, 0x5e, 0x12, 0xcc, 0x7e, 0x75, 0x15, 0x43, 0xd2, 0xa6, 0x8e, 0x23, 0x7a, + 0x92, 0x3b, 0xce, 0xeb, 0xa3, 0x5a, 0x62, 0x43, 0xc6, 0xa4, 0xc5, 0xf0, 0xd2, 0xa4, + 0xc3, 0x86, 0x07, 0xa6, 0xf1, 0x1b, 0x17, 0xfd, 0xd6, 0xc6, 0x92, 0x66, 0xf2, 0xc9, + 0x6a, 0xdc, 0x44, 0x6f, 0x2e, 0x2d, 0x07, 0x3e, 0xe9, 0xea, 0xe2, 0x9a, 0x37, 0xef, + 0x5d, 0x03, 0xf6, 0x78, 0xf5, 0x56, 0x29, 0x45, 0xb2, 0x08, 0x27, 0x76, 0xce, 0x9f, + 0x39, 0x08, 0x87, 0x3a, 0x99, 0xa6, 0xa2, 0x8b, 0xae, 0xdc, 0x7f, 0x54, 0x89, 0xce, + 0x4b, 0x30, 0xd8, 0x43, 0x66, 0xc5, 0x46, 0xb4, 0x36, 0x67, 0x91, 0x44, 0xf9, 0x27, + 0xf7, 0x1c, 0x65, 0x09, 0x69, 0xda, 0x22, 0x42, 0x28, 0x5a, 0x86, 0x27, 0x96, 0x54, + 0x89, 0xb7, 0x0b, 0x35, 0x6c, 0xf7, 0x4e, 0x07, 0x8a, 0xa2, 0x7d, 0xa8, 0xf9, 0x2f, + 0xb3, 0x09, 0x57, 0x12, 0x62, 0xf2, 0xd4, 0xc3, 0x36, 0xf7, 0x12, 0x15, 0x9b, 0x3e, + 0x9b, 0x43, 0x24, 0x38, 0x5b, 0xb3, 0x26, 0x2a, 0xc5, 0xf3, 0x13, 0x57, 0xaf, 0x9e, + 0x1a, 0xaa, 0x75, 0xd0, 0x1c, 0x06, 0x31, 0xbf, 0xdd, 0x34, 0xc5, 0x9b, 0x27, 0xd5, + 0x3b, 0xeb, 0xf1, 0xaa, 0x54, 0xe9, 0xc4, 0xaa, 0x98, 0x0f, 0x24, 0x7b, 0xf4, 0x22, + 0xa0, 0xe6, 0xdb, 0xf5, 0x54, 0x6e, 0xdc, 0x10, 0x0f, 0xce, 0x6c, 0xce, 0xc8, 0x32, + 0x7e, 0xb4, 0x8a, 0x9a, 0x39, 0xe4, 0xc2, 0xa9, 0x12, 0xb2, 0x98, 0x85, 0xe0, 0xc3, + 0xe7, 0x33, 0x55, 0x58, 0xbd, 0x85, 0x84, 0x38, 0xd0, 0x35, 0xd2, 0xf2, 0xbe, 0x1d, + 0x35, 0x66, 0xe4, 0x22, 0xfe, 0x37, 0xc0, 0xcb, 0x2e, 0x05, 0x8d, 0xad, 0x8c, 0xc6, + 0x45, 0x62, 0xa5, 0x50, 0x1b, 0x54, 0xa4, 0x4f, 0x9a, 0x77, 0x77, 0xc6, 0xd2, 0x77, + 0x04, 0xa4, 0xce, 0xad, 0x26, 0xa1, 0xc2, 0x56, 0x01, 0x8d, 0xc1, 0xbb, 0xfa, 0x58, + 0x84, 0xa0, 0x6c, 0xc7, 0x25, 0x23, 0xaf, 0xfb, 0x43, 0xf5, 0xc5, 0xbc, 0x2f, 0x1d, + 0x36, 0x04, 0x0f, 0x85, 0xf7, 0xe8, 0xc0, 0x62, 0xc1, 0xf2, 0x26, 0x50, 0x9d, 0x20, + 0xf9, 0xa4, 0x88, 0x5e, 0x15, 0x70, 0x4f, 0x73, 0x01, 0xdf, 0x60, 0x3d, 0xa1, 0xfc, + 0x5b, 0xca, 0x84, 0xf8, 0x55, 0xc1, 0x17, 0xcb, 0x30, 0x55, 0xc5, 0x70, 0x83, 0x45, + 0x7e, 0x1d, 0x14, 0x85, 0x7c, 0x2b, 0xf9, 0x41, 0xe8, 0x20, 0x73, 0x5c, 0x58, 0x8a, + 0xae, 0x6f, 0x66, 0x45, 0xdc, 0x3f, 0xbd, 0x30, 0x65, 0xab, 0xa1, 0x7f, 0xd2, 0x48, + 0x2a, 0x1b, 0x37, 0xb2, 0xf3, 0x88, 0x07, 0x5e, 0x46, 0xbb, 0x9d, 0x37, 0x27, 0xcc, + 0x73, 0xdb, 0xae, 0x0e, 0x96, 0xa8, 0x44, 0x5f, 0xda, 0x8f, 0x87, 0x64, 0xf9, 0x68, + 0x0b, 0xf6, 0xc5, 0x91, 0xa8, 0x48, 0x10, 0xfa, 0x0c, 0x1b, 0x5a, 0x2f, 0x2a, 0xa9, + 0xad, 0xbb, 0x88, 0x64, 0x22, 0x31, 0x72, 0x1e, 0xd6, 0xea, 0x12, 0x16, 0xab, 0x9b, + 0xfa, 0x0e, 0x12, 0x4c, 0xe4, 0x74, 0x94, 0x44, 0x53, 0x4d, 0x68, 0x70, 0x19, 0x74, + 0x60, 0xf7, 0x49, 0xef, 0xb0, 0x28, 0x8f, 0x96, 0x28, 0x3f, 0xc9, 0x37, 0xef, 0xbb, + 0x14, 0x59, 0xaa, 0x73, 0xc2, 0x7b, 0x6b, 0x2b, 0x5c, 0x57, 0x7d, 0x46, 0x60, 0xf9, + 0x8e, 0x81, 0x8c, 0xaa, 0xad, 0xbe, 0x45, 0x4e, 0xcd, 0x16, 0xc1, 0xd8, 0xa9, 0x9b, + 0x77, 0x97, 0x8e, 0x93, 0xd6, 0x9d, 0xcb, 0x8b, 0xf0, 0xe8, 0x4a, 0x0a, 0x91, 0x3f, + 0x55, 0xcc, 0x16, 0x50, 0xc2, 0xb9, 0x2d, 0x4c, 0x9d, 0xcd, 0xb1, 0x2e, 0xe2, 0x36, + 0x7e, 0xd9, 0x79, 0xb9, 0x53, 0x5f, 0xe1, 0x5c, 0x87, 0xd1, 0x7f, 0x37, 0xa3, 0x24, + 0x84, 0x7f, 0x16, 0x45, 0x39, 0x75, 0x7d, 0x83, 0x00, 0x87, 0xf6, 0x39, 0xeb, 0x6c, + 0x3e, 0xfb, 0x8d, 0xa4, 0xff, 0xa5, 0xd7, 0xca, 0x58, 0x34, 0x4d, 0x65, 0x81, 0x76, + 0x64, 0xa7, 0x4e, 0xaf, 0xa1, 0xa4, 0x7f, 0x69, 0xf1, 0xc8, 0x10, 0x6b, 0x6f, 0x5f, + 0x96, 0x4f, 0x4c, 0x73, 0xed, 0xed, 0xb1, 0xe1, 0x25, 0xde, 0xb2, 0x28, 0xc5, 0x62, + 0xfd, 0xc1, 0x87, 0x41, 0x41, 0xa9, 0x7c, 0x62, 0x58, 0x16, 0xc0, 0xcf, 0xeb, 0x83, + 0x84, 0x28, 0x7f, 0x6b, 0x2d, 0x5f, 0xa1, 0x81, 0x89, 0xe1, 0x4f, 0x91, 0xdf, 0x72, + 0x4e, 0x59, 0x80, 0x45, 0x8c, 0x51, 0xfb, 0x1c, 0xd8, 0x46, + ], + ock: [ + 0x57, 0x97, 0xef, 0x48, 0x70, 0xb0, 0x86, 0x50, 0xfa, 0x99, 0xad, 0xae, 0x58, 0x85, + 0x19, 0x9e, 0x3b, 0x04, 0x4b, 0x2a, 0x0a, 0x8c, 0xe1, 0x61, 0x43, 0x42, 0xb5, 0xdc, + 0xb2, 0x8e, 0x6e, 0x09, + ], + op: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, + 0xa1, 0xe6, 0xfb, 0x57, 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, + 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, + ], + c_out: [ + 0xb8, 0xb4, 0x6c, 0x7e, 0xc4, 0xa8, 0x74, 0x2a, 0x22, 0xd3, 0xcd, 0x11, 0x74, 0x1c, + 0x23, 0x04, 0x22, 0x1c, 0xa5, 0x97, 0x29, 0x4e, 0x08, 0xa4, 0xc7, 0x1b, 0x17, 0xc7, + 0x26, 0x5d, 0x4d, 0xa7, 0x7c, 0xfe, 0x84, 0xb8, 0x7e, 0x76, 0xed, 0xaa, 0xec, 0xc2, + 0x24, 0xb8, 0x36, 0xde, 0x22, 0x4c, 0x73, 0x58, 0x13, 0x19, 0xa0, 0xba, 0x27, 0x88, + 0xdb, 0xf8, 0x3b, 0xcf, 0x47, 0xa4, 0x8e, 0xeb, 0x02, 0xb4, 0x3a, 0x18, 0x02, 0x7b, + 0x8f, 0x59, 0x11, 0x65, 0xc2, 0x86, 0xe8, 0xb6, 0x54, 0xec, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xa6, 0x68, 0x13, 0x52, 0xa3, 0x52, 0x26, 0x91, 0x10, 0x0f, 0x53, 0xfc, 0x34, 0xab, + 0x73, 0x32, 0x8a, 0xf1, 0xb9, 0xf3, 0xa4, 0xa0, 0x6d, 0xbd, 0x3a, 0x14, 0x99, 0x67, + 0x09, 0xe6, 0xf2, 0x84, 0x31, 0xee, 0x72, 0xf2, 0x69, 0xae, 0xd7, 0x5d, 0x36, 0x34, + 0x89, 0x36, 0x90, 0x5e, 0xbb, 0x91, 0x80, 0x7d, 0x74, 0xd5, 0x0c, 0xb2, 0x7f, 0xcd, + 0x8b, 0x4f, 0xb6, 0xf4, 0x48, 0xc3, 0x62, 0x03, + ], + ovk: [ + 0x78, 0xf1, 0x45, 0xea, 0x29, 0xd2, 0x71, 0xb9, 0x40, 0xc6, 0x99, 0x41, 0xe4, 0xc3, + 0xfd, 0x2d, 0x71, 0xf3, 0xb1, 0x90, 0x69, 0x0e, 0xe1, 0x6f, 0x5d, 0x14, 0xac, 0x22, + 0x24, 0xe6, 0xfc, 0x89, + ], + default_d: [ + 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, + ], + default_pk_d: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, + ], + v: 15093716717054627455, + rseed: [ + 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, + 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, + 0x24, 0x57, 0x16, 0xa4, + ], + asset: [ + 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, + 0xab, 0xcf, 0xac, 0x88, 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, + 0x07, 0x2d, 0x2d, 0x18, + ], + memo: [ + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, 0xf6, 0xe1, 0x70, 0x81, 0xd5, 0x81, 0x8e, 0x88, 0xb1, 0x4e, + 0x4f, 0x60, 0x1b, 0x8c, 0x06, 0x3e, 0x3f, 0x43, 0x87, 0xff, 0xa2, 0x32, 0x2a, 0x51, + 0x81, 0x90, 0x9f, 0x09, 0x80, 0xd6, 0x89, 0xde, + ], + cv_net: [ + 0x91, 0x6d, 0xc3, 0x82, 0x2a, 0x4e, 0x3b, 0xb4, 0x1f, 0xa8, 0x33, 0xc2, 0x73, 0xa9, + 0xd3, 0x7d, 0x17, 0x17, 0xa4, 0x8d, 0x8f, 0x00, 0x6c, 0x1f, 0xf5, 0x86, 0x21, 0x46, + 0x29, 0x55, 0x39, 0x1c, + ], + rho: [ + 0x57, 0x87, 0x18, 0x97, 0x6d, 0xa3, 0xdc, 0xb4, 0x30, 0x32, 0x71, 0x52, 0x20, 0x72, + 0xd0, 0x28, 0x44, 0x22, 0x13, 0x50, 0x86, 0x4e, 0xed, 0x56, 0x3d, 0xab, 0x30, 0x22, + 0x7f, 0x28, 0x4b, 0x2e, + ], + cmx: [ + 0x89, 0xe6, 0xa2, 0xb9, 0x70, 0x84, 0xe3, 0xd3, 0x34, 0x4f, 0xee, 0xb4, 0x64, 0x65, + 0x05, 0x72, 0x51, 0xb1, 0x9d, 0xa0, 0xce, 0xdf, 0x79, 0x71, 0x94, 0xc5, 0x97, 0xf9, + 0xf7, 0x7e, 0xf2, 0x1f, + ], + esk: [ + 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, 0x02, 0xf5, 0x10, 0xe9, + 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, 0xc4, 0x69, 0x2d, 0x0c, + 0x1b, 0x30, 0x33, 0x01, + ], + ephemeral_key: [ + 0x27, 0xcb, 0x40, 0x68, 0x0f, 0xb1, 0xd9, 0x19, 0x64, 0x6e, 0x74, 0x20, 0xe6, 0xa8, + 0xb5, 0x20, 0xe1, 0x9a, 0x17, 0x3f, 0x1e, 0x79, 0x4d, 0x2b, 0x49, 0x2b, 0xfa, 0xbb, + 0x83, 0xce, 0x6c, 0xa0, + ], + shared_secret: [ + 0x1c, 0xd0, 0x66, 0x91, 0x6c, 0x19, 0xfa, 0x33, 0x69, 0xaa, 0x3c, 0x6a, 0x53, 0x76, + 0x97, 0xf4, 0xb4, 0x26, 0x44, 0xda, 0x20, 0xca, 0x46, 0x79, 0x93, 0x2b, 0x7c, 0x90, + 0x5f, 0x2d, 0x69, 0x00, + ], + k_enc: [ + 0xce, 0x9d, 0x22, 0x0d, 0x3a, 0xfe, 0xc6, 0x23, 0x21, 0xdd, 0xf1, 0x97, 0xa6, 0x36, + 0xdc, 0xb3, 0x45, 0x58, 0x83, 0xb7, 0x35, 0x82, 0x8c, 0x65, 0xe7, 0x16, 0x6c, 0x15, + 0xd8, 0xcc, 0xfc, 0xf9, + ], + p_enc: [ + 0x03, 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, 0x7f, 0x8e, + 0x6a, 0x5c, 0x62, 0xa7, 0x77, 0xd1, 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, + 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, + 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, 0x24, 0x57, 0x16, 0xa4, 0x96, 0x86, 0xaa, 0x36, + 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, 0xab, 0xcf, 0xac, 0x88, + 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, 0x07, 0x2d, 0x2d, 0x18, + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, 0xf6, 0xe1, 0x70, 0x81, 0xd5, 0x81, 0x8e, 0x88, 0xb1, 0x4e, + 0x4f, 0x60, 0x1b, 0x8c, 0x06, 0x3e, 0x3f, 0x43, 0x87, 0xff, 0xa2, 0x32, 0x2a, 0x51, + 0x81, 0x90, 0x9f, 0x09, 0x80, 0xd6, 0x89, 0xde, + ], + c_enc: [ + 0xb1, 0x69, 0x64, 0x77, 0xe6, 0x58, 0xb6, 0xf8, 0xe2, 0x4e, 0x02, 0x55, 0x52, 0xb4, + 0x8d, 0xd4, 0x84, 0x58, 0xf2, 0xcd, 0x75, 0x70, 0xc0, 0xe8, 0xce, 0xc4, 0xed, 0x4c, + 0xf7, 0x9b, 0xd5, 0xb6, 0x9e, 0xa8, 0x54, 0x12, 0x3b, 0x4e, 0xaf, 0x97, 0x8b, 0x14, + 0x2e, 0xb3, 0xef, 0x53, 0xaa, 0xfc, 0x78, 0x90, 0xdd, 0xa2, 0x8a, 0xfa, 0x25, 0xf1, + 0x45, 0xc8, 0xb9, 0x7f, 0x7b, 0x94, 0x50, 0xc1, 0xd5, 0xe0, 0xc3, 0x7d, 0xaf, 0x5e, + 0xd4, 0xec, 0xd9, 0xb6, 0x3d, 0xbc, 0xd2, 0x15, 0x11, 0x23, 0x13, 0x9b, 0xbc, 0x2b, + 0x65, 0x1a, 0x8f, 0x69, 0xcf, 0xbf, 0xb7, 0xcb, 0x60, 0x44, 0x78, 0xf3, 0xf2, 0x64, + 0xd9, 0xdd, 0x75, 0xcf, 0x31, 0x9e, 0x3e, 0xcd, 0xf5, 0xb3, 0x34, 0x26, 0x54, 0x85, + 0x7c, 0x52, 0xa1, 0xfc, 0x61, 0x40, 0x55, 0xa2, 0x46, 0xf5, 0x26, 0x3e, 0x85, 0x36, + 0x83, 0xef, 0x54, 0x41, 0x3b, 0xac, 0x99, 0x1a, 0xe6, 0x35, 0x01, 0x50, 0xe1, 0x34, + 0x52, 0xa3, 0xa6, 0x20, 0xc5, 0x3f, 0x80, 0xda, 0xcc, 0x7a, 0xf0, 0x59, 0x26, 0xd9, + 0xc5, 0x9a, 0x94, 0xe4, 0x78, 0x9a, 0xcc, 0x68, 0xd8, 0x51, 0x05, 0x6b, 0x75, 0xa7, + 0x4e, 0x2e, 0x1b, 0x38, 0xbf, 0xcb, 0x6d, 0xba, 0xab, 0x37, 0xa3, 0x8a, 0xe0, 0x2c, + 0x9c, 0x35, 0x25, 0x9e, 0x52, 0x84, 0xe4, 0xfe, 0x83, 0xdd, 0xb2, 0x29, 0x24, 0xa1, + 0xc4, 0x0a, 0xa2, 0x5e, 0xd1, 0xf5, 0xc0, 0x6d, 0xa1, 0x58, 0x31, 0xf0, 0x41, 0x50, + 0xa3, 0x7c, 0x1b, 0xa3, 0xd1, 0x17, 0x04, 0x93, 0xca, 0x29, 0xf3, 0x43, 0x4a, 0xfa, + 0x06, 0x9b, 0x46, 0xaf, 0xdc, 0x87, 0x0a, 0x29, 0x6f, 0xdc, 0x0e, 0xb6, 0x1b, 0x55, + 0x70, 0x77, 0xa1, 0xda, 0x1f, 0xe8, 0x22, 0xb6, 0xce, 0x24, 0x7c, 0x8e, 0x19, 0x9f, + 0xc4, 0x85, 0x14, 0x6f, 0x38, 0x4a, 0xcf, 0x5c, 0x52, 0x69, 0x7e, 0xfa, 0xcc, 0x5b, + 0xfe, 0x42, 0x02, 0xe8, 0x5f, 0x06, 0x4b, 0xc8, 0xe1, 0x2e, 0xee, 0x39, 0x79, 0x6d, + 0xfd, 0x13, 0x99, 0xb1, 0xc1, 0xe8, 0xc7, 0x4b, 0x5e, 0xc3, 0xc3, 0x1d, 0x2c, 0xfa, + 0x44, 0x87, 0x02, 0x5c, 0xeb, 0x5d, 0xb3, 0x55, 0x9d, 0x4b, 0x7b, 0xac, 0x02, 0x73, + 0xf1, 0x33, 0x51, 0xd2, 0xd1, 0x3c, 0xec, 0x0a, 0x44, 0x8c, 0x00, 0x11, 0x09, 0x45, + 0x2c, 0x40, 0x92, 0xc8, 0x11, 0x91, 0xa0, 0xda, 0xa9, 0x79, 0xe2, 0x6a, 0x96, 0x24, + 0xe4, 0x0c, 0xa4, 0xac, 0xcb, 0x63, 0x46, 0xaa, 0xe1, 0x88, 0xca, 0x09, 0x39, 0xdd, + 0x9f, 0x6b, 0x6e, 0x45, 0xe4, 0x1b, 0xca, 0xeb, 0xdc, 0x1d, 0xa8, 0x01, 0xcc, 0xd4, + 0xdc, 0x93, 0x32, 0x26, 0x6f, 0xb3, 0xeb, 0x23, 0x7b, 0x07, 0x72, 0x45, 0xa7, 0x91, + 0xec, 0xb4, 0x0e, 0x5c, 0x40, 0x56, 0xad, 0xd6, 0xb1, 0xb5, 0xf7, 0xf8, 0xfa, 0x10, + 0x4f, 0xba, 0x61, 0x3e, 0xd9, 0x29, 0xe1, 0xfa, 0xd2, 0x26, 0x47, 0x50, 0x35, 0xb6, + 0x1a, 0x9f, 0x85, 0xaf, 0xba, 0xfb, 0x16, 0x6b, 0x24, 0xc2, 0x4d, 0x2c, 0x28, 0x93, + 0x7b, 0x17, 0x70, 0xba, 0x26, 0x9c, 0x15, 0xeb, 0x2d, 0x9b, 0xdc, 0x2b, 0x83, 0xea, + 0xd8, 0xa0, 0x1d, 0xdb, 0x11, 0x08, 0x3b, 0x13, 0xd6, 0x2d, 0x57, 0x2c, 0xf7, 0x8d, + 0x5c, 0xba, 0x6f, 0x36, 0x52, 0xca, 0xc4, 0xd2, 0x4c, 0x71, 0xc5, 0x47, 0x27, 0x26, + 0x24, 0xc0, 0x78, 0xe0, 0xb9, 0x69, 0x68, 0xfe, 0x09, 0xd8, 0x3e, 0xf7, 0x30, 0x20, + 0x62, 0xbb, 0x5d, 0x3a, 0x2c, 0xcf, 0x73, 0x4e, 0x0f, 0xd3, 0x51, 0x01, 0xfd, 0x58, + 0x64, 0x73, 0x3f, 0x44, 0xd0, 0x75, 0xc3, 0x8b, 0x73, 0xf6, 0xbf, 0xb8, 0xc3, 0x9c, + 0x7b, 0x6b, 0x3d, 0xbc, 0xd1, 0x9a, 0x05, 0x89, 0x91, 0x86, 0x37, 0xf7, 0x5b, 0xbe, + 0x40, 0x15, 0x7b, 0x80, 0xe5, 0x9e, 0x55, 0x58, 0x50, 0x28, 0xa5, 0xec, 0x20, 0x1e, + 0x00, 0x8f, 0xf6, 0xf5, 0x12, 0xe2, 0x53, 0xcc, 0x9a, 0xcf, 0x62, 0x7d, 0x94, 0x35, + 0xdb, 0x6b, 0x14, 0xb9, 0x82, 0x48, 0x79, 0xf4, 0xe4, 0x0a, 0x36, 0xd5, 0xec, 0x94, + 0x2b, 0xff, 0x04, 0xfd, 0x0b, 0xb8, 0x0c, 0x3e, 0xdd, 0xb7, 0xb2, 0x0a, 0x11, 0x6b, + 0xa7, 0x0d, 0x84, 0x84, 0x6e, 0xc6, 0xd2, 0x52, 0x0f, 0xe7, 0x68, 0x89, 0x9e, 0xd5, + 0x27, 0xd3, 0x1d, 0x32, 0x19, 0x68, 0xde, 0xc1, 0x32, 0x7b, 0x81, 0xcc, 0x61, 0x89, + 0x8f, 0x2c, 0xc4, 0x5a, 0xeb, 0x43, 0x52, 0x9e, 0x7d, 0x08, + ], + ock: [ + 0x95, 0x83, 0xf1, 0x0f, 0xed, 0x70, 0xa4, 0x1e, 0x45, 0x8c, 0x65, 0x5c, 0xc0, 0x14, + 0xe2, 0x35, 0x5a, 0x7f, 0x99, 0xae, 0xbc, 0xfe, 0xf7, 0x4a, 0x55, 0x9a, 0xcd, 0x24, + 0x25, 0xfa, 0x21, 0xcf, + ], + op: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, + 0x02, 0xf5, 0x10, 0xe9, 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, + 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, + ], + c_out: [ + 0xb8, 0x3b, 0x74, 0x5c, 0x9c, 0x0b, 0x04, 0xdd, 0xc7, 0xf1, 0x38, 0x16, 0x94, 0x38, + 0x99, 0x55, 0x3a, 0x30, 0x6a, 0x4a, 0xd0, 0xf2, 0xf5, 0x70, 0x92, 0x2a, 0x89, 0x9b, + 0xab, 0xb9, 0xda, 0xca, 0xd2, 0xbb, 0xc9, 0x5c, 0xf6, 0x5b, 0x73, 0x08, 0x55, 0x0d, + 0xce, 0xdb, 0x64, 0x9e, 0xf1, 0x5e, 0x0b, 0x1a, 0x09, 0x1f, 0xad, 0x5a, 0x93, 0x92, + 0xd0, 0x71, 0xb7, 0x5a, 0xb5, 0x1a, 0x7e, 0x35, 0x06, 0xad, 0x58, 0xd1, 0x71, 0x95, + 0xc9, 0x9f, 0x29, 0x8a, 0xc3, 0x14, 0xec, 0x05, 0xa6, 0x6a, + ], + }, + ] +} diff --git a/src/value.rs b/src/value.rs index dd3a5546d..b514e7a28 100644 --- a/src/value.rs +++ b/src/value.rs @@ -53,13 +53,14 @@ use pasta_curves::{ use rand::RngCore; use subtle::CtOption; -use crate::builder::Error; -use crate::note::AssetId; use crate::{ constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES}, primitives::redpallas::{self, Binding}, }; +use crate::builder::Error; +use crate::note::AssetId; + /// Maximum note value. pub const MAX_NOTE_VALUE: u64 = u64::MAX; diff --git a/tests/builder.rs b/tests/builder.rs index 312541ecf..3e7c416c6 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -6,7 +6,7 @@ use orchard::{ circuit::{ProvingKey, VerifyingKey}, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, note::ExtractedNoteCommitment, - note_encryption::OrchardDomain, + note_encryption_v3::OrchardDomainV3, tree::{MerkleHashOrchard, MerklePath}, value::NoteValue, Anchor, Bundle, Note, @@ -89,7 +89,7 @@ fn bundle_chain() { .actions() .iter() .find_map(|action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_note_decryption(&domain, &ivk, action) }) .unwrap(); diff --git a/tests/zsa.rs b/tests/zsa.rs index 9aad802d5..fa41d48e4 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -7,7 +7,7 @@ use orchard::bundle::Authorized; use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use orchard::note::{AssetId, ExtractedNoteCommitment}; -use orchard::note_encryption::OrchardDomain; +use orchard::note_encryption_v3::OrchardDomainV3; use orchard::tree::{MerkleHashOrchard, MerklePath}; use orchard::{ builder::Builder, @@ -204,7 +204,7 @@ fn create_native_note(keys: &Keychain) -> Note { .actions() .iter() .find_map(|action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_note_decryption(&domain, &PreparedIncomingViewingKey::new(&ivk), action) }) .unwrap(); From 4e4767789e675c1317dfbdd6ec70de1758cef37b Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 9 Feb 2023 12:44:25 +0100 Subject: [PATCH 18/67] Minimal API changes for Issuance in Client (#43) Make IVK::from_bytes public --- src/keys.rs | 5 ++++- src/primitives/redpallas.rs | 2 +- tests/zsa.rs | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index 65d464147..dc1d7d77b 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -277,7 +277,10 @@ impl IssuanceValidatingKey { <[u8; 32]>::from(&self.0) } - pub(crate) fn from_bytes(bytes: &[u8]) -> Option { + /// Constructs an Orchard issuance validating key from uniformly-random bytes. + /// + /// Returns `None` if the bytes do not correspond to a valid key. + pub fn from_bytes(bytes: &[u8]) -> Option { <[u8; 32]>::try_from(bytes) .ok() .and_then(check_structural_validity) diff --git a/src/primitives/redpallas.rs b/src/primitives/redpallas.rs index d19a05048..92fe165e4 100644 --- a/src/primitives/redpallas.rs +++ b/src/primitives/redpallas.rs @@ -22,7 +22,7 @@ pub type Binding = reddsa::orchard::Binding; impl SigType for Binding {} /// A RedPallas signing key. -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug)] pub struct SigningKey(reddsa::SigningKey); impl From> for [u8; 32] { diff --git a/tests/zsa.rs b/tests/zsa.rs index fa41d48e4..9ddaaf7bd 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -74,11 +74,11 @@ fn prepare_keys() -> Keychain { fn sign_issue_bundle( unauthorized: IssueBundle, mut rng: OsRng, - isk: IssuanceAuthorizingKey, + isk: &IssuanceAuthorizingKey, ) -> IssueBundle { let sighash = unauthorized.commitment().into(); let proven = unauthorized.prepare(sighash); - proven.sign(&mut rng, &isk).unwrap() + proven.sign(&mut rng, isk).unwrap() } fn build_and_sign_bundle( @@ -159,7 +159,7 @@ fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { ) .is_ok()); - let issue_bundle = sign_issue_bundle(unauthorized, rng, keys.isk().clone()); + let issue_bundle = sign_issue_bundle(unauthorized, rng, keys.isk()); // Take notes from first action let notes = issue_bundle.get_all_notes(); From cbf0a3a651e00fd560c67da66e56a7d4c7083cea Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 14 Feb 2023 18:04:59 +0100 Subject: [PATCH 19/67] Circuit: Split_flag handling (#42) When split_flag is set, the following values are modified * v_net is equal to -v_new instead of v_old - v_new * cv_net is evaluated with this new value of v_net The following constraints are modified * (v_old - v_new = magnitude * sign) becomes (v_old * (1-split_flag) - v_new = magnitude * sign) to take into account the new value of v_net * nf_old = nf_old_pub is only checked when split_flag=0 * the new constraint asset_old = asset_new is always checked regardless of the value of split_flag --- Cargo.toml | 3 +- src/builder.rs | 17 +- src/circuit.rs | 164 +++++++- src/circuit_description | 647 ++++++++++++++++++++++---------- src/circuit_proof_test_case.bin | Bin 5154 -> 5154 bytes 5 files changed, 609 insertions(+), 222 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b5461be1e..20a2ac0b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,8 @@ proptest = "1.0.0" zcash_note_encryption = { version = "0.2", features = ["pre-zip-212"] } [target.'cfg(unix)'.dev-dependencies] -pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 +# TODO: upgrade the pprof version once its inferno dependency respects all clippy lints +pprof = { version = "0.6", features = ["criterion", "flamegraph"] } # MSRV 1.56 [lib] bench = false diff --git a/src/builder.rs b/src/builder.rs index d420d742e..0a7f441c7 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -399,20 +399,14 @@ impl Builder { .cloned() .unwrap(); - // TODO: uncomment once the circuit is ready. // use the first spend to create split spend(s) or create a dummy if empty. - // let dummy_spend = spends.first().map_or_else( - // || SpendInfo::dummy(asset, &mut rng), - // |s| s.create_split_spend(), - // ); - // spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); - - // Extend the spends and recipients with dummy values. - spends.extend( - iter::repeat_with(|| SpendInfo::dummy(asset, &mut rng)) - .take(num_actions - num_spends), + let dummy_spend = spends.first().map_or_else( + || SpendInfo::dummy(asset, &mut rng), + |s| s.create_split_spend(), ); + spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); + // Extend the recipients with dummy values. recipients.extend( iter::repeat_with(|| RecipientInfo::dummy(&mut rng, asset)) .take(num_actions - num_recipients), @@ -424,6 +418,7 @@ impl Builder { spends.shuffle(&mut rng); recipients.shuffle(&mut rng); + assert_eq!(spends.len(), recipients.len()); pre_actions.extend( spends .into_iter() diff --git a/src/circuit.rs b/src/circuit.rs index 7797f563e..e6c9f6e09 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -36,7 +36,7 @@ use crate::{ note::{ commitment::{NoteCommitTrapdoor, NoteCommitment}, nullifier::Nullifier, - ExtractedNoteCommitment, Note, + AssetId, ExtractedNoteCommitment, Note, }, primitives::redpallas::{SpendAuth, VerificationKey}, spec::NonIdentityPallasPoint, @@ -56,7 +56,7 @@ use halo2_gadgets::{ MerklePath, }, }, - utilities::lookup_range_check::LookupRangeCheckConfig, + utilities::{bool_check, lookup_range_check::LookupRangeCheckConfig}, }; mod commit_ivk; @@ -109,6 +109,7 @@ pub struct Circuit { pub(crate) psi_old: Value, pub(crate) rcm_old: Value, pub(crate) cm_old: Value, + pub(crate) asset_old: Value, pub(crate) alpha: Value, pub(crate) ak: Value, pub(crate) nk: Value, @@ -118,7 +119,9 @@ pub struct Circuit { pub(crate) v_new: Value, pub(crate) psi_new: Value, pub(crate) rcm_new: Value, + pub(crate) asset_new: Value, pub(crate) rcv: Value, + pub(crate) split_flag: Value, } impl Circuit { @@ -172,6 +175,7 @@ impl Circuit { psi_old: Value::known(psi_old), rcm_old: Value::known(rcm_old), cm_old: Value::known(spend.note.commitment()), + asset_old: Value::known(spend.note.asset()), alpha: Value::known(alpha), ak: Value::known(spend.fvk.clone().into()), nk: Value::known(*spend.fvk.nk()), @@ -181,7 +185,9 @@ impl Circuit { v_new: Value::known(output_note.value()), psi_new: Value::known(psi_new), rcm_new: Value::known(rcm_new), + asset_new: Value::known(output_note.asset()), rcv: Value::known(rcv), + split_flag: Value::known(spend.split_flag), } } } @@ -209,10 +215,12 @@ impl plonk::Circuit for Circuit { meta.advice_column(), ]; - // Constrain v_old - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). - // Either v_old = 0, or calculated root = anchor (https://p.z.cash/ZKS:action-merkle-path-validity?partial). + // Constrain split_flag to be boolean + // Constrain v_old * (1 - split_flag) - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). + // Constrain v_old = 0 or calculated root = anchor (https://p.z.cash/ZKS:action-merkle-path-validity?partial). // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). + // Constrain split_flag = 1 or nf_old = nf_old_pub let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -227,17 +235,25 @@ impl plonk::Circuit for Circuit { let enable_spends = meta.query_advice(advices[6], Rotation::cur()); let enable_outputs = meta.query_advice(advices[7], Rotation::cur()); + let split_flag = meta.query_advice(advices[8], Rotation::cur()); + + let nf_old = meta.query_advice(advices[9], Rotation::cur()); + let nf_old_pub = meta.query_advice(advices[0], Rotation::next()); + let one = Expression::Constant(pallas::Base::one()); Constraints::with_selector( q_orchard, [ + ("bool_check split_flag", bool_check(split_flag.clone())), ( - "v_old - v_new = magnitude * sign", - v_old.clone() - v_new.clone() - magnitude * sign, + "v_old * (1 - split_flag) - v_new = magnitude * sign", + v_old.clone() * (one.clone() - split_flag.clone()) + - v_new.clone() + - magnitude * sign, ), ( - "Either v_old = 0, or root = anchor", + "v_old = 0 or root = anchor", v_old.clone() * (root - anchor), ), ( @@ -246,7 +262,11 @@ impl plonk::Circuit for Circuit { ), ( "v_new = 0 or enable_outputs = 1", - v_new * (one - enable_outputs), + v_new * (one.clone() - enable_outputs), + ), + ( + "split_flag = 1 or nf_old = nf_old_pub", + (one - split_flag) * (nf_old - nf_old_pub), ), ], ) @@ -455,6 +475,23 @@ impl plonk::Circuit for Circuit { (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) }; + // Verify that asset_old and asset_new are equals + { + let asset_old = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset_old"), + self.asset_old + .map(|asset_old| asset_old.cv_base().to_affine()), + )?; + let asset_new = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "asset equality"), + self.asset_new + .map(|asset_new| asset_new.cv_base().to_affine()), + )?; + asset_old.constrain_equal(layouter.namespace(|| "asset equality"), &asset_new)?; + } + // Merkle path validity check (https://p.z.cash/ZKS:action-merkle-path-validity?partial). let root = { let path = self @@ -474,7 +511,17 @@ impl plonk::Circuit for Circuit { let v_net_magnitude_sign = { // Witness the magnitude and sign of v_net = v_old - v_new let v_net_magnitude_sign = { - let v_net = self.v_old - self.v_new; + // v_net is equal to + // (-v_new) if split_flag = true + // v_old - v_new if split_flag = false + let v_net = self.split_flag.and_then(|split_flag| { + if split_flag { + Value::known(crate::value::NoteValue::zero()) - self.v_new + } else { + self.v_old - self.v_new + } + }); + let magnitude_sign = v_net.map(|v_net| { let (magnitude, sign) = v_net.magnitude_sign(); @@ -541,9 +588,6 @@ impl plonk::Circuit for Circuit { nk.clone(), )?; - // Constrain nf_old to equal public input - layouter.constrain_instance(nf_old.inner().cell(), config.primary, NF_OLD)?; - nf_old }; @@ -745,6 +789,27 @@ impl plonk::Circuit for Circuit { 0, )?; + region.assign_advice( + || "split_flag", + config.advices[8], + 0, + || { + self.split_flag + .map(|split_flag| pallas::Base::from(split_flag as u64)) + }, + )?; + + nf_old + .inner() + .copy_advice(|| "nf_old", &mut region, config.advices[9], 0)?; + region.assign_advice_from_instance( + || "nf_old pub", + config.primary, + NF_OLD, + config.advices[0], + 1, + )?; + config.q_orchard.enable(&mut region, 0) }, )?; @@ -968,6 +1033,7 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; use crate::note::AssetId; use crate::{ keys::SpendValidatingKey, @@ -1008,6 +1074,7 @@ mod tests { psi_old: Value::known(spent_note.rseed().psi(&spent_note.rho())), rcm_old: Value::known(spent_note.rseed().rcm(&spent_note.rho())), cm_old: Value::known(spent_note.commitment()), + asset_old: Value::known(spent_note.asset()), alpha: Value::known(alpha), ak: Value::known(ak), nk: Value::known(nk), @@ -1017,7 +1084,9 @@ mod tests { v_new: Value::known(output_note.value()), psi_new: Value::known(output_note.rseed().psi(&output_note.rho())), rcm_new: Value::known(output_note.rseed().rcm(&output_note.rho())), + asset_new: Value::known(output_note.asset()), rcv: Value::known(rcv), + split_flag: Value::known(false), }, Instance { anchor, @@ -1087,6 +1156,74 @@ mod tests { assert_eq!(proof.0.len(), expected_proof_size); } + #[test] + fn test_not_equal_asset_ids() { + use halo2_proofs::dev::{ + metadata::Column, metadata::Region, FailureLocation, VerifyFailure, + }; + use halo2_proofs::plonk::Any::Advice; + + let mut rng = OsRng; + + let (mut circuit, instance) = generate_circuit_instance(&mut rng); + + // We would like to test that if the asset of the spent note (called asset_old) and the + // asset of the output note (called asset_new) are not equal, the proof is not verified. + // To do that, we attribute a random value to asset_new. + let random_asset_id = { + let sk = SpendingKey::random(&mut rng); + let isk = IssuanceAuthorizingKey::from(&sk); + let ik = IssuanceValidatingKey::from(&isk); + let asset_descr = "zsa_asset"; + AssetId::derive(&ik, asset_descr) + }; + circuit.asset_new = Value::known(random_asset_id); + + assert_eq!( + MockProver::run( + K, + &circuit, + instance + .to_halo2_instance() + .iter() + .map(|p| p.to_vec()) + .collect() + ) + .unwrap() + .verify(), + Err(vec![ + VerifyFailure::Permutation { + column: Column::from((Advice, 0)), + location: FailureLocation::InRegion { + region: Region::from((9, "witness non-identity point".to_string())), + offset: 0 + } + }, + VerifyFailure::Permutation { + column: Column::from((Advice, 0)), + location: FailureLocation::InRegion { + region: Region::from((10, "witness non-identity point".to_string())), + offset: 0 + } + }, + VerifyFailure::Permutation { + column: Column::from((Advice, 1)), + location: FailureLocation::InRegion { + region: Region::from((9, "witness non-identity point".to_string())), + offset: 0 + } + }, + VerifyFailure::Permutation { + column: Column::from((Advice, 1)), + location: FailureLocation::InRegion { + region: Region::from((10, "witness non-identity point".to_string())), + offset: 0 + } + } + ]) + ); + } + #[test] fn serialized_proof_test_case() { use std::io::{Read, Write}; @@ -1194,6 +1331,7 @@ mod tests { psi_old: Value::unknown(), rcm_old: Value::unknown(), cm_old: Value::unknown(), + asset_old: Value::unknown(), alpha: Value::unknown(), ak: Value::unknown(), nk: Value::unknown(), @@ -1203,7 +1341,9 @@ mod tests { v_new: Value::unknown(), psi_new: Value::unknown(), rcm_new: Value::unknown(), + asset_new: Value::unknown(), rcv: Value::unknown(), + split_flag: Value::unknown(), }; halo2_proofs::dev::CircuitLayout::default() .show_labels(false) diff --git a/src/circuit_description b/src/circuit_description index 8bb3759ed..66bdfeadc 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -12,6 +12,118 @@ PinnedVerificationKey { num_instance_columns: 1, num_selectors: 56, gates: [ + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), Product( Product( Product( @@ -102,13 +214,29 @@ PinnedVerificationKey { ), Sum( Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Negated( Advice { query_index: 1, @@ -479,6 +607,129 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), Product( Product( Product( @@ -687,7 +938,7 @@ PinnedVerificationKey { Product( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -696,7 +947,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000400, ), Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -1121,7 +1372,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -1283,7 +1534,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -1346,7 +1597,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -1757,7 +2008,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -1880,7 +2131,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -1901,7 +2152,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2043,7 +2294,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -2164,7 +2415,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -2185,7 +2436,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2277,7 +2528,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -2377,7 +2628,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2477,7 +2728,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -2577,7 +2828,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2716,7 +2967,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -2845,7 +3096,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2954,14 +3205,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -2970,7 +3221,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -2981,14 +3232,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -2997,7 +3248,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -3007,7 +3258,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -3121,7 +3372,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -3337,7 +3588,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -3363,7 +3614,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -3581,7 +3832,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -3718,7 +3969,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -3886,7 +4137,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -3973,14 +4224,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -3989,7 +4240,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -4000,14 +4251,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -4016,7 +4267,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -4026,7 +4277,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -4142,7 +4393,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -4168,7 +4419,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -4386,7 +4637,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -4523,7 +4774,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -4691,7 +4942,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -4775,7 +5026,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -4876,7 +5127,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -4922,7 +5173,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -5020,7 +5271,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -5799,7 +6050,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -5845,7 +6096,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -6614,7 +6865,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -6626,7 +6877,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -6642,7 +6893,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -6654,7 +6905,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -6743,7 +6994,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -6755,7 +7006,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -6791,7 +7042,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -6803,7 +7054,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 12, column_index: 9, rotation: Rotation( -1, @@ -7406,7 +7657,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7432,7 +7683,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7515,7 +7766,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7550,7 +7801,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7581,7 +7832,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -7652,7 +7903,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7687,7 +7938,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -7753,7 +8004,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7779,7 +8030,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7808,7 +8059,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7837,7 +8088,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7866,7 +8117,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7895,7 +8146,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7924,7 +8175,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -7953,7 +8204,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8016,7 +8267,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8053,7 +8304,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8075,7 +8326,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8113,7 +8364,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8135,7 +8386,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8157,7 +8408,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8196,7 +8447,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8218,7 +8469,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8240,7 +8491,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8262,7 +8513,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8302,7 +8553,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8324,7 +8575,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8346,7 +8597,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8368,7 +8619,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8390,7 +8641,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8431,7 +8682,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8453,7 +8704,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8475,7 +8726,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8497,7 +8748,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8519,7 +8770,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8541,7 +8792,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8583,7 +8834,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8605,7 +8856,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8627,7 +8878,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8649,7 +8900,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8671,7 +8922,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8693,7 +8944,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -8715,7 +8966,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -12867,7 +13118,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -12953,7 +13204,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13069,14 +13320,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, ), }, Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -13085,7 +13336,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13096,14 +13347,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, ), }, Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -13112,7 +13363,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13163,7 +13414,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -13572,7 +13823,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13584,7 +13835,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -13684,7 +13935,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13715,7 +13966,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -13829,7 +14080,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -13956,7 +14207,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -13964,7 +14215,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -14175,7 +14426,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -14261,7 +14512,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -14384,7 +14635,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -14393,7 +14644,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -14420,7 +14671,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -15040,7 +15291,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -15052,7 +15303,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -15168,7 +15419,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -15694,7 +15945,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -15706,7 +15957,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -15937,7 +16188,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -15946,7 +16197,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -15954,7 +16205,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -16209,7 +16460,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -16220,7 +16471,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -16231,7 +16482,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -16764,14 +17015,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 13, + query_index: 14, column_index: 3, rotation: Rotation( 1, @@ -16869,7 +17120,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -17105,7 +17356,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 14, + query_index: 15, column_index: 4, rotation: Rotation( 1, @@ -19148,7 +19399,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -19684,7 +19935,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -20367,7 +20618,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -21036,7 +21287,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -21278,7 +21529,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -21435,7 +21686,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -21574,7 +21825,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -21956,7 +22207,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -24104,7 +24355,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -24640,7 +24891,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -25323,7 +25574,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -25992,7 +26243,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -26234,7 +26485,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -26391,7 +26642,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -26530,7 +26781,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 15, + query_index: 16, column_index: 5, rotation: Rotation( 1, @@ -26912,7 +27163,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -27014,7 +27265,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 0, column_type: Advice, }, Rotation( @@ -27027,21 +27278,21 @@ PinnedVerificationKey { column_type: Advice, }, Rotation( - -1, + 1, ), ), ( Column { - index: 2, + index: 9, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( Column { - index: 3, + index: 2, column_type: Advice, }, Rotation( @@ -27050,7 +27301,7 @@ PinnedVerificationKey { ), ( Column { - index: 4, + index: 3, column_type: Advice, }, Rotation( @@ -27059,7 +27310,7 @@ PinnedVerificationKey { ), ( Column { - index: 5, + index: 4, column_type: Advice, }, Rotation( @@ -27068,7 +27319,7 @@ PinnedVerificationKey { ), ( Column { - index: 0, + index: 5, column_type: Advice, }, Rotation( @@ -27517,7 +27768,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 10, + query_index: 11, column_index: 9, rotation: Rotation( 1, @@ -27620,7 +27871,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 12, + query_index: 13, column_index: 2, rotation: Rotation( 1, @@ -28091,47 +28342,47 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x18cd12d5f4e12bd7247a8fd7cc93ded7a8a9b60935b319b2db578a8fceef9559, 0x16b15af4fcfb9ed75533e7a4c1966cae5621f10dc1dfbba39a491ec37c911b5e), - (0x37e70146801841d95832259e4d8f39aeee8a364ea5007f82aa84a0e387231315, 0x20ef65833381c985722a95e65125a1123cab3357741168a5ed7e92e972dbd30d), - (0x12e3af8e507a2ca30e544568cf319701ecbc29dc5919f0198d541938edecc8f3, 0x3fb1bb2804faaa4c215e93694d5d1e6f87874cb8c34cb9206ff958de14e44275), - (0x334d99f316343f01c8eb67e327c76f743f8de7f957c893c6f30ccd87e5d1af3a, 0x1da64caf127c8eb513653791147a85ed1edcca12935c95b7d615a9377c9406d8), - (0x1430dca15080286939046d3cb9fb7ace4ed1da2fbe7a362e8f3575489bc6e3e1, 0x1ef5f4aff2902f3bc8acb2cc884a2d44334f910a68b2701f1c37943652b46d8f), - (0x02ebdeac7e91b3d15e4b7c0533e42678672ec384d51e51e22342be7edeeb8074, 0x03638952e0489de03ff03236433f5d2617cb4ddd0a72637ed31095deca85a2a6), - (0x31179b7f5b01ad2a55cf9a66f57b696e9b9cb4919cca426d469b270827f3018b, 0x2b231a9a71b674cc546ba9b36916a13411648903cfdcb808926fc47ee745586c), - (0x0673497660cec8a8c391cfb16f5ffdcb710f9e9e194a1a85935cf4bc45b01359, 0x15ce8801c51811f0256a43f762e497fe38c88866c09bb256289d93e0393dc225), - (0x098d2a0cfedae91fe29e21a01b5e43045b9cc8d9a334f1aee3e075f36a16e323, 0x0be47cc41643c9e6d95012428d5b46ae5a44e765392e05152a0181e30689d8b6), + (0x0ba01714529dc85dd2460cdbf014b71e7638d18a35eacf06868020c27c28232d, 0x2dcbb2c3191f582b6882cc9c5e6cac1a0361d0534f8f4c814e33a272b8e8da8d), + (0x0f8fb02c096c0957230639133087e8ae516d04d1678ace6ab0495a8e8576c0db, 0x2842b28258744140b09e0d27559d84e1d8f1d55350b0af37237879d14f8eb2a1), + (0x36f2f0410d5ab00d5296bf101cbd91008551d4afe2b5ac45fc437aa157c731aa, 0x19e8c688f0c92a3db3e74b66075d2e0771d5c744e77090c487ffca245a7f7f96), + (0x09ce7fd65bf8af2b554230465003160d3d0b7bfc495f6d33f5f0704cb57d6320, 0x38d3478df8841a4f7a74a3c1fe7788e6e1cbb1076d5f7358be729fa2572c9530), + (0x2abaec8c54bde721f7f2aea685764c80b0b935447c00173ff34209ac8d96b633, 0x36957cf784345bfbdb97f0fad0b74d3e5d683fcc80ee407d6a6bedfe097c0011), + (0x3f1845e758196892c66d920980dc29cc2e1844fa03575668bf84349071094207, 0x1873355bc49aeed1faee56e6d21907a5277fcd0283a3f51fface877e1c59f046), + (0x04e5834f610cf806911a2e9c14519132a49ac55f40095c3156e3b20d09a2f250, 0x2ea666b99d148e1090b42fd2f67fd34c7e94ca505447c1431485eca09ed1fe0b), + (0x35de09079a5b05d25f756479ea044c654c97043bc4a79b34f860faa9b049337a, 0x06c4cc500093cfdc9bd284f3c44a2a8856cfc8ce70786dd65787397292e4fe53), + (0x235b63a940346f07c5a669831067ba59acb3b9936db7d66c4a4cf6746af5f97e, 0x0d838f859fb1386034263d43ace744961a310f548f7274586f133aa4ddc779a9), (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), - (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), + (0x1e5ddb2d4ee82f8d1982eb0333d98528efeb71f4d413fea2f1eed9e2c4d19dc3, 0x3e092c6d429d9f7d5b5a729af533e7b9e943752835b540060a2e0e31aa25958e), (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x04cad7405b492a30db0a710c842cecc97d02059acf4c02aa79626dce68ac4837, 0x3d6d7b6698b258e61ebe0b25d9cbcd4a016cb0a2ae8d92752532d98cfb27720d), - (0x1b6f5383c5a0ae5bf457e1c8e17a933e892464d33fef9e9262411e01c117d87e, 0x0c552b960e8ce365b5f2302bcc0b7ce5cdf964e6036602cfc859c8769184f619), - (0x3fa4b5cc33e30de3ac7342c84f47f4fffe7ae77dda1689c2f08050d0ab743cb1, 0x327663e39b128ec28c94486b1e5d4429000626f65230ed572c66f80406a42176), - (0x2184a7d65b5000cc5c5f178c2f4ab5b11a67fdc626771c29ade508020c8da032, 0x34c98ee1f6dfa6c1e8cd915d1efeb484206e13e5e32e13118925913568e620b7), + (0x088ced578c98f9634cd7aba72b2ff3c6a43109aca67cd1cdc0717a70da32aebf, 0x1a17c29333cc59a199472807282d2b8364baf57ac00e8c29f51dcde32f0b6549), + (0x0525a1d721b05a02ee6e9580254e13213ada10c168213fbfebc7c1c71de072d2, 0x2edc5a41f195c2cc25cefce1405af856721c23dadb1728b2ff3335f08118c4c6), + (0x02e4214937491f7c86b1e37516f7ad0d030beeeab0149ef9062a7ec77604890e, 0x3d1763bcb3f7b989fccb1376b291dfbaef0e139ce4e3f43854fe507bbaad59d5), + (0x3f9542a72fadf26c1931411e1d690e89fef20b05a20f9706f1231e23adb00082, 0x0676af65a2925d168339df2b8dcee0139cbbfaec9470ed902ad600362602737d), (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), - (0x0a6fe1cc1ce659681079768ca8ff94d82c7d51ef39cd99b738b144de3a3027f6, 0x30cfc2f4e0ec95f623199970d8b762647ad2d7c3591a20781ee8187702babe5f), - (0x00d87a2c430f1db50a63f18f8cf8807f4f70d3acb940d4130ba6811f8ba2d479, 0x13d5742320e1b2cecda6073b7f2bf5816b9067453deeaa829f356a65ef5621b2), - (0x3118979ade023f3977d034f86eed6506d7e0586ead81f80bc5ca01a7660ee0c9, 0x30f6731193d5c786cf61b05523c05e2664a066c2d39a685588f02883057320ad), - (0x0df51bd411d5f95da66fcc57f5e4d8dbcca3d82b08ceb61e9ff1befa074e08d3, 0x11c9092b6d02c46f173b0108854499ca4922afaf58e0734e77a6088715e84b64), - (0x24289014ede2672df8e8e32eb4e0d71709846041319fb85b1328cdb3b8764565, 0x0833de9c0b76ae816df0e41ae33daece27c63a41f2ba9abbbc7c08724211b50c), + (0x18909046614ff6e61f755dbbb92989aac36dfa3d92fb8b54a37600ccb8cfba82, 0x053ec2a2bdc4e2771bfd6bc883c02db47d38d199bdab01adea7b1a272f223b7c), + (0x23a3dcd68c8a837c9eb84436ab2a184973d6fd3a1ba05d92d6fd747d23c799b0, 0x3f3802f0cfeaaae7f5f766bd3231299654bfd0a5d27b7f1d2ea93bee3d95b4b8), + (0x2331a44c6cf195b1afed0198fbe5a39da809e9815252a0aaa71a45803c81fb3b, 0x3223527d36e068b4821c95d09de240340564a5884bd6363ffd0c2f1961871651), + (0x2aa6286d3aba61beb097804a736279e5d0df5be592d21bdf04b1c418a2a20c69, 0x2d48db2dceacb16afe698d7a8314a2870939101a5cac866a70a946f3c46c3e73), + (0x1a81a317cb5b7169c17c6568fb7641cbe98969f8bee26164544c8cf3b8b4ac3b, 0x003012d4d94fc0502d0c8fd0322de8d1317a30fd8282a07f3eed945c678faf3e), ], permutation: VerifyingKey { commitments: [ - (0x2ad778f0e75a3dcad7c0cc2215e554f3d6fe41eabd612c487ea2708d59fb2e7e, 0x0561e9268230b53ec9cac0fd7654b3edaa3851f624c62bdae39519ae17526c06), - (0x358a21858e7f0da213959badd192b12e7bd40f6b18f5617a7fbad1f142b53c41, 0x1cc665c7a95332ea3ecb79bc35c4d672837809470691ad6a96f2eca081ca9c98), - (0x28d6468db328f1d201b3b7ca36f3affddee9dd0043d8868e34f1839742ac3190, 0x2f38eba3a82748cc28e46c1e20b7d343fdac7ef726ed6de89f6484c6070204f1), - (0x21f27b52cd9a76e1dbbf572fbfc0262007015777b68bda954f3c9db60ebb27f9, 0x0dbbf8f04e8476544a853e54093689d59935de9194eef24a0ee04d6faef9423f), - (0x0253a69e81add6bc1c2fe14bd90dab3e3c2603747dd3760c9dd1e341d96a79ed, 0x15cbe812a45a46512cc8ed493250f75a9dcaaee4be0d3bdaee8b43d74c50481f), - (0x19eb8760e7d0e6ae6d28d65627d958661cdde4e58a0aeb55a6b7017bcf723002, 0x064575794bf9bfdbc50e94b8afbbd2851ae4e12ff2809777d28fe71c235727d9), - (0x0e5c408b5224841cb4f75aec5cdb7bc95c150bbe858dbde8dbac9f72e5392462, 0x01030c69ac5fc7dd63e4e0bb1718d26f51b79dccc81e0b172e98c26e59145414), - (0x12437cb05ecff24131b52b5a55f6f143d8437c28c9d7c31eb06cfa093972a64b, 0x06e1a5e39566b4ce097a6c7dace6dcb827e54dac7d64fa79d994fb1557717614), - (0x34636ff9de412da15f41a8a006abbe8f43a5cffc94e6c3deb02f98af4fb2b8c7, 0x0270f0c3fa8cc7338f20fbcd5ec4e62799e051e0c5938d9e8c41581de8da6165), - (0x218e047b1c0a3b92c59539b3f6d9c23d34ebeeb65ca0be98f5e0e9642bdf1085, 0x20c1117f40b375688a94ff5c5c0b70004e43c7c7cd492fe8055fea081ea5ca78), - (0x2478c8226d4ede1c203fa7455b5fe28f99d5a0cb8ccdb5be4b54d5edcce974c4, 0x1ce69b76f05daeae57cd3d452370439237da89f2ddc84f7b2e35703acbf99655), - (0x08383138ecc6f2fb5459043c7666ae3df7802f1f02392af44db6ba25cd7d2c56, 0x20957d7a3f00a8589f627c5f5e471f45a84fbcbdcde00dfc97b9a97f3f723202), + (0x39c3094020a1b893afa09240d88a468f5803f8c67efd9bb4b1c0bfb94dab6271, 0x0416775ce28cc7214bd6573f9c5e3f2972abb9f4468c1acf8dd5005dcfc3841f), + (0x1eee618d6829a4cbe8bcaad592b532e181af07bdc5074bcfed31b08ade1e27a8, 0x1bcec4c593b72804ac2e9eaa9706b38aae13ad1898cfc11c547741c73e63c3c6), + (0x37be1e93e1e474611af94327cb85b27f652a1b1bbfd952bf3ee45be138918fe0, 0x250bffe2eacca2244b2ae88dccc8c0678f8d3b0ba4d1e4f663dcd95eff0be5cf), + (0x2d95cfb99fce4d1ce1ab680674b4344cb0689c82bb667953a88d25f73a07a3a6, 0x30b015209e497612526ce2b940f38b73608a791bf1b9081ec6592aa4a3b3d6e2), + (0x20384319aa772450c3f144ad974a5ba707e863419e0d035d8c60debaaeff9283, 0x3909e58668259a03f10d849f032963686cf15e49ff5c993bbbf4b913c1e57d6b), + (0x1240cf41a87879f67dab54f4580882aea1d1b5154b821c0c40b15b9635d0487e, 0x1792251c1ac4a5e689b6d75696d7cfd3d157561e5dd5c48508add90da16d7a51), + (0x0546256e9b7ed28e1bd03fba20aab2f954f477856c7cd26e81c11e31065a0820, 0x1ff390755b1b4a2568762672a7a62e147f12a1cbe8a898dd4b078f5b7bf47253), + (0x322ad473ba02ff5d65ef29f0593b823a974cee815177a9f946bd1dd09f5d8fd3, 0x3dc0527f997c8c0948b32dbaf41e1d8c5cd057152fe54a6c8ea9f7d20285c111), + (0x2ab170c47a1311a82abf11d9f34b6fb47f4955740987f6a2afee3c9a7544dfb3, 0x0513f4a2c077a7c6ed881afe96c90e8e13d31c22b5f53a4203f75c7011bc72f5), + (0x085e66ccf3a3667cdbb2d5abaa37d339b594c079e3a06bf2cda8345a2fffcd88, 0x36da573fe8112eec770349dbcae747acb8a513b0504606285970d653bf25c2e2), + (0x2aa7abe46cd3f3786469fd351047535d2596525d93573a6af9044a223e1fc170, 0x246a8655cc204e81045bdc047627c364f7e501ac24a89372a1dbcb8a515d6016), + (0x1ad163c8b2e5840d94fe2925b62824788b50bd130c6deb3dc01f2f77d246c6eb, 0x2f3657736db088a93fba26e49be620728061d989717ba60899d22e22dfd7ec6f), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9dcabe5b67196ea961707b01496939b1c75770c7..fe636afae568d1de011e6fded98e266980089870 100644 GIT binary patch literal 5154 zcmV+-6y58EGQe?gL^13(rn2x!pT@hU_r>);&_0I_-z~wcCbKpwvHU(-ze>Yd^K{N% zvB?66TzmBN(KPqOMZ3c~NL~cL504Ip!49uIBMOY8;mzDGWYya`F!r z0J+aArFyvl;xz5vfaghxZQDXH}Ma1bAwgB8;_4dFlxb=S!D2Wo#CA&!HV z!&?OSeSvy-iOm%O0U-{~FadjYxF&FSV@HB+fUnfj&_5Jx zu#T%zxqn*>(e_*?XAYs>652){deNngtzXiL*7R4e8}@WYxsI@aDch{0zjQDDV43aZ z1%NuIh~h1LZasE*ysOKvAtZvRoRMbjX^pfZlx^^Ts^^i3u%Jk)ktEtUb*<0x*CjR? zsfxD}wt~#X82?d18grnhCF=&P_fuRIAH<49b$`9hY82OfN@omV?rLR-D;#;HB}fD| zLEbIIMi%f%22ZC5sR_HKxMJI9vVFpnCsCMW8N;WbAHO&G%=80LH8eHS-A+D@y($Vg zAkQx_qvq$Hpi*vLaRZKk)yy+rPoWYv=Hbw1Jl0VTa#}5(X>cvMv|1a_H?3<5c3Kp? z?x&g1iPZ!?z?4zWskhu3_vzOUjUI*3W0r@&_+rMXhql-4MeD-0WG1t%HLjr0`?p*y z3&K3#ElW>qUH2d&r?RsXyYx}yws-*6pb-6eP?gojqO;1;i2Dh8uR$G_JY^_8%Z@6P zF;KF%DVh8UEIWzit>j4)7R6_Gll#obU0kOOl4wpZ%e*7E!ZDBVd7qFFeYi_kS@J%a zZ>)2^wF)GpLG{fDI)nWY8fUe;d_RQbD2+}b8%kn0Mi{!%%=PCi;9084RmzLu4+<{p zC*n0|V*@4D6;;7~eYFIC1=~h;RsV~R6%q5E#txS-bwQ{1OQJC7pNxhQ-e5=f*MxOB z`XQynBSZ$T>rqw}#;QJG5$fV|thk9a`_T*x&@Dvz(vtZh-Fq(m^U|H0{Ck}3Wti#Q=n5+Z0kH5r*|#9%RNbt{m#L{qN`Q^S$V@Sk(X_|u=R?+Xi+7^xvo7DR zv2(`bVSz4-5T;}llpwtFj*H@Z;|ovskY10H*A)&Op{T?z5saJwB7l*wHCATYKR%-) z)@JXQvyh?V6MnHjZMJ)EeHJHv>Ee79d{x`FWOnP-x}s2FqbYoyI)Q|rz27XIscyc| z*zt8WVV4AEH9CV-H( z^&+HejSYHSFyGIbbYBuB&}qAAnAYJ(k}Tp+LP=?SH$VWZkF$7AIi*g{=!G}j194nP z%y+v>0bt24VFF})3d>^&iX_?@7iQo)>mY<(bn5eBGf#l(Wcv)GIF#-$mxtDFBi$eG!4coV$tv4PlhHo0}<&|Em8QO=|bGO)G{nWA`Sq6ngB8f|C%bR!p z4FJrrAl2MOj23)UP1_J?C}7T>Bx{^$0Dv+8FUU@a#2#?#VjDfQ^kFYgFmf;*OX-X! zSFN9@ExolUbaPUS)!s~mOJsuqX7x7&Y3=z4!pA|2>GPH70Luz=R)R@(Qin*oz8nAOT1*C@-c=J62sSC;Iuw!P z&h)f`9=lA`{R+3GbW@+Yg$@%=_UWgBPi}l z3kiwZm0d2TD2LmFjuXs6M<6bU*zJ>4O{6BRuV(vz#1{u6i zVddN2GL4eFpqJWWuzp*coVbWxre@wB zHMCT!2!;~Ef>7Mo=vnJcD^yog+xy@1z2CP)Z>h0JtFKX`JOVkU>sG1J4m5!14caE* z0brsSLfTxD4?Sbw5QQhxCv=Ub171QQ~W~1%enumc`!L6^>IAqADF`f;NIt+vs z#AVICwn{b-Kob(6Yyp&(cR4kwDyK}?Q2dAja15t(a^6hNCD+Tyg}moM zPS|-YA5H(JvUqce6kcOA_M6v{y+xQ@=F3$TOkT~~{zNKi5JkYR&{q(k3hj!YbxKyk zIl{T`8$~!RhXYAS``%xyqkX_?X^4#S3UPaXcpFj`S0}=>Qs&wV@~3ZNw0ivMKl^0c zYh|@mE7Rr%$=}Dx$@NFK7n*O>)W5GIRSIfR0+*Pq*WOb&9Dm`PcOYTVhuM~}GV$7>)ciG6-6VV<=>vJGR-b1=!mmO$K2|Nl+4U zB~_sxw$lBDJZ3ZXnkAbyVdBYrgkVv{g13Ovu~m@tVDqMjns68N;yW0-}X$gIIt zzj7;?mRgel82UXJhznCrXo#*y%pFJ#>x>~j15_>ZI@ zJyQ3h{LO<0Z^Q$BvR(#ON;oL(vV1`&Yj5GD!;)YL7KZ$h6Cd3$fk4rBK$k@_?o6Mc z?sS~*zGlht!zPEDJWuzYY}_@qh7NTopsoz@(GsZ!H*V|z!SF>L=S@hgEHl%XWnEmi z4H6SGuN7#4#--*Hu=0^!^u^gBkD!(sG4VpB-rZAnX=H!SoBFl?2kB$li$EBBOJ z^Uug5*}m8OZSD{fapn$ZGiz9zNOZRj%A0PukiKw{CM!}AKg7~A)$FGB_k+}<9vh0+ zaY|z9Nm;6PAL1yjZl@kGpn$?ydj2JVsf$E$6RHS+qb3IBh;tnfrvc#9TygBf7pE8% zID__AOaWXA;@`EF4gBa)ji5!xDil;vU~&t`J! z>m&a3+b(j{TV+9@6Nphi=E2ZoKlVyjpyRo2V&J(xw|b`~Pyf6LIYTS=NLUU-gS1^D zEe>812fYj(ZS{JE?>RKe`hv6f66DDz9m)&L+hF&cF$7kU!@*ZZ?&QrzS2Qw1Uviko z`gqK|RZBOG?hl*r4B~x4)O%3CQ6lYuD1sGy@oWxo%`U=|DuSAggUiKwD0Wb2XcjS3 zpyec{1~iP)Er;+$!U$X(^QF}zD5}5e0%74c1an*o0!NK4K%I>o(Uf2gyfH--$rJAC zY_d{o1KHG_or=a6?#msaP$7=plK~H=U&s!D=SIhO$Kv`NHkuG^-f3v5L85nZwK-Ws z6td2X6?rB+Tt3OaTMmLOGi+4p*W1qx!m;IzZ`0+0{@z#OXfsCm~RC zGO;`L6ZiTIp6YbGgdb$F@Xyzy~ExO>-cv&9GTN zycFb=IKW%-PZ64ExB-~ z$R1gqU(pB|Hz=S#71=nFiHDDaQAaBZ4CNmiu>+n_Z>@?lSm

5z4f$eYFG}{=|M7 zj-)dQb8+2}Tkk)PwcmP3`)=vk1YQJbjZgkM%$|>q`za+&^-#mebwakBfkQ@jHEIbm zH~5W>azj2XZ^8sb=Gf-y{soU4rPxEUAgp$njsWQv7l~zh+u)`Ft`P|_c(RIUtAd6Q z+IK7G8%#_J#Sz|HD&TL}YX649Cot)@nw(zvCR%+_FDZ@F=Oqf~f_=n=3ktx;hmf4{ zTz^scMM563CFYyMTNj5UKVD2M>SNnfNl8;Iuz*X|?R3J^1znLL-N7V0DUImd&8>7;) zu?s{nwQ@$JPsTJdBumCaI6N#lrGD>uqML9_ zF&5dbS(8(`1J><;h)xHA%4$=xG2UEdDw^%L@JI1fn2q zk?2SfbaZraH-U8D2MBB+?qG0DSXSMJQEFtJxv<2L8OJ!W-UT?I=bL&(8({QUfs0)f zVZaI8kO33iY-kO}0(((xnth+;3T60p7ym%1Jbe?e)$vg7NYGzirqNjN<$o6?{{!(z z=~ZWw30A1ynpj6Z2vQZefNP`$1?Mvs>@9x_{2pPf){xW-rme_qtv*>U_u=NThCa32 zn*U&1QRgCxt|u?L4Ji-a?s+Puz((n}RyW@XX!Di8-0 zOA0P6Ss%TUo;_=voo~$)Z)(4Q5BA)>`Kg;iA|}id%GhFE9n4#(uQ?sT|C!nWH?{bE zsE~B78JdD*j5)GS!(9w*c%pNNClG(0>=Em<^xAnrAg1IBnk+RYvw-7qrgj@Fo@c*X zJ#il`N~=6DVdOiWS~o0O;Y&(DdK(?D__sTUzmA_pNy z58u$qw7tUK+yurk38Ws-TLWo1fxn8j>`MaNM;VAgF0ST8C?PW)e{Zo4kNYhV%3F#> zHgX&+nWtrHK=0J#>DAr5C_=f-SFD03Iye0ynbp%oR6}jQN8Yeg`RXwa3z;l-Csds< zLw)i&gj?tzT*%d9yRZ|eY%u0bL|jXZq<5kDBao=c<5YB129eo6w|3J2q&96@o04bf z?vqrI{X>AUQ?Y9%LHnNYnB{xR;AgS1#Thu&{$89!LnW{seU3w{(1qRa!7m*UD&cH_ z`F>uY-Ha!EvI8ZI^x#q}aeI&UVK_IFL}Rcg5$~Ghem%E$rQ+LKLps2lSKd`k!l6eE z2KAzdKDV=A5e(e}JN!892oX#5^@8OBMFJ88aM0jnHD3VGub=nM7LJlvoL((n56p#gc#!X7*yP(r>Q>-B#QX?qSG1_oYo!!kvt2Xg z*OK>ru0b8w>&{3~L4DHeE#pte@@t?jRf8^P0j@lzQZhK((s}7NqV~bXMI^nX@(&bn z3;j#{sqqu(LmnFe0k#p}X5t8+xW(T9NLE9^{%kgKA_&W5?elYN7|8=^Io0_$pq8LM zpnM)uAVG~leZ-5=`18!dqdoZ=S#oMdzR0au4#m8Kf#uRTEC^iz!L|KVcup8jy?W05}n z1K7g|VH_s6+A*@{v9j7uA*dB0Mt`oeQswS_0!h}WR-9*aK60*@X6g(e$*%3Rfiypf zR7kf!SIKwC9e+sXDOj<%l$lUG^JcsPUy=b5Bqk`1&=MctKgzx0*EmzSWr$xeAd%w$ z4gWkU==g+XGnHD&=2Yo{1b5(Ak0UpMXQ}Izc#{9?BsT!StG4As(Hu97 ze2;1K2(m8Au9oHzn@!ACN_gZATFbg=>P`GF#l~)RgI~Z;((ca3=WHU?`G^FLpW7qV0~Dl?Zg(tsd|N_^+ZKAo6Gz!y- z45DdPl^I&ddX~1AdX}Z(_awr_6S#}#)ox(4mN58l8R4`eBN>`QrLAA!Y0-Y&5o2$7 zTrIB&{Ah4!x$H%jD%cuQ?0mCLhn{A(7?KzuiNTRZYw#r6x6>`A_Sd|$b zfz^DG%Nb5UwQiYWxMK6>AQoPS5$l%!+%~J@5FT7zV}W~NrL#ZL*O^ss0@&h8|3-W$ zI|g?&kKG?VN(CVWs$7weyhoNB6-5_bIQD*PbPZDJck1cu{4wNFTxsHD2Y9(Ozn( zH+Bs)Ftk5rv4ImeB*og_texs6j3Uz%ao+*5uBCF54q(el|J1^zLx#S>E_zrX@gNI* z5aUva5{cR??i}O$kzyntV}L4Rl;4~b7)W`NR&C!;IuO&m<3WopOjmoCKHi4u_XC&? z7;TB4EvZM>_x!4>J^>^57)BwdhMaj9zWokCzyD%Lg;sd;62+}&@a2AnClw(HEVTsDcR+UK zKV7R+3nTc@Fgb|5gV-_>fMl$7?{dPRVj9uDRgL8^r#MtHS7}<(3d*C!C*iYwXoxd8 z4+(=EixkU;_)nyfaTD-frK8;}FdFskU+8X*CTa>#&DI-5TzKu;f6}ik7IBM@Y*$e zEMq9L8#zMJ(6p@3400iiu;Xy|eau@5jthK33GJ|76XjnH46OBSk9qkWN`U52%Jo3A z^6eq3O2H8;Np+HPYt_?b8WVJ@bwN*leP2WD@vEnaHTWT~bhK09T|}+kR*hBEE+#6L zLWXwQT;c?h7_FSwUL0J)F1IkvFxu!HQdot24_b4scild1u93)7_{lRVwoSc^(uoq! z4vK?eg;&Hk3=@KjDnM=HUnY@6dhLbwUjtAKY1tQ_7#VP8>#eM712K;38rqZjA0anz zaU`$q?D^47CF6iBp@c2SBK205gL@xE`1vNs@;0|Wu9g7Ph z(t}m44gFw-l>OLa17r>N?bAW2xD#^+$`DFEDA`#dFt9tPOPVoFa zFxdC&TyV?J1|Tybe3M29@l_5r8~-&(@*xLhO7409CuDFBKNICev-Par|E z(B6tYqYEI4pW%y47uo2^zM(K=W8lG(H!E-K*LsEFFWL+s*qwa}p83Y$D#?ZVC-!-v zH?ZpnhEUYK0TSUWC3#UD{DsZ#J_I$*5~{0zh7ju@fpkc8X26Bp~iGC$T%6pen%4CBNKL8Q=%8%RU|Pd7!OgMs-8$Ahx!)zF3_r6(Aoo$49%Fu zStylrNktxKmCFz+0%TE;}hkR}hEu^;=2B5=*g?l8Dw4-q0i9 z>)N>GF{MGw3dXe>7o#YX-RSc&8&)}N_b6*RFBUXR(80Z_eY%9fUL1LeoK7_N-$r+t zGra#>I@xmCJ?oRCUQkhS%$?A+&mU%Ws9Xq};>fSH9T;`xaw_p%CRkHrX8reP<~}g& zAEr3^E*Xw1mqf}&ElEiEEWX?Z^TWz9vyIe>pgU#n3mYfq84~idFeoX1B3MrQ@cvWE z6nCZJqs(e1PXhV(Lte4L6WwQ1ycq^97n0Faxpu||?N2lA*RmtsTvBTk9&xN{rFrDI zHK+I$29n`>BYix3X}S~$23ihVfD7@?H*Dlp35 z{p^^?mNVla>wL?ypom)8Y;k#t@VDvDsb2Pt1Fto5Oa#)t*iDOV(U2ywc5~1*f`%Tw zzldG5m_q{`87<*w&}g_m@ig=ryuSjGzoCjBYEkLzC>7N&&!#;J7>N;M>6!nRW+*KV ziF^}W*EwmCkm5(+9a-ZOrEWb`2DvD-rp0md{>$bWZ4WE$L|Q4CZemM12?v=ULAQ7@ zIb&94IeWVzM99NEP%LTZ+?o&NBZCyu6ukf-)jVLe8&`^_V{s%p%m=VvR&)ZjuAKTQ zc*G~@Z00FEmdja}q?H7Nezg)UKnc#j_u7U_%0(kX)% zFqPE~{`jD5xWycCJ~nYy^Yj!^!L+2G6}7gU+loItT)KU5f2)wGDRD!SwPSE?q5L*z zlT*pEGQPgr=!Is*cR=jA20_BibazE18aaT1QQu5c8q0S_b*#%9B(9#`5}j4ARppL`|NH?|D$GE76iS;e zAu63#(!Tw+00eXHUygN{BpT@oR9h+Jw4Yw3uc)hdeKdujDXiR)BzbN|xLa01%}znL#Q**SICyqXEV6oL9xg zp~{qCJf|iU5rzH7F1+Q=Z0Q{TGDM>JLU+v2>hnZV(^I|;=_1%*(Y`Pl45ftPq)^oj zuS#c*oQ)DtD4kp)&s1)1eql)*?|d1;~M=7uMm@7J>vtn_(^vxflx; z0^>F=tK1g_pC2}X2C;J})NFmM*zDGaR!@s$T^+5^B;{2Pye4h!G!=R-q_$kL-SaV^ zdH{|DV<2!E!s1CpJb1x&w3KVZ<7HNB*|fe&6;6&5o&NgE?%ToEmT87OrP4?JAE)9p z49CZgG@lD6x-eAZ4>((q&(W;$Q>=P)`mrEh3XOXMafH< z<)3mWeC!J~6ShdS_XJc!z@o_}72{y$xd0FFzmofucn1kS_6Rr}gBZ5)*e>8J;cPf6 z+R!CHSgs2FNrVckLiByAC^#-Av>}4sz>Np-r_FRgo<(<=m0Qm?B7GD^+oiCp<^ggl zgY>zya8xF1jyCB6RbHBcjjCd!|PorDPsxp30d^LHF zk|7-QuehXv2htE4`8X7lJ)czc_rVVYGB%QPZN$GvB>ApHFyil^M>)x2wHr!{?01R< z-X>571MN7Mb0@njx0yqsj{&E;B_!ZMAc&m4v7lhDgvz5p106Tnj*3zN@Lu3@pP@!D zW7f5`k{Y&@y+Q+fE*9-{dr9V`r^|$Ffk3AQy!`?@u=GJ#0fV)fuynX^&gBs>rCWe_ zSOfTCmNh6Qr9Y%^ad6T)b>1+P5c*&ZuA@KZ)gDnEFUDAcZBc6#ACuLXK9aM0+BwIH zSgohTND6=oG9u(|Cwwhbw5bcdzq90cs)}B%WlWkSbY&-W%v$2q?TVge2$if_GIhy1 zwR0DiK1g1?6#unJnDo^{+ Date: Thu, 2 Mar 2023 14:26:19 +0200 Subject: [PATCH 20/67] AssetBase spec update (#44) - Renamed AssetId to AssetBase - Changed the AssetBase implementation to support the zip update. - Updated visibility for various members of issuance.rs --- benches/circuit.rs | 4 +- benches/note_decryption.rs | 6 +- src/action.rs | 2 +- src/builder.rs | 28 +++---- src/bundle.rs | 16 ++-- src/circuit.rs | 16 ++-- src/constants/fixed_bases.rs | 6 +- src/issuance.rs | 101 ++++++++++++++---------- src/keys.rs | 6 +- src/note.rs | 22 +++--- src/note/{asset_id.rs => asset_base.rs} | 81 ++++++++++++------- src/note/commitment.rs | 4 +- src/note_encryption.rs | 8 +- src/note_encryption_v2v3.rs | 14 ++-- src/note_encryption_v3.rs | 10 +-- src/value.rs | 16 ++-- tests/builder.rs | 6 +- tests/zsa.rs | 14 ++-- 18 files changed, 202 insertions(+), 158 deletions(-) rename src/note/{asset_id.rs => asset_base.rs} (60%) diff --git a/benches/circuit.rs b/benches/circuit.rs index e9bab616c..03868a418 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -6,7 +6,7 @@ use criterion::{BenchmarkId, Criterion}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; -use orchard::note::AssetId; +use orchard::note::AssetBase; use orchard::{ builder::Builder, bundle::Flags, @@ -37,7 +37,7 @@ fn criterion_benchmark(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - AssetId::native(), + AssetBase::native(), None, ) .unwrap(); diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 244de4378..6bd6fa10f 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -4,7 +4,7 @@ use orchard::{ bundle::Flags, circuit::ProvingKey, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey}, - note::AssetId, + note::AssetBase, note_encryption_v3::{CompactAction, OrchardDomainV3}, value::NoteValue, Anchor, Bundle, @@ -57,7 +57,7 @@ fn bench_note_decryption(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - AssetId::native(), + AssetBase::native(), None, ) .unwrap(); @@ -66,7 +66,7 @@ fn bench_note_decryption(c: &mut Criterion) { None, recipient, NoteValue::from_raw(10), - AssetId::native(), + AssetBase::native(), None, ) .unwrap(); diff --git a/src/action.rs b/src/action.rs index ed3fe1661..c9e989c27 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,7 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; - use crate::note::asset_id::testing::arb_asset_id; + use crate::note::asset_base::testing::arb_asset_id; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, diff --git a/src/builder.rs b/src/builder.rs index 0a7f441c7..09091c2ea 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -9,7 +9,7 @@ use nonempty::NonEmpty; use pasta_curves::pallas; use rand::{prelude::SliceRandom, CryptoRng, RngCore}; -use crate::note::AssetId; +use crate::note::AssetBase; use crate::{ action::Action, address::Address, @@ -99,7 +99,7 @@ impl SpendInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(asset: AssetId, rng: &mut impl RngCore) -> Self { + fn dummy(asset: AssetBase, rng: &mut impl RngCore) -> Self { let (sk, fvk, note) = Note::dummy(rng, None, asset); let merkle_path = MerklePath::dummy(rng); @@ -127,7 +127,7 @@ struct RecipientInfo { ovk: Option, recipient: Address, value: NoteValue, - asset: AssetId, + asset: AssetBase, memo: Option<[u8; 512]>, } @@ -135,7 +135,7 @@ impl RecipientInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(rng: &mut impl RngCore, asset: AssetId) -> Self { + fn dummy(rng: &mut impl RngCore, asset: AssetBase) -> Self { let fvk: FullViewingKey = (&SpendingKey::random(rng)).into(); let recipient = fvk.address_at(0u32, Scope::External); @@ -253,7 +253,7 @@ impl ActionInfo { pub struct Builder { spends: Vec, recipients: Vec, - burn: HashMap, + burn: HashMap, flags: Flags, anchor: Anchor, } @@ -323,7 +323,7 @@ impl Builder { ovk: Option, recipient: Address, value: NoteValue, - asset: AssetId, + asset: AssetBase, memo: Option<[u8; 512]>, ) -> Result<(), &'static str> { if !self.flags.outputs_enabled() { @@ -342,7 +342,7 @@ impl Builder { } /// Add an instruction to burn a given amount of a specific asset. - pub fn add_burn(&mut self, asset: AssetId, value: NoteValue) -> Result<(), &'static str> { + pub fn add_burn(&mut self, asset: AssetBase, value: NoteValue) -> Result<(), &'static str> { if asset.is_native().into() { return Err("Burning is only possible for non-native assets"); } @@ -481,7 +481,7 @@ fn partition_by_asset( spends: &[SpendInfo], recipients: &[RecipientInfo], rng: &mut impl RngCore, -) -> HashMap, Vec)> { +) -> HashMap, Vec)> { let mut hm = HashMap::new(); for s in spends { @@ -499,7 +499,7 @@ fn partition_by_asset( } if hm.is_empty() { - let dummy_spend = SpendInfo::dummy(AssetId::native(), rng); + let dummy_spend = SpendInfo::dummy(AssetBase::native(), rng); hm.insert(dummy_spend.note.asset(), (vec![dummy_spend], vec![])); } @@ -770,7 +770,7 @@ pub mod testing { use proptest::collection::vec; use proptest::prelude::*; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::{ address::testing::arb_address, bundle::{Authorized, Bundle, Flags}, @@ -798,7 +798,7 @@ pub mod testing { sk: SpendingKey, anchor: Anchor, notes: Vec<(Note, MerklePath)>, - recipient_amounts: Vec<(Address, NoteValue, AssetId)>, + recipient_amounts: Vec<(Address, NoteValue, AssetBase)>, } impl ArbitraryBundleInputs { @@ -852,7 +852,7 @@ pub mod testing { arb_address().prop_flat_map(move |a| { arb_positive_note_value(MAX_NOTE_VALUE / n_recipients as u64) .prop_map(move |v| { - (a,v, AssetId::native()) + (a,v, AssetBase::native()) }) }), n_recipients as usize, @@ -904,7 +904,7 @@ mod tests { use rand::rngs::OsRng; use super::Builder; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::{ bundle::{Authorized, Bundle, Flags}, circuit::ProvingKey, @@ -933,7 +933,7 @@ mod tests { None, recipient, NoteValue::from_raw(5000), - AssetId::native(), + AssetBase::native(), None, ) .unwrap(); diff --git a/src/bundle.rs b/src/bundle.rs index 1d1363daf..d7a75875b 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -12,7 +12,7 @@ use memuse::DynamicUsage; use nonempty::NonEmpty; use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; -use crate::note::AssetId; +use crate::note::AssetBase; use crate::{ action::Action, address::Address, @@ -142,7 +142,7 @@ pub struct Bundle { value_balance: V, /// Assets intended for burning /// TODO We need to add a consensus check to make sure that it is impossible to burn ZEC. - burn: Vec<(AssetId, V)>, + burn: Vec<(AssetBase, V)>, /// The root of the Orchard commitment tree that this bundle commits to. anchor: Anchor, /// The authorization for this bundle. @@ -175,7 +175,7 @@ impl Bundle { actions: NonEmpty>, flags: Flags, value_balance: V, - burn: Vec<(AssetId, V)>, + burn: Vec<(AssetBase, V)>, anchor: Anchor, authorization: T, ) -> Self { @@ -232,7 +232,7 @@ impl Bundle { .burn .into_iter() .map(|(asset, value)| Ok((asset, f(value)?))) - .collect::, E>>()?, + .collect::, E>>()?, anchor: self.anchor, authorization: self.authorization, }) @@ -397,7 +397,7 @@ impl> Bundle { - ValueCommitment::derive( ValueSum::from_raw(self.value_balance.into()), ValueCommitTrapdoor::zero(), - AssetId::native(), + AssetBase::native(), ) - self .burn @@ -527,8 +527,8 @@ pub mod testing { use super::{Action, Authorization, Authorized, Bundle, Flags}; pub use crate::action::testing::{arb_action, arb_unauthorized_action}; - use crate::note::asset_id::testing::arb_zsa_asset_id; - use crate::note::AssetId; + use crate::note::asset_base::testing::arb_zsa_asset_id; + use crate::note::AssetBase; use crate::value::testing::arb_value_sum; /// Marker for an unauthorized bundle with no proofs or signatures. @@ -595,7 +595,7 @@ pub mod testing { ( asset_id in arb_zsa_asset_id(), value in arb_value_sum() - ) -> (AssetId, ValueSum) { + ) -> (AssetBase, ValueSum) { (asset_id, value) } } diff --git a/src/circuit.rs b/src/circuit.rs index e6c9f6e09..7ac075eea 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -36,7 +36,7 @@ use crate::{ note::{ commitment::{NoteCommitTrapdoor, NoteCommitment}, nullifier::Nullifier, - AssetId, ExtractedNoteCommitment, Note, + AssetBase, ExtractedNoteCommitment, Note, }, primitives::redpallas::{SpendAuth, VerificationKey}, spec::NonIdentityPallasPoint, @@ -109,7 +109,7 @@ pub struct Circuit { pub(crate) psi_old: Value, pub(crate) rcm_old: Value, pub(crate) cm_old: Value, - pub(crate) asset_old: Value, + pub(crate) asset_old: Value, pub(crate) alpha: Value, pub(crate) ak: Value, pub(crate) nk: Value, @@ -119,7 +119,7 @@ pub struct Circuit { pub(crate) v_new: Value, pub(crate) psi_new: Value, pub(crate) rcm_new: Value, - pub(crate) asset_new: Value, + pub(crate) asset_new: Value, pub(crate) rcv: Value, pub(crate) split_flag: Value, } @@ -1034,7 +1034,7 @@ mod tests { use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::{ keys::SpendValidatingKey, note::Note, @@ -1043,7 +1043,7 @@ mod tests { }; fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { - let (_, fvk, spent_note) = Note::dummy(&mut rng, None, AssetId::native()); + let (_, fvk, spent_note) = Note::dummy(&mut rng, None, AssetBase::native()); let sender_address = spent_note.recipient(); let nk = *fvk.nk(); @@ -1053,12 +1053,12 @@ mod tests { let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), AssetId::native()); + let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), AssetBase::native()); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); let rcv = ValueCommitTrapdoor::random(&mut rng); - let cv_net = ValueCommitment::derive(value, rcv, AssetId::native()); + let cv_net = ValueCommitment::derive(value, rcv, AssetBase::native()); let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); @@ -1175,7 +1175,7 @@ mod tests { let isk = IssuanceAuthorizingKey::from(&sk); let ik = IssuanceValidatingKey::from(&isk); let asset_descr = "zsa_asset"; - AssetId::derive(&ik, asset_descr) + AssetBase::derive(&ik, asset_descr) }; circuit.asset_new = Value::known(random_asset_id); diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index 4b5d1518e..12ab8a47e 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -21,11 +21,11 @@ pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; /// SWU hash-to-curve personalization for the value commitment generator pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; -/// SWU hash-to-curve personalization for the note type generator -// pub const ASSET_ID_PERSONALIZATION: &str = "z.cash:Orchard-NoteType"; +/// SWU hash-to-curve personalization for the ZSA asset base generator +pub const ZSA_ASSET_BASE_PERSONALIZATION: &str = "z.cash:OrchardZSA"; /// SWU hash-to-curve value for the value commitment generator -pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v"; +pub const NATIVE_ASSET_BASE_V_BYTES: [u8; 1] = *b"v"; /// SWU hash-to-curve value for the value commitment generator pub const VALUE_COMMITMENT_R_BYTES: [u8; 1] = *b"r"; diff --git a/src/issuance.rs b/src/issuance.rs index 74247f928..f3da1523b 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -12,8 +12,10 @@ use crate::issuance::Error::{ IssueBundleInvalidSignature, WrongAssetDescSize, }; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; -use crate::note::asset_id::is_asset_desc_of_valid_size; -use crate::note::{AssetId, Nullifier}; +use crate::note::asset_base::is_asset_desc_of_valid_size; +use crate::note::{AssetBase, Nullifier}; +use crate::primitives::redpallas::Signature; + use crate::value::NoteValue; use crate::{ primitives::redpallas::{self, SpendAuth}, @@ -21,7 +23,7 @@ use crate::{ }; /// A bundle of actions to be applied to the ledger. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct IssueBundle { /// The issuer key for the note being created. ik: IssuanceValidatingKey, @@ -81,11 +83,11 @@ impl IssueAction { self.finalize } - /// Return the `AssetId` if the provided `ik` is used to derive the `asset_id` for **all** internal notes. + /// Return the `AssetBase` if the provided `ik` is used to derive the `asset_id` for **all** internal notes. fn are_note_asset_ids_derived_correctly( &self, ik: &IssuanceValidatingKey, - ) -> Result { + ) -> Result { match self .notes .iter() @@ -97,7 +99,7 @@ impl IssueAction { .ok_or(IssueActionIncorrectNoteType) }) { Ok(asset) => asset // check that the asset was properly derived. - .eq(&AssetId::derive(ik, &self.asset_desc)) + .eq(&AssetBase::derive(ik, &self.asset_desc)) .then(|| asset) .ok_or(IssueBundleIkMismatchNoteType), Err(e) => Err(e), @@ -106,20 +108,20 @@ impl IssueAction { } /// Defines the authorization type of an Issue bundle. -pub trait IssueAuth: fmt::Debug {} +pub trait IssueAuth: fmt::Debug + Clone {} /// Marker for an unauthorized bundle with no proofs or signatures. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Unauthorized; /// Marker for an unauthorized bundle with injected sighash. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Prepared { sighash: [u8; 32], } /// Marker for an authorized bundle. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Signed { signature: redpallas::Signature, } @@ -129,6 +131,11 @@ impl Signed { pub fn signature(&self) -> &redpallas::Signature { &self.signature } + + /// Constructs an `Signed` from its constituent parts. + pub fn from_parts(signature: Signature) -> Self { + Signed { signature } + } } impl IssueAuth for Unauthorized {} @@ -163,11 +170,11 @@ impl IssueBundle { } /// Find an action by `asset` for a given `IssueBundle`. - pub fn get_action_by_type(&self, asset: AssetId) -> Option<&IssueAction> { + pub fn get_action_by_type(&self, asset: AssetBase) -> Option<&IssueAction> { let action = self .actions .iter() - .find(|a| AssetId::derive(&self.ik, &a.asset_desc).eq(&asset)); + .find(|a| AssetBase::derive(&self.ik, &a.asset_desc).eq(&asset)); action } @@ -176,6 +183,19 @@ impl IssueBundle { pub fn commitment(&self) -> IssueBundleCommitment { IssueBundleCommitment(hash_issue_bundle_txid_data(self)) } + + /// Constructs an `IssueBundle` from its constituent parts. + pub fn from_parts( + ik: IssuanceValidatingKey, + actions: Vec, + authorization: T, + ) -> Self { + IssueBundle { + ik, + actions, + authorization, + } + } } impl IssueBundle { @@ -202,12 +222,12 @@ impl IssueBundle { value: NoteValue, finalize: bool, mut rng: impl RngCore, - ) -> Result { + ) -> Result { if !is_asset_desc_of_valid_size(&asset_desc) { return Err(WrongAssetDescSize); } - let asset = AssetId::derive(&self.ik, &asset_desc); + let asset = AssetBase::derive(&self.ik, &asset_desc); let note = Note::new( recipient, @@ -335,26 +355,26 @@ impl IssueBundle { /// Validation for Orchard IssueBundles /// /// A set of previously finalized asset types must be provided. -/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `AssetId`s +/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `AssetBase`s /// /// The following checks are performed: /// * For the `IssueBundle`: /// * the Signature on top of the provided `sighash` verifies correctly. /// * For each `IssueAction`: /// * Asset description size is collect. -/// * `AssetId` for the `IssueAction` has not been previously finalized. +/// * `AssetBase` for the `IssueAction` has not been previously finalized. /// * For each `Note` inside an `IssueAction`: -/// * All notes have the same, correct `AssetId`. +/// * All notes have the same, correct `AssetBase`. pub fn verify_issue_bundle( bundle: &IssueBundle, sighash: [u8; 32], - finalized: &mut HashSet, // The finalization set. + finalized: &mut HashSet, // The finalization set. ) -> Result<(), Error> { if let Err(e) = bundle.ik.verify(&sighash, &bundle.authorization.signature) { return Err(IssueBundleInvalidSignature(e)); }; - let s = &mut HashSet::::new(); + let s = &mut HashSet::::new(); let newly_finalized = bundle .actions() @@ -403,7 +423,7 @@ pub enum Error { /// Invalid signature. IssueBundleInvalidSignature(reddsa::Error), /// The provided `NoteType` has been previously finalized. - IssueActionPreviouslyFinalizedNoteType(AssetId), + IssueActionPreviouslyFinalizedNoteType(AssetBase), } impl std::error::Error for Error {} @@ -454,7 +474,7 @@ mod tests { use crate::keys::{ FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; - use crate::note::{AssetId, Nullifier}; + use crate::note::{AssetBase, Nullifier}; use crate::value::NoteValue; use crate::{Address, Note}; use nonempty::NonEmpty; @@ -561,7 +581,7 @@ mod tests { bundle .add_recipient( - String::from("Precious NFT"), + String::from("NFT"), recipient, NoteValue::from_raw(u64::MIN), false, @@ -570,13 +590,13 @@ mod tests { .expect("Should properly add recipient"); bundle - .finalize_action(String::from("Precious NFT")) + .finalize_action(String::from("NFT")) .expect("Should finalize properly"); assert_eq!( bundle .add_recipient( - String::from("Precious NFT"), + String::from("NFT"), recipient, NoteValue::unsplittable(), false, @@ -588,7 +608,7 @@ mod tests { assert_eq!( bundle - .finalize_action(String::from("Another precious NFT")) + .finalize_action(String::from("Another NFT")) .unwrap_err(), IssueActionNotFound ); @@ -607,7 +627,7 @@ mod tests { bundle .add_recipient( - String::from("Another precious NFT"), + String::from("Another NFT"), recipient, NoteValue::unsplittable(), true, @@ -618,7 +638,7 @@ mod tests { assert_eq!( bundle .add_recipient( - String::from("Another precious NFT"), + String::from("Another NFT"), recipient, NoteValue::unsplittable(), true, @@ -718,7 +738,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(5), - AssetId::derive(bundle.ik(), "Poisoned pill"), + AssetBase::derive(bundle.ik(), "zsa_asset"), Nullifier::dummy(&mut rng), &mut rng, ); @@ -771,7 +791,7 @@ mod tests { bundle .add_recipient( - String::from("verify_with_finalize"), + String::from("Verify with finalize"), recipient, NoteValue::from_raw(7), true, @@ -785,9 +805,10 @@ mod tests { let res = verify_issue_bundle(&signed, sighash, prev_finalized); assert!(res.is_ok()); - assert!( - prev_finalized.contains(&AssetId::derive(&ik, &String::from("verify_with_finalize"))) - ); + assert!(prev_finalized.contains(&AssetBase::derive( + &ik, + &String::from("Verify with finalize") + ))); assert_eq!(prev_finalized.len(), 1); } @@ -810,7 +831,7 @@ mod tests { let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let prev_finalized = &mut HashSet::new(); - let final_type = AssetId::derive(&ik, &String::from("already final")); + let final_type = AssetBase::derive(&ik, &String::from("already final")); prev_finalized.insert(final_type); @@ -867,7 +888,7 @@ mod tests { bundle .add_recipient( - String::from("Good description"), + String::from("Asset description"), recipient, NoteValue::from_raw(5), false, @@ -896,7 +917,7 @@ mod tests { bundle .add_recipient( - String::from("Good description"), + String::from("Asset description"), recipient, NoteValue::from_raw(5), false, @@ -910,7 +931,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(5), - AssetId::derive(signed.ik(), "Poisoned pill"), + AssetBase::derive(signed.ik(), "zsa_asset"), Nullifier::dummy(&mut rng), &mut rng, ); @@ -931,7 +952,7 @@ mod tests { #[test] fn issue_bundle_verify_fail_incorrect_ik() { - let asset_description = "asset"; + let asset_description = "Asset"; let (mut rng, isk, ik, recipient, sighash) = setup_params(); @@ -957,7 +978,7 @@ mod tests { let note = Note::new( recipient, NoteValue::from_raw(55), - AssetId::derive(&incorrect_ik, asset_description), + AssetBase::derive(&incorrect_ik, asset_description), Nullifier::dummy(&mut rng), &mut rng, ); @@ -985,7 +1006,7 @@ mod tests { bundle .add_recipient( - String::from("Good description"), + String::from("Asset description"), recipient, NoteValue::from_raw(5), false, @@ -1024,7 +1045,7 @@ mod tests { pub mod testing { use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; use crate::keys::testing::{arb_issuance_authorizing_key, arb_issuance_validating_key}; - use crate::note::asset_id::testing::zsa_asset_id; + use crate::note::asset_base::testing::zsa_asset_id; use crate::note::testing::arb_zsa_note; use proptest::collection::vec; use proptest::prelude::*; diff --git a/src/keys.rs b/src/keys.rs index dc1d7d77b..faca48d2b 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -271,7 +271,7 @@ impl Eq for IssuanceValidatingKey {} impl IssuanceValidatingKey { /// Converts this spend validating key to its serialized form, /// I2LEOSP_256(ik). - pub(crate) fn to_bytes(&self) -> [u8; 32] { + pub fn to_bytes(&self) -> [u8; 32] { // This is correct because the wrapped point must have ỹ = 0, and // so the point repr is the same as I2LEOSP of its x-coordinate. <[u8; 32]>::from(&self.0) @@ -1127,7 +1127,7 @@ mod tests { testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key}, *, }; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::{ note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, value::NoteValue, @@ -1219,7 +1219,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), - AssetId::native(), + AssetBase::native(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ) diff --git a/src/note.rs b/src/note.rs index 7eeffe096..81c3b166f 100644 --- a/src/note.rs +++ b/src/note.rs @@ -19,8 +19,8 @@ pub use self::commitment::{ExtractedNoteCommitment, NoteCommitment}; pub(crate) mod nullifier; pub use self::nullifier::Nullifier; -pub(crate) mod asset_id; -pub use self::asset_id::AssetId; +pub(crate) mod asset_base; +pub use self::asset_base::AssetBase; /// The ZIP 212 seed randomness for a note. #[derive(Copy, Clone, Debug)] @@ -94,7 +94,7 @@ pub struct Note { /// The value of this note. value: NoteValue, /// The asset id of this note. - asset: AssetId, + asset: AssetBase, /// A unique creation ID for this note. /// /// This is set to the nullifier of the note that was spent in the [`Action`] that @@ -134,7 +134,7 @@ impl Note { pub fn from_parts( recipient: Address, value: NoteValue, - asset: AssetId, + asset: AssetBase, rho: Nullifier, rseed: RandomSeed, ) -> CtOption { @@ -156,7 +156,7 @@ impl Note { pub(crate) fn new( recipient: Address, value: NoteValue, - asset: AssetId, + asset: AssetBase, rho: Nullifier, mut rng: impl RngCore, ) -> Self { @@ -182,7 +182,7 @@ impl Note { pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, - asset: AssetId, + asset: AssetBase, ) -> (SpendingKey, FullViewingKey, Self) { let sk = SpendingKey::random(rng); let fvk: FullViewingKey = (&sk).into(); @@ -210,7 +210,7 @@ impl Note { } /// Returns the note type of this note. - pub fn asset(&self) -> AssetId { + pub fn asset(&self) -> AssetBase { self.asset } @@ -301,8 +301,8 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; - use crate::note::asset_id::testing::arb_asset_id; - use crate::note::AssetId; + use crate::note::asset_base::testing::arb_asset_id; + use crate::note::AssetBase; use crate::value::testing::arb_note_value; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, @@ -346,7 +346,7 @@ pub mod testing { Note { recipient, value, - asset: AssetId::native(), + asset: AssetBase::native(), rho, rseed, } @@ -355,7 +355,7 @@ pub mod testing { prop_compose! { /// Generate an arbitrary zsa note - pub fn arb_zsa_note(asset: AssetId)( + pub fn arb_zsa_note(asset: AssetBase)( recipient in arb_address(), value in arb_note_value(), rho in arb_nullifier(), diff --git a/src/note/asset_id.rs b/src/note/asset_base.rs similarity index 60% rename from src/note/asset_id.rs rename to src/note/asset_base.rs index 93993c47b..9e98cbd89 100644 --- a/src/note/asset_id.rs +++ b/src/note/asset_base.rs @@ -1,3 +1,4 @@ +use blake2b_simd::{Hash as Blake2bHash, Params}; use group::GroupEncoding; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; @@ -5,25 +6,38 @@ use std::hash::{Hash, Hasher}; use subtle::{Choice, ConstantTimeEq, CtOption}; -use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; +use crate::constants::fixed_bases::{ + NATIVE_ASSET_BASE_V_BYTES, VALUE_COMMITMENT_PERSONALIZATION, ZSA_ASSET_BASE_PERSONALIZATION, +}; use crate::keys::IssuanceValidatingKey; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] -pub struct AssetId(pallas::Point); +pub struct AssetBase(pallas::Point); pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; -// the hasher used to derive the assetID -fn asset_id_hasher(msg: Vec) -> pallas::Point { - // TODO(zsa) replace personalization - pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) +/// Personalization for the ZSA asset digest generator +pub const ZSA_ASSET_DIGEST_PERSONALIZATION: &[u8; 16] = b"ZSA-Asset-Digest"; + +/// AssetDigest for the ZSA asset +/// +/// Defined in [Transfer and Burn of Zcash Shielded Assets][AssetDigest]. +/// +/// [assetdigest]: https://qed-it.github.io/zips/zip-0226.html#asset-identifiers +pub fn asset_digest(asset_id: Vec) -> Blake2bHash { + Params::new() + .hash_length(64) + .personal(ZSA_ASSET_DIGEST_PERSONALIZATION) + .to_state() + .update(&asset_id) + .finalize() } -impl AssetId { +impl AssetBase { /// Deserialize the asset_id from a byte array. pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { - pallas::Point::from_bytes(bytes).map(AssetId) + pallas::Point::from_bytes(bytes).map(AssetBase) } /// Serialize the asset_id to its canonical byte representation. @@ -33,9 +47,9 @@ impl AssetId { /// Note type derivation$. /// - /// Defined in [Transfer and Burn of Zcash Shielded Assets][notetypes]. + /// Defined in [Transfer and Burn of Zcash Shielded Assets][AssetBase]. /// - /// [notetypes]: https://qed-it.github.io/zips/draft-ZIP-0226.html#asset-types + /// [notetypes]: https://qed-it.github.io/zips/zip-0226.html#asset-identifiers /// /// # Panics /// @@ -44,16 +58,23 @@ impl AssetId { pub fn derive(ik: &IssuanceValidatingKey, asset_desc: &str) -> Self { assert!(is_asset_desc_of_valid_size(asset_desc)); - let mut s = vec![]; - s.extend(ik.to_bytes()); - s.extend(asset_desc.as_bytes()); + // EncodeAssetId(ik, asset_desc) = version_byte || ik || asset_desc + let version_byte = [0x00]; + let encode_asset_id = [&version_byte[..], &ik.to_bytes(), asset_desc.as_bytes()].concat(); - AssetId(asset_id_hasher(s)) + let asset_digest = asset_digest(encode_asset_id); + + // AssetBase = ZSAValueBase(AssetDigest) + AssetBase( + pallas::Point::hash_to_curve(ZSA_ASSET_BASE_PERSONALIZATION)(asset_digest.as_bytes()), + ) } /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. pub fn native() -> Self { - AssetId(asset_id_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) + AssetBase(pallas::Point::hash_to_curve( + VALUE_COMMITMENT_PERSONALIZATION, + )(&NATIVE_ASSET_BASE_V_BYTES[..])) } /// The base point used in value commitments. @@ -67,7 +88,7 @@ impl AssetId { } } -impl Hash for AssetId { +impl Hash for AssetBase { fn hash(&self, h: &mut H) { h.write(&self.to_bytes()); h.finish(); @@ -79,7 +100,7 @@ pub fn is_asset_desc_of_valid_size(asset_desc: &str) -> bool { !asset_desc.is_empty() && asset_desc.bytes().len() <= MAX_ASSET_DESCRIPTION_SIZE } -impl PartialEq for AssetId { +impl PartialEq for AssetBase { fn eq(&self, other: &Self) -> bool { bool::from(self.0.ct_eq(&other.0)) } @@ -89,7 +110,7 @@ impl PartialEq for AssetId { #[cfg(any(test, feature = "test-dependencies"))] #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { - use super::AssetId; + use super::AssetBase; use proptest::prelude::*; @@ -101,21 +122,21 @@ pub mod testing { is_native in prop::bool::ANY, sk in arb_spending_key(), str in "[A-Za-z]{255}", - ) -> AssetId { + ) -> AssetBase { if is_native { - AssetId::native() + AssetBase::native() } else { let isk = IssuanceAuthorizingKey::from(&sk); - AssetId::derive(&IssuanceValidatingKey::from(&isk), &str) + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) } } } prop_compose! { /// Generate the native note type - pub fn native_asset_id()(_i in 0..10) -> AssetId { + pub fn native_asset_id()(_i in 0..10) -> AssetBase { // TODO: remove _i - AssetId::native() + AssetBase::native() } } @@ -124,9 +145,9 @@ pub mod testing { pub fn arb_zsa_asset_id()( sk in arb_spending_key(), str in "[A-Za-z]{255}" - ) -> AssetId { + ) -> AssetBase { let isk = IssuanceAuthorizingKey::from(&sk); - AssetId::derive(&IssuanceValidatingKey::from(&isk), &str) + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) } } @@ -134,25 +155,27 @@ pub mod testing { /// Generate an asset ID using a specific description pub fn zsa_asset_id(asset_desc: String)( sk in arb_spending_key(), - ) -> AssetId { + ) -> AssetBase { assert!(super::is_asset_desc_of_valid_size(&asset_desc)); let isk = IssuanceAuthorizingKey::from(&sk); - AssetId::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) } } + // the following test should fail until updated to use the new asset ID derivation #[test] + #[should_panic] fn test_vectors() { let test_vectors = crate::test_vectors::asset_id::test_vectors(); for tv in test_vectors { let description = std::str::from_utf8(&tv.description).unwrap(); - let calculated_asset_id = AssetId::derive( + let calculated_asset_id = AssetBase::derive( &IssuanceValidatingKey::from_bytes(&tv.key).unwrap(), description, ); - let test_vector_asset_id = AssetId::from_bytes(&tv.asset_id).unwrap(); + let test_vector_asset_id = AssetBase::from_bytes(&tv.asset_id).unwrap(); assert_eq!(calculated_asset_id, test_vector_asset_id); } diff --git a/src/note/commitment.rs b/src/note/commitment.rs index f4bc7247b..f95d8be82 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -11,7 +11,7 @@ use crate::{ fixed_bases::{NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION}, L_ORCHARD_BASE, }, - note::asset_id::AssetId, + note::asset_base::AssetBase, spec::extract_p, value::NoteValue, }; @@ -45,7 +45,7 @@ impl NoteCommitment { g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, - asset: AssetId, + asset: AssetBase, rho: pallas::Base, psi: pallas::Base, rcm: NoteCommitTrapdoor, diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 4beb99528..1e00c0351 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -8,7 +8,7 @@ use zcash_note_encryption::{ AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; -use crate::note::AssetId; +use crate::note::AssetBase; use crate::{ action::Action, keys::{ @@ -163,7 +163,7 @@ where let note = Option::from(Note::from_parts( recipient, value, - AssetId::native(), //V2 notes are always native. + AssetBase::native(), //V2 notes are always native. domain.rho, rseed, ))?; @@ -474,7 +474,7 @@ mod tests { }; use super::{prf_ock_orchard, CompactAction, OrchardDomainV2, OrchardNoteEncryption}; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::{ action::Action, keys::{ @@ -566,7 +566,7 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); - let note = Note::from_parts(recipient, value, AssetId::native(), rho, rseed).unwrap(); + let note = Note::from_parts(recipient, value, AssetBase::native(), rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( diff --git a/src/note_encryption_v2v3.rs b/src/note_encryption_v2v3.rs index bef34e06e..5d3eedf25 100644 --- a/src/note_encryption_v2v3.rs +++ b/src/note_encryption_v2v3.rs @@ -8,7 +8,7 @@ use zcash_note_encryption::{ AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; -use crate::note::AssetId; +use crate::note::AssetBase; use crate::{ action::Action, keys::{ @@ -109,14 +109,14 @@ where Some((note, recipient)) } -fn parse_version_and_asset_type(plaintext: &CompactNotePlaintextBytes) -> Option { +fn parse_version_and_asset_type(plaintext: &CompactNotePlaintextBytes) -> Option { match plaintext { - CompactNotePlaintextBytes::V2(x) if x[0] == 0x02 => Some(AssetId::native()), + CompactNotePlaintextBytes::V2(x) if x[0] == 0x02 => Some(AssetBase::native()), CompactNotePlaintextBytes::V3(x) if x[0] == 0x03 => { let bytes = x[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] .try_into() .unwrap(); - AssetId::from_bytes(bytes).into() + AssetBase::from_bytes(bytes).into() } _ => None, } @@ -554,7 +554,7 @@ mod tests { }; use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; - use crate::note::AssetId; + use crate::note::AssetBase; use crate::note_encryption::NoteCiphertextBytes; use crate::{ action::Action, @@ -646,8 +646,8 @@ mod tests { let recipient = Address::from_parts(d, pk_d); let asset = match tv.asset { - None => AssetId::native(), - Some(type_bytes) => AssetId::from_bytes(&type_bytes).unwrap(), + None => AssetBase::native(), + Some(type_bytes) => AssetBase::from_bytes(&type_bytes).unwrap(), }; let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs index c8a772ffe..4333f6dba 100644 --- a/src/note_encryption_v3.rs +++ b/src/note_encryption_v3.rs @@ -8,7 +8,7 @@ use zcash_note_encryption::{ AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; -use crate::note::AssetId; +use crate::note::AssetBase; use crate::{ action::Action, keys::{ @@ -161,12 +161,12 @@ where let recipient = Address::from_parts(diversifier, pk_d); let asset = match note_version(plaintext.0.as_ref())? { - 0x02 => AssetId::native(), + 0x02 => AssetBase::native(), 0x03 => { let bytes = plaintext.0[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] .try_into() .unwrap(); - AssetId::from_bytes(bytes).unwrap() + AssetBase::from_bytes(bytes).unwrap() } _ => panic!("invalid note version"), }; @@ -483,7 +483,7 @@ mod tests { OutgoingViewingKey, PreparedIncomingViewingKey, }, note::{ - testing::arb_note, AssetId, ExtractedNoteCommitment, Nullifier, RandomSeed, + testing::arb_note, AssetBase, ExtractedNoteCommitment, Nullifier, RandomSeed, TransmittedNoteCiphertext, }, primitives::redpallas, @@ -565,7 +565,7 @@ mod tests { let recipient = Address::from_parts(d, pk_d); - let asset = AssetId::from_bytes(&tv.asset).unwrap(); + let asset = AssetBase::from_bytes(&tv.asset).unwrap(); let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); diff --git a/src/value.rs b/src/value.rs index b514e7a28..fea4c6f94 100644 --- a/src/value.rs +++ b/src/value.rs @@ -59,7 +59,7 @@ use crate::{ }; use crate::builder::Error; -use crate::note::AssetId; +use crate::note::AssetBase; /// Maximum note value. pub const MAX_NOTE_VALUE: u64 = u64::MAX; @@ -345,7 +345,7 @@ impl ValueCommitment { /// /// [concretehomomorphiccommit]: https://zips.z.cash/protocol/nu5.pdf#concretehomomorphiccommit #[allow(non_snake_case)] - pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, asset: AssetId) -> Self { + pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, asset: AssetBase) -> Self { let hasher = pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION); let R = hasher(&VALUE_COMMITMENT_R_BYTES); let abs_value = u64::try_from(value.0.abs()).expect("value must be in valid range"); @@ -461,9 +461,9 @@ pub mod testing { #[cfg(test)] mod tests { - use crate::note::asset_id::testing::{arb_asset_id, native_asset_id}; + use crate::note::asset_base::testing::{arb_asset_id, native_asset_id}; - use crate::note::AssetId; + use crate::note::AssetBase; use proptest::prelude::*; use super::{ @@ -473,10 +473,10 @@ mod tests { use crate::primitives::redpallas; fn check_binding_signature( - native_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], - arb_values: &[(ValueSum, ValueCommitTrapdoor, AssetId)], + native_values: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], + arb_values: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], neg_trapdoors: &[ValueCommitTrapdoor], - arb_values_to_burn: &[(ValueSum, ValueCommitTrapdoor, AssetId)], + arb_values_to_burn: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], ) { // for each arb value, create a negative value with a different trapdoor let neg_arb_values: Vec<_> = arb_values @@ -513,7 +513,7 @@ mod tests { - ValueCommitment::derive( native_value_balance, ValueCommitTrapdoor::zero(), - AssetId::native(), + AssetBase::native(), ) - arb_values_to_burn .iter() diff --git a/tests/builder.rs b/tests/builder.rs index 3e7c416c6..0e9565eb7 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -1,5 +1,5 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Hashable, Tree}; -use orchard::note::AssetId; +use orchard::note::AssetBase; use orchard::{ builder::Builder, bundle::{Authorized, Flags}, @@ -68,7 +68,7 @@ fn bundle_chain() { None, recipient, NoteValue::from_raw(5000), - AssetId::native(), + AssetBase::native(), None ), Ok(()) @@ -103,7 +103,7 @@ fn bundle_chain() { None, recipient, NoteValue::from_raw(5000), - AssetId::native(), + AssetBase::native(), None ), Ok(()) diff --git a/tests/zsa.rs b/tests/zsa.rs index 9ddaaf7bd..5b1ea4437 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -6,7 +6,7 @@ use incrementalmerkletree::{Hashable, Tree}; use orchard::bundle::Authorized; use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; -use orchard::note::{AssetId, ExtractedNoteCommitment}; +use orchard::note::{AssetBase, ExtractedNoteCommitment}; use orchard::note_encryption_v3::OrchardDomainV3; use orchard::tree::{MerkleHashOrchard, MerklePath}; use orchard::{ @@ -189,7 +189,7 @@ fn create_native_note(keys: &Keychain) -> Note { None, keys.recipient, NoteValue::from_raw(100), - AssetId::native(), + AssetBase::native(), None ), Ok(()) @@ -225,13 +225,13 @@ impl TestSpendInfo { struct TestOutputInfo { value: NoteValue, - asset: AssetId, + asset: AssetBase, } fn build_and_verify_bundle( spends: Vec<&TestSpendInfo>, outputs: Vec, - assets_to_burn: Vec<(AssetId, NoteValue)>, + assets_to_burn: Vec<(AssetBase, NoteValue)>, anchor: Anchor, expected_num_actions: usize, keys: &Keychain, @@ -376,7 +376,7 @@ fn zsa_issue_and_transfer() { }, TestOutputInfo { value: NoteValue::from_raw(100), - asset: AssetId::native(), + asset: AssetBase::native(), }, ], vec![], @@ -396,7 +396,7 @@ fn zsa_issue_and_transfer() { }, TestOutputInfo { value: native_spend.note.value(), - asset: AssetId::native(), + asset: AssetBase::native(), }, ], vec![], @@ -493,7 +493,7 @@ fn zsa_issue_and_transfer() { let result = build_and_verify_bundle( vec![&native_spend], vec![], - vec![(AssetId::native(), native_spend.note.value())], + vec![(AssetBase::native(), native_spend.note.value())], native_anchor, 2, &keys, From 527e29a062d951ff3152a4ef992b22dc4700473f Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 20 Mar 2023 14:12:10 +0100 Subject: [PATCH 21/67] Upgrade pprof version with a limited inferno version (#48) --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 20a2ac0b7..5a09720a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,8 +58,8 @@ proptest = "1.0.0" zcash_note_encryption = { version = "0.2", features = ["pre-zip-212"] } [target.'cfg(unix)'.dev-dependencies] -# TODO: upgrade the pprof version once its inferno dependency respects all clippy lints -pprof = { version = "0.6", features = ["criterion", "flamegraph"] } # MSRV 1.56 +inferno = ">= 0.11, < 0.11.15" +pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 [lib] bench = false From f0b794896d1ef0359e53234905a3fd6ad643aec8 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Wed, 19 Apr 2023 01:00:37 +0530 Subject: [PATCH 22/67] Making changes to the asset base derivation from the asset identifier (#49) This PR updates the test-vectors from the updates to the zcash-test-vectors repository (see here). The keys test is also updated to now use the asset base from the test vectors instead of just using the native asset. --- src/keys.rs | 2 +- src/note/asset_base.rs | 8 +- src/test_vectors/asset_id.rs | 1642 +++++++++++++++++----------------- src/test_vectors/keys.rs | 441 +++++---- 4 files changed, 1071 insertions(+), 1022 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index faca48d2b..6842d182d 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1219,7 +1219,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), - AssetBase::native(), + AssetBase::from_bytes(&tv.asset).unwrap(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ) diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index 9e98cbd89..1079e4a6c 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -162,22 +162,20 @@ pub mod testing { } } - // the following test should fail until updated to use the new asset ID derivation #[test] - #[should_panic] fn test_vectors() { let test_vectors = crate::test_vectors::asset_id::test_vectors(); for tv in test_vectors { let description = std::str::from_utf8(&tv.description).unwrap(); - let calculated_asset_id = AssetBase::derive( + let calculated_asset_base = AssetBase::derive( &IssuanceValidatingKey::from_bytes(&tv.key).unwrap(), description, ); - let test_vector_asset_id = AssetBase::from_bytes(&tv.asset_id).unwrap(); + let test_vector_asset_base = AssetBase::from_bytes(&tv.asset_base).unwrap(); - assert_eq!(calculated_asset_id, test_vector_asset_id); + assert_eq!(calculated_asset_base, test_vector_asset_base); } } } diff --git a/src/test_vectors/asset_id.rs b/src/test_vectors/asset_id.rs index c50c0f8f5..2f4f08385 100644 --- a/src/test_vectors/asset_id.rs +++ b/src/test_vectors/asset_id.rs @@ -3,7 +3,7 @@ pub(crate) struct TestVector { pub(crate) key: [u8; 32], pub(crate) description: [u8; 512], - pub(crate) asset_id: [u8; 32], + pub(crate) asset_base: [u8; 32], } pub(crate) fn test_vectors() -> Vec { @@ -15,48 +15,48 @@ pub(crate) fn test_vectors() -> Vec { 0x75, 0x51, 0x47, 0x24, ], description: [ - 0xc5, 0xb3, 0xc8, 0xbe, 0xc8, 0x8a, 0xc8, 0x98, 0xcd, 0xbb, 0xc2, 0xb7, 0xc2, 0xa3, - 0xc9, 0x8f, 0xc5, 0x94, 0xc2, 0xb5, 0xc8, 0x9d, 0x21, 0xc7, 0xbc, 0xc3, 0xb6, 0xc5, - 0xa5, 0xc7, 0xae, 0xc4, 0x9c, 0xc6, 0xa4, 0xc3, 0x81, 0xe2, 0xb1, 0xa5, 0xc6, 0xb6, - 0xc8, 0xb6, 0xc8, 0x88, 0xc3, 0x8c, 0xc6, 0x8e, 0x5d, 0x32, 0xc4, 0x9a, 0xc9, 0x84, - 0xc6, 0xbf, 0xc7, 0x9b, 0xc8, 0x99, 0xc7, 0x9d, 0xc8, 0xbc, 0xcd, 0xb2, 0xc4, 0x9e, - 0xc5, 0xa1, 0xc7, 0xa9, 0xc6, 0xbb, 0xc3, 0x80, 0xc8, 0xba, 0xc3, 0xa1, 0xc4, 0x84, - 0x5f, 0xc7, 0xaa, 0xc5, 0xad, 0xc3, 0x80, 0xc6, 0xaf, 0xc3, 0x85, 0xc6, 0xb1, 0xc7, - 0xbf, 0xc7, 0x93, 0xcd, 0xbc, 0xc3, 0xad, 0xc4, 0x94, 0xc5, 0xad, 0xc3, 0xb6, 0xc3, - 0xa4, 0xc7, 0x9e, 0xc7, 0x81, 0x50, 0xc3, 0xb5, 0xc7, 0x86, 0xcd, 0xbd, 0xe1, 0x9b, - 0x90, 0x23, 0xc6, 0x91, 0xc7, 0x85, 0xc6, 0x8a, 0xc6, 0x9a, 0xc7, 0x88, 0x4e, 0xe1, - 0x9b, 0x9f, 0xe1, 0x9b, 0x93, 0xe1, 0x9a, 0xaf, 0xc6, 0xa1, 0xc8, 0xb1, 0xc7, 0x8d, - 0xc5, 0x93, 0xc8, 0xa0, 0xc7, 0x86, 0x4e, 0xc6, 0xb4, 0xc3, 0x80, 0xce, 0x88, 0x77, - 0xe1, 0x9b, 0xa4, 0xc2, 0xaf, 0xc5, 0x91, 0xc7, 0xa9, 0xc8, 0x83, 0x4d, 0xc8, 0x8b, - 0x6b, 0xc7, 0x9b, 0xc7, 0x82, 0x57, 0xe2, 0xb1, 0xb3, 0xc5, 0x98, 0xc3, 0xb2, 0x61, - 0xc5, 0x9b, 0xc3, 0xbe, 0x3f, 0xc5, 0xb5, 0xc3, 0x88, 0x31, 0xc7, 0xb7, 0xc3, 0xa0, - 0xc5, 0xa2, 0x77, 0xc3, 0x94, 0xc7, 0xa7, 0xc3, 0xa4, 0x6c, 0xe1, 0x9b, 0x97, 0xe1, - 0x9b, 0x81, 0xc2, 0xa5, 0xc8, 0x99, 0xc3, 0xa6, 0xc4, 0x9f, 0xc5, 0x89, 0xc8, 0xa2, - 0xc4, 0xb3, 0xc5, 0x9a, 0xc6, 0x90, 0x48, 0xc3, 0x80, 0xc6, 0xb6, 0xc5, 0x92, 0xe1, - 0x9b, 0xa8, 0xc2, 0xa3, 0xc7, 0xba, 0xc2, 0xa2, 0xc8, 0x87, 0xc3, 0xb1, 0xc7, 0xbb, - 0x6d, 0xc8, 0xa2, 0xc7, 0xa2, 0xc6, 0xaf, 0xe1, 0x9b, 0xa3, 0xc3, 0x86, 0xe1, 0x9b, - 0xa1, 0x60, 0x37, 0xc7, 0x91, 0x56, 0xc5, 0x95, 0xc4, 0xbc, 0xc5, 0xbe, 0xc4, 0x97, - 0x5a, 0x31, 0xc5, 0x89, 0xc9, 0x83, 0xc8, 0xb4, 0xc6, 0xa4, 0xc7, 0xb5, 0xe1, 0x9b, - 0x9e, 0xc3, 0xab, 0xcd, 0xb0, 0x56, 0xc7, 0x86, 0xc6, 0x99, 0xe1, 0x9b, 0x96, 0xc7, - 0x90, 0xe1, 0x9b, 0x95, 0xc4, 0xaf, 0xc8, 0xac, 0xe2, 0xb1, 0xa7, 0xc3, 0x91, 0xc9, - 0x8b, 0xc6, 0xad, 0xc5, 0x87, 0x5f, 0xe2, 0xb1, 0xb4, 0xc2, 0xb4, 0xc9, 0x8b, 0xc8, - 0x9b, 0xc7, 0x80, 0xc6, 0xbb, 0xc2, 0xbd, 0xc8, 0xbb, 0xc4, 0xa2, 0x48, 0xc7, 0xa1, - 0xc2, 0xa4, 0xc4, 0x86, 0xe2, 0xb1, 0xa8, 0xc6, 0x87, 0xc7, 0xb9, 0xe1, 0x9a, 0xa0, - 0xc6, 0xb0, 0xc6, 0xad, 0xc9, 0x83, 0xc7, 0x99, 0xc4, 0x9e, 0xe1, 0x9a, 0xbf, 0xc7, - 0xa6, 0x67, 0xc8, 0x95, 0xc3, 0x83, 0xe1, 0x9a, 0xa2, 0xce, 0x8a, 0x57, 0xc3, 0xa3, - 0xc7, 0x81, 0xc6, 0xab, 0xc6, 0xbe, 0x7b, 0xc3, 0x9e, 0xc7, 0x88, 0xe1, 0x9a, 0xae, - 0xc3, 0x94, 0xc6, 0x8e, 0xce, 0x88, 0xe1, 0x9b, 0x96, 0xc3, 0x85, 0xc4, 0xa9, 0xe2, - 0xb1, 0xb4, 0xc7, 0xab, 0xe1, 0x9b, 0x8e, 0xc4, 0xa9, 0xe2, 0xb1, 0xa1, 0xe2, 0xb1, - 0xa0, 0xc7, 0x96, 0xc3, 0xbe, 0xe1, 0x9a, 0xa2, 0xc4, 0xba, 0xe1, 0x9b, 0x95, 0xe2, - 0xb1, 0xaa, 0xc5, 0x88, 0xc6, 0xa2, 0xe1, 0x9b, 0x99, 0xc2, 0xaa, 0xe1, 0x9a, 0xa7, - 0xc6, 0x98, 0x72, 0xe1, 0x9b, 0x88, 0xc6, 0xa0, 0xc5, 0x8f, 0xc2, 0xa6, 0xc2, 0xb8, - 0xc5, 0x8f, 0xc6, 0x9f, 0xc7, 0xb0, 0xc4, 0xb8, 0xc9, 0x8f, 0xc7, 0xac, 0x6e, 0x44, - 0xe1, 0x9a, 0xba, 0xc3, 0xb3, 0xc3, 0x99, 0x5a, + 0xe1, 0x9b, 0x91, 0xc8, 0xa3, 0xe1, 0x9b, 0x8b, 0xc7, 0xac, 0xc8, 0xa0, 0xe1, 0x9b, + 0x89, 0xc3, 0x9b, 0xe1, 0x9b, 0xaa, 0xc6, 0xa7, 0xc9, 0x8e, 0xc2, 0xa2, 0xc2, 0xb2, + 0xe1, 0x9a, 0xbb, 0xc5, 0x9f, 0xc6, 0xaa, 0xc6, 0xbf, 0x69, 0xe1, 0x9b, 0xa9, 0xe1, + 0x9a, 0xae, 0xc4, 0xab, 0xe1, 0x9b, 0xa1, 0xc9, 0x8b, 0x23, 0xe1, 0x9b, 0x8a, 0xc7, + 0xa0, 0xe1, 0x9b, 0x88, 0xc4, 0xa6, 0xe1, 0x9b, 0xad, 0xc4, 0x9a, 0xe2, 0xb1, 0xb5, + 0xc7, 0xa7, 0x51, 0x78, 0x3f, 0xc3, 0xb0, 0xc8, 0x8a, 0x45, 0xc4, 0xa5, 0xc7, 0xb4, + 0xe1, 0x9a, 0xba, 0xe2, 0xb1, 0xbe, 0x38, 0xc2, 0xaa, 0xc8, 0xbb, 0xc8, 0xb2, 0xc6, + 0x86, 0xc6, 0xaa, 0xe1, 0x9b, 0xa2, 0xc8, 0xa7, 0xc5, 0x94, 0xc4, 0xad, 0x78, 0xc5, + 0x96, 0xe1, 0x9b, 0x81, 0xc9, 0x80, 0xc3, 0x93, 0xc6, 0xbe, 0xe1, 0x9a, 0xb0, 0x6d, + 0xc5, 0x90, 0xc4, 0x8a, 0x75, 0xc7, 0xa8, 0xc4, 0xac, 0xc4, 0x92, 0xc7, 0xa4, 0xc5, + 0x99, 0x25, 0xc6, 0xa1, 0xc5, 0x87, 0xc7, 0xa3, 0xce, 0x88, 0xc7, 0x8e, 0xc5, 0x85, + 0xe1, 0x9a, 0xb5, 0xe2, 0xb1, 0xad, 0xc4, 0x82, 0xc2, 0xb7, 0xc6, 0xac, 0xe1, 0x9b, + 0x82, 0x57, 0x30, 0xc3, 0xb0, 0xc7, 0xab, 0x69, 0xe1, 0x9b, 0x82, 0xc8, 0xb6, 0xc3, + 0xae, 0xe2, 0xb1, 0xab, 0x4f, 0xe1, 0x9a, 0xb5, 0xcd, 0xb5, 0xce, 0x88, 0xc4, 0x9f, + 0xc3, 0xb7, 0xc5, 0xb9, 0xc8, 0x88, 0x2f, 0xcd, 0xb7, 0xc8, 0x8f, 0xc8, 0xa4, 0xc5, + 0x95, 0xc3, 0xbc, 0x37, 0xe2, 0xb1, 0xb3, 0xc7, 0xa1, 0xc7, 0x89, 0xc4, 0x8d, 0xc5, + 0x87, 0x5f, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x80, 0x76, 0xc7, 0xa6, 0xe2, 0xb1, 0xa2, + 0xe2, 0xb1, 0xb3, 0xc9, 0x83, 0xc3, 0xbd, 0x55, 0xe1, 0x9b, 0x84, 0xc7, 0xb6, 0xc9, + 0x8f, 0xc4, 0xa2, 0xc3, 0xbd, 0xe1, 0x9b, 0xa2, 0xc5, 0xb3, 0xc3, 0x90, 0x3d, 0xc6, + 0x8f, 0xc8, 0xbe, 0xc7, 0x99, 0xc5, 0xb4, 0xe2, 0xb1, 0xbd, 0xe2, 0xb1, 0xb4, 0xc8, + 0x9b, 0xc3, 0x81, 0xc6, 0xb0, 0x7d, 0xe2, 0xb1, 0xae, 0xc6, 0x85, 0xc5, 0x98, 0xc5, + 0x96, 0xc7, 0xb7, 0xc5, 0xa0, 0xcd, 0xbc, 0xc5, 0xa6, 0xe1, 0x9a, 0xb4, 0xc2, 0xa5, + 0xe1, 0x9b, 0xae, 0xc7, 0xbd, 0xc6, 0x9f, 0xc7, 0x81, 0xc6, 0x8e, 0x53, 0xc5, 0xb7, + 0xc2, 0xb0, 0xc7, 0xb6, 0xe1, 0x9b, 0xa6, 0xc7, 0x94, 0xe1, 0x9a, 0xa8, 0xc5, 0xa5, + 0xc8, 0xa6, 0x56, 0xc7, 0xae, 0xc6, 0x88, 0xe1, 0x9b, 0x8b, 0xc2, 0xb5, 0xe1, 0x9a, + 0xb5, 0xe1, 0x9a, 0xba, 0xe1, 0x9a, 0xa8, 0x32, 0xc2, 0xaf, 0xc6, 0xae, 0xce, 0x8a, + 0xc7, 0x92, 0xc2, 0xbf, 0xe1, 0x9b, 0x91, 0xc7, 0xb9, 0xc5, 0xa5, 0xc8, 0x95, 0xe2, + 0xb1, 0xb2, 0xc2, 0xa4, 0xc4, 0x9e, 0xc6, 0xa5, 0xc7, 0xb3, 0xc2, 0xa3, 0xe2, 0xb1, + 0xac, 0xe1, 0x9a, 0xa0, 0xc7, 0xa3, 0xcd, 0xb5, 0xc3, 0x9a, 0xc7, 0xaf, 0xc5, 0x87, + 0xe1, 0x9b, 0xa8, 0xc5, 0xaf, 0xc2, 0xbb, 0xc3, 0xae, 0xc6, 0xb9, 0xc6, 0x99, 0xc4, + 0xa7, 0xc3, 0x89, 0xe1, 0x9a, 0xbc, 0xc8, 0x95, 0xc5, 0x9e, 0xe1, 0x9a, 0xa6, 0xc4, + 0xab, 0xc8, 0x9b, 0xc5, 0xaf, 0xc3, 0x99, 0xc6, 0xaf, 0xe1, 0x9b, 0x90, 0xc8, 0xa7, + 0xc3, 0x97, 0x51, 0xc8, 0xab, 0xe2, 0xb1, 0xa2, 0x7d, 0x2c, 0x72, 0x36, 0x2b, 0xc3, + 0xb0, 0xc8, 0x8d, 0x46, 0xc5, 0x9d, 0xc4, 0xba, 0xc4, 0xa9, 0xc2, 0xa2, 0xc6, 0x9b, + 0xc3, 0xaf, 0x2f, 0xc8, 0x99, 0xe1, 0x9a, 0xb4, 0xc3, 0xba, 0xe1, 0x9b, 0x9b, 0xc2, + 0xa7, 0xc8, 0xb1, 0xe1, 0x9b, 0xae, 0xc7, 0xad, 0xe1, 0x9a, 0xaf, 0xc4, 0xbd, 0xc3, + 0x82, 0xc4, 0xaf, 0xc4, 0xb1, 0xe1, 0x9a, 0xaa, ], - asset_id: [ - 0x29, 0xb8, 0x07, 0x86, 0xde, 0xf6, 0x7e, 0xee, 0xe1, 0xfa, 0x1e, 0xb2, 0x4f, 0xd9, - 0xad, 0xf0, 0xab, 0xba, 0xe1, 0x70, 0x57, 0xeb, 0x4a, 0x04, 0x11, 0x13, 0xa4, 0x4e, - 0x9a, 0x1c, 0x92, 0x33, + asset_base: [ + 0x64, 0x0c, 0x81, 0x73, 0x79, 0x71, 0x4a, 0xe4, 0x8a, 0xf0, 0xbb, 0x83, 0x32, 0xf2, + 0x0d, 0x57, 0x7c, 0xb2, 0x42, 0x7e, 0x8f, 0x04, 0x49, 0x18, 0xee, 0xe5, 0x76, 0x45, + 0x05, 0x09, 0x6c, 0x97, ], }, TestVector { @@ -66,48 +66,48 @@ pub(crate) fn test_vectors() -> Vec { 0xd4, 0xff, 0xf7, 0x12, ], description: [ - 0x76, 0xc4, 0xb6, 0xc5, 0xb8, 0xe1, 0x9b, 0xa4, 0xc4, 0x9f, 0xc7, 0xb9, 0xc2, 0xb8, - 0xc7, 0x95, 0xc6, 0xbf, 0xc9, 0x87, 0xc5, 0xb3, 0xe1, 0x9b, 0xa1, 0xc5, 0xa9, 0xc3, - 0xa2, 0xc7, 0xb7, 0x77, 0xc6, 0xbf, 0xc6, 0xb5, 0xe1, 0x9a, 0xb6, 0xc3, 0xa2, 0xc5, - 0xbf, 0xe1, 0x9b, 0x82, 0xc4, 0x9c, 0xc6, 0xab, 0xc4, 0xbc, 0xc5, 0xb8, 0xe1, 0x9a, - 0xb6, 0xc7, 0xb7, 0xc2, 0xbe, 0xc7, 0x8e, 0xcd, 0xbd, 0xe1, 0x9a, 0xb4, 0xc8, 0x98, - 0xc8, 0x93, 0xc5, 0xb9, 0xc7, 0xb8, 0xc4, 0x8d, 0xe1, 0x9b, 0x86, 0xc7, 0x85, 0xc7, - 0x8e, 0xc4, 0x9f, 0xc5, 0xa3, 0x47, 0x7a, 0xc6, 0xa3, 0x5e, 0xe1, 0x9a, 0xa7, 0x66, - 0xc8, 0x9a, 0x45, 0xc4, 0x94, 0xc9, 0x8e, 0xc7, 0x9b, 0xc8, 0xbf, 0xe1, 0x9a, 0xa4, - 0x2b, 0xc6, 0xad, 0xc3, 0x9c, 0xc5, 0xbf, 0xc3, 0x91, 0xe1, 0x9b, 0xaf, 0xc5, 0x94, - 0xe1, 0x9b, 0x8d, 0xc2, 0xbb, 0xc4, 0xab, 0xc3, 0x88, 0xc4, 0xac, 0xe1, 0x9b, 0x96, - 0xcd, 0xb7, 0xc3, 0x97, 0x2b, 0x3c, 0xe1, 0x9b, 0x99, 0xc7, 0x91, 0xe1, 0x9a, 0xa4, - 0xc4, 0x8e, 0xc7, 0xa7, 0xe2, 0xb1, 0xac, 0xc2, 0xbc, 0xc4, 0x82, 0xc3, 0x81, 0xc6, - 0xb8, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x95, 0xc4, 0xa4, 0xe1, 0x9b, 0xaa, 0xe1, 0x9a, - 0xa0, 0xc5, 0xbe, 0xe1, 0x9b, 0x8a, 0x34, 0xc7, 0x82, 0x7d, 0xe1, 0x9a, 0xbe, 0xc4, - 0x83, 0xe1, 0x9a, 0xa5, 0xc5, 0x8d, 0x51, 0xc8, 0xa9, 0xc9, 0x81, 0xc7, 0xa9, 0xc4, - 0x8f, 0xe2, 0xb1, 0xa2, 0x58, 0xc3, 0x9d, 0xc6, 0x94, 0xce, 0x85, 0xc7, 0xbe, 0xc4, - 0x89, 0x3c, 0xc2, 0xa3, 0xc7, 0xaf, 0xc3, 0x9b, 0xc7, 0xae, 0xc8, 0x89, 0xc9, 0x88, - 0xc5, 0xa8, 0xe2, 0xb1, 0xa9, 0xc5, 0xa3, 0x67, 0xc6, 0xa8, 0xe1, 0x9a, 0xb3, 0xc7, - 0x95, 0xc5, 0xa9, 0xc5, 0xa0, 0xc5, 0x84, 0xe1, 0x9a, 0xbf, 0xc7, 0xb4, 0xc9, 0x8a, - 0xc4, 0xbc, 0xc5, 0xbb, 0xc7, 0x99, 0xc3, 0x8e, 0xe1, 0x9a, 0xb0, 0xc5, 0x87, 0xe2, - 0xb1, 0xb0, 0xe1, 0x9a, 0xab, 0xc4, 0x8f, 0xc5, 0xb8, 0xc5, 0x90, 0xc5, 0xbc, 0xc3, - 0x80, 0xc3, 0xbc, 0xc4, 0x8a, 0xc5, 0xbb, 0x64, 0x3e, 0xc2, 0xa7, 0xc6, 0xb3, 0xe2, - 0xb1, 0xb6, 0xc8, 0xa4, 0x72, 0x71, 0xe1, 0x9b, 0x92, 0x3c, 0xc4, 0x99, 0xe2, 0xb1, - 0xb5, 0xc7, 0x81, 0xc4, 0xbd, 0xc8, 0xa6, 0xc4, 0xa8, 0xe1, 0x9a, 0xa1, 0xc3, 0x85, - 0xc6, 0x8f, 0xc2, 0xb9, 0xc7, 0x9b, 0xc7, 0xa7, 0xe1, 0x9a, 0xb3, 0xc8, 0x99, 0xc7, - 0xb4, 0xe1, 0x9b, 0xa6, 0xc3, 0x94, 0xe1, 0x9b, 0x91, 0xc6, 0xb7, 0x31, 0xc7, 0xb2, - 0xc3, 0x9e, 0xc7, 0xad, 0xc3, 0xa4, 0xc4, 0x97, 0xcd, 0xb5, 0xe1, 0x9a, 0xac, 0x63, - 0xc7, 0x96, 0xe2, 0xb1, 0xa3, 0xc8, 0x86, 0xc4, 0x97, 0x37, 0xc5, 0xa9, 0xc2, 0xa5, - 0xc4, 0xbf, 0xc7, 0x85, 0xc2, 0xa4, 0xe1, 0x9a, 0xa6, 0xc5, 0xba, 0xc6, 0xb3, 0xc5, - 0xb5, 0x36, 0x4e, 0x6e, 0xc5, 0x90, 0xc3, 0x80, 0xc7, 0xbd, 0xc6, 0x88, 0xc3, 0xb4, - 0xe2, 0xb1, 0xa6, 0xc8, 0xa4, 0xc8, 0xb0, 0xe1, 0x9a, 0xa0, 0xc3, 0x84, 0xc8, 0x8b, - 0xcd, 0xbe, 0xc5, 0x80, 0xc8, 0x9e, 0xc3, 0x99, 0xc4, 0x8a, 0xc3, 0x83, 0x3e, 0x28, - 0x4a, 0xe1, 0x9b, 0x85, 0xce, 0x87, 0xc5, 0x82, 0xc8, 0xbb, 0xc8, 0x8d, 0xc4, 0x88, - 0xc6, 0x9e, 0xc6, 0x98, 0xc5, 0xbf, 0x45, 0xc7, 0xb2, 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, - 0x9a, 0xc4, 0xb5, 0xc2, 0xae, 0xc9, 0x80, 0xc6, 0x88, 0xc3, 0x8c, 0xc8, 0xa5, 0xc2, - 0xb8, 0x35, 0xc7, 0xba, 0xc6, 0xac, 0x58, 0xc4, 0x97, 0x7e, 0xc7, 0x98, 0xc3, 0xbd, - 0xc2, 0xb9, 0xc8, 0x99, 0xe1, 0x9b, 0x8c, 0x5a, + 0xc6, 0x89, 0xc8, 0x9f, 0xc4, 0xa2, 0xe1, 0x9a, 0xb6, 0xc7, 0xa7, 0xe2, 0xb1, 0xa8, + 0xc2, 0xbc, 0xe2, 0xb1, 0xa2, 0xc3, 0x8d, 0x73, 0xc3, 0xa1, 0xc7, 0xbf, 0xc7, 0xa5, + 0xc7, 0xb3, 0xc6, 0x83, 0x7d, 0xc5, 0x85, 0x3c, 0xc8, 0x9d, 0x6a, 0x51, 0xc8, 0xac, + 0xe1, 0x9a, 0xb6, 0xce, 0x85, 0xc5, 0xbf, 0xc7, 0xb5, 0xe1, 0x9a, 0xb3, 0xc4, 0xa4, + 0xc2, 0xb9, 0x50, 0xe2, 0xb1, 0xa7, 0xc2, 0xb7, 0xc7, 0x91, 0xe1, 0x9b, 0xb0, 0xc4, + 0x8b, 0xe2, 0xb1, 0xae, 0xc3, 0x8a, 0xc4, 0x93, 0xc5, 0xac, 0xc2, 0xa2, 0xe2, 0xb1, + 0xad, 0xc3, 0x8e, 0xe1, 0x9b, 0x84, 0xc9, 0x88, 0xc5, 0xb1, 0xc4, 0xbb, 0xc4, 0x80, + 0xcd, 0xb5, 0xc5, 0xba, 0x45, 0xe1, 0x9a, 0xbe, 0xe2, 0xb1, 0xbd, 0xc9, 0x82, 0xc4, + 0xa2, 0x62, 0xc7, 0x91, 0x2e, 0xc7, 0x82, 0xc8, 0x92, 0xc8, 0x9e, 0xc7, 0x8f, 0xe1, + 0x9b, 0x9a, 0xc8, 0xa9, 0xc4, 0x9b, 0xc3, 0x9a, 0xc4, 0x9a, 0xc3, 0x8d, 0xc8, 0x88, + 0xc4, 0x8d, 0xc2, 0xa9, 0xcd, 0xbc, 0x5e, 0xc8, 0xb7, 0xcd, 0xbe, 0xc2, 0xb0, 0xe2, + 0xb1, 0xb0, 0xc3, 0xb4, 0xe1, 0x9b, 0x83, 0xc5, 0x84, 0xc7, 0x82, 0xc7, 0xb9, 0xc8, + 0xb6, 0xc9, 0x87, 0xc5, 0xbb, 0xc2, 0xb1, 0xc4, 0xaf, 0x73, 0xcd, 0xb4, 0x54, 0xc5, + 0xb6, 0xc7, 0x97, 0xc3, 0x87, 0xce, 0x87, 0xc6, 0xb3, 0x69, 0xc4, 0x84, 0xe1, 0x9b, + 0x9a, 0xc5, 0x91, 0xc7, 0x89, 0xc2, 0xa2, 0x2e, 0xc6, 0x85, 0xc5, 0x94, 0xc4, 0xbf, + 0xc3, 0xa8, 0xc6, 0xbc, 0xc7, 0x9c, 0xe2, 0xb1, 0xa5, 0x6e, 0xc6, 0xb4, 0xc8, 0xa1, + 0xc6, 0x91, 0xc6, 0x91, 0xc6, 0xa9, 0xe1, 0x9b, 0x88, 0xc7, 0x90, 0xc4, 0xb3, 0xe1, + 0x9a, 0xb9, 0xc4, 0x87, 0xc5, 0xbc, 0xe2, 0xb1, 0xae, 0xc3, 0x83, 0xe1, 0x9b, 0x9e, + 0xc5, 0x89, 0xc8, 0x9d, 0x66, 0xe2, 0xb1, 0xae, 0xc5, 0x98, 0xc4, 0xb5, 0xc8, 0x9f, + 0xc8, 0xaa, 0xc9, 0x86, 0xe1, 0x9a, 0xa3, 0xc5, 0x94, 0xc7, 0x8d, 0xc6, 0x90, 0xc7, + 0xb2, 0xc7, 0x9b, 0xc7, 0xb2, 0xc4, 0xa4, 0xc7, 0x88, 0xc8, 0xa5, 0xc6, 0x9a, 0xc4, + 0x8b, 0x39, 0xc7, 0xb8, 0x3c, 0xc8, 0xa8, 0xc6, 0x89, 0xc7, 0xb2, 0xc7, 0x98, 0xc3, + 0xb0, 0xc3, 0xb2, 0xc6, 0xa0, 0xc5, 0xa5, 0xc8, 0x90, 0x47, 0xc5, 0x9f, 0xc8, 0x8f, + 0xc7, 0x98, 0xc3, 0xb6, 0xe1, 0x9a, 0xa5, 0x2f, 0xc9, 0x89, 0xc8, 0xb0, 0xc7, 0x9f, + 0xc4, 0x80, 0xe2, 0xb1, 0xa2, 0x74, 0xe1, 0x9b, 0x82, 0xc3, 0x90, 0xc7, 0xb6, 0xc8, + 0xa4, 0xe2, 0xb1, 0xa7, 0xc6, 0xb4, 0xc7, 0xbe, 0x71, 0xc5, 0x8d, 0xe2, 0xb1, 0xbd, + 0xc6, 0x97, 0xc6, 0x95, 0x72, 0xc4, 0xa9, 0xe1, 0x9b, 0xaf, 0xc5, 0xa8, 0xc6, 0x89, + 0xc6, 0xad, 0xe2, 0xb1, 0xae, 0xc7, 0xb1, 0x6c, 0xc5, 0xab, 0xe2, 0xb1, 0xbe, 0xe1, + 0x9b, 0x8e, 0xc3, 0x96, 0xe1, 0x9b, 0xa7, 0x65, 0xc6, 0xab, 0xe1, 0x9b, 0x97, 0xc6, + 0x90, 0xe1, 0x9b, 0xa9, 0xe1, 0x9a, 0xa4, 0xc7, 0x8a, 0x5b, 0xe2, 0xb1, 0xa6, 0xc5, + 0xbf, 0xc9, 0x86, 0xc8, 0x8b, 0xc6, 0xbd, 0xc5, 0xab, 0xc3, 0x90, 0xc2, 0xbb, 0xc8, + 0xb4, 0xc5, 0x84, 0xc3, 0xa0, 0xc6, 0x91, 0xc9, 0x8e, 0xc4, 0x87, 0xe2, 0xb1, 0xa5, + 0x71, 0xe1, 0x9a, 0xbb, 0xc7, 0x90, 0xc8, 0x85, 0xc6, 0x84, 0xce, 0x8a, 0xe2, 0xb1, + 0xbf, 0xc3, 0x9d, 0xc4, 0xbe, 0xc5, 0xac, 0x53, 0xc4, 0x8b, 0xc7, 0x97, 0xc6, 0x8d, + 0xe2, 0xb1, 0xb0, 0xc6, 0x87, 0xe1, 0x9b, 0x9a, 0xc7, 0x8c, 0xe1, 0x9b, 0x90, 0xc3, + 0xa4, 0xc4, 0xa7, 0xc7, 0xb9, 0x7a, 0xe1, 0x9b, 0x98, 0x2a, 0x46, 0x65, 0xc8, 0x88, + 0x78, 0xc7, 0x83, 0xe1, 0x9b, 0xa7, 0xc3, 0xbf, ], - asset_id: [ - 0x35, 0x52, 0x83, 0x87, 0xd4, 0x4d, 0x74, 0x21, 0xa9, 0x78, 0xad, 0x56, 0xe5, 0x33, - 0xf3, 0x6e, 0x85, 0xec, 0xac, 0x44, 0x9f, 0x3b, 0x3f, 0x68, 0xe7, 0xff, 0x39, 0x7f, - 0xae, 0x24, 0x5a, 0x99, + asset_base: [ + 0xd6, 0x9d, 0x7b, 0xa8, 0xcd, 0x66, 0x3c, 0xf9, 0x52, 0x8f, 0x01, 0x0a, 0x2d, 0xee, + 0x7b, 0x42, 0x9f, 0xe5, 0x62, 0x65, 0x50, 0x09, 0x30, 0x52, 0x90, 0x5a, 0xa9, 0x09, + 0x88, 0x38, 0x8d, 0x06, ], }, TestVector { @@ -117,48 +117,48 @@ pub(crate) fn test_vectors() -> Vec { 0x45, 0x02, 0x53, 0x01, ], description: [ - 0xc7, 0x8e, 0x4f, 0xc2, 0xbb, 0x39, 0xc3, 0xa4, 0xc4, 0x94, 0xc5, 0xbb, 0xc5, 0xa6, - 0xc2, 0xab, 0xc2, 0xba, 0xc7, 0x9e, 0xc5, 0x88, 0xc8, 0x9c, 0x57, 0xc3, 0xbc, 0xe2, - 0xb1, 0xb7, 0xe1, 0x9a, 0xa9, 0x3a, 0xc3, 0x84, 0xc5, 0x9b, 0xc8, 0xb5, 0xc5, 0x80, - 0xc9, 0x81, 0xc7, 0xa7, 0xc5, 0x92, 0xc6, 0x9b, 0xc7, 0x86, 0xc8, 0xba, 0xc6, 0x88, - 0xc9, 0x85, 0xc3, 0xab, 0xc8, 0x94, 0xc8, 0x92, 0xc7, 0xa2, 0xc7, 0x82, 0xc4, 0x91, - 0x74, 0x62, 0xc5, 0x9b, 0x42, 0xc8, 0xbe, 0xc3, 0xa7, 0xc4, 0xb8, 0xc2, 0xaf, 0xc6, - 0x8d, 0x39, 0xc7, 0xb3, 0xc8, 0x97, 0xc8, 0x91, 0xc2, 0xbb, 0xc4, 0x87, 0xe1, 0x9b, - 0x8a, 0xc2, 0xa7, 0xc7, 0xb4, 0xc4, 0xbb, 0xc2, 0xb2, 0xc8, 0x9a, 0xe1, 0x9a, 0xa3, - 0xc3, 0x92, 0x36, 0xe1, 0x9b, 0x9d, 0xc7, 0x8f, 0xc8, 0x90, 0xc8, 0xb3, 0x36, 0x49, - 0xc4, 0x92, 0xe1, 0x9b, 0x84, 0xc6, 0x94, 0xc8, 0xba, 0xc9, 0x8c, 0xc7, 0x85, 0xc6, - 0x94, 0xc6, 0x87, 0xc6, 0xb6, 0xc4, 0xba, 0xc5, 0xb4, 0x51, 0xe1, 0x9a, 0xb7, 0xc3, - 0xbb, 0xcd, 0xbb, 0xc7, 0x89, 0xc3, 0xba, 0xc6, 0x93, 0xc2, 0xa7, 0xc3, 0xa1, 0xc3, - 0x8f, 0x7b, 0xc7, 0xa9, 0xc6, 0x92, 0x4b, 0xe1, 0x9b, 0xb0, 0xc8, 0xb3, 0xc5, 0x9a, - 0xe1, 0x9a, 0xb8, 0x71, 0xc9, 0x88, 0x4c, 0x25, 0xc7, 0x9b, 0xe1, 0x9b, 0x9a, 0xc2, - 0xb7, 0xc4, 0xb1, 0xe1, 0x9b, 0x97, 0x64, 0xe1, 0x9b, 0xa3, 0xc5, 0xb4, 0xe2, 0xb1, - 0xb1, 0xc9, 0x8d, 0x60, 0xe1, 0x9b, 0xa7, 0xe1, 0x9b, 0xa3, 0xc5, 0x84, 0xc4, 0x94, - 0xc7, 0xb8, 0xc8, 0x9c, 0x7c, 0xc3, 0xaa, 0x36, 0xc2, 0xa4, 0xc3, 0xa8, 0xe1, 0x9b, - 0x9f, 0xc3, 0x95, 0xc8, 0xa1, 0xc3, 0xac, 0xc4, 0x99, 0xc7, 0xa4, 0xc8, 0x93, 0xc8, - 0xb0, 0xc8, 0xa2, 0xc6, 0xb4, 0xc6, 0xa4, 0xe1, 0x9a, 0xaa, 0xc9, 0x85, 0xc2, 0xa5, - 0xcd, 0xbd, 0xc4, 0x97, 0xc4, 0xb2, 0xc4, 0xa7, 0xc4, 0x91, 0xc7, 0xbe, 0xe2, 0xb1, - 0xb4, 0xc9, 0x87, 0xc5, 0xab, 0xc7, 0x84, 0xc5, 0x9c, 0xe2, 0xb1, 0xaf, 0x55, 0xe2, - 0xb1, 0xaf, 0x23, 0xc4, 0x8e, 0xc5, 0xba, 0xc5, 0xaf, 0xc8, 0xaf, 0xe2, 0xb1, 0xa0, - 0x56, 0xc7, 0xb2, 0xc6, 0xb7, 0xc6, 0x90, 0xc6, 0x8d, 0x5e, 0xc6, 0xb5, 0xe1, 0x9a, - 0xb7, 0xc3, 0x89, 0xc8, 0x91, 0xc6, 0x9a, 0x74, 0x4f, 0xc4, 0xb1, 0xc7, 0xae, 0xc4, - 0xaa, 0xc3, 0xae, 0xc6, 0x9f, 0xc3, 0x99, 0xc8, 0x87, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, - 0xa4, 0xe1, 0x9b, 0xad, 0xc8, 0x93, 0xc6, 0x94, 0xc8, 0x82, 0xc7, 0xa8, 0xc6, 0xba, - 0xc6, 0x90, 0xc3, 0x88, 0xc6, 0xbb, 0xc9, 0x88, 0xc2, 0xa5, 0xc6, 0xad, 0xe1, 0x9a, - 0xb0, 0xc4, 0xbb, 0x47, 0x2e, 0xc6, 0x92, 0xc6, 0x8b, 0xe1, 0x9a, 0xaa, 0xc7, 0x80, - 0xe1, 0x9a, 0xa0, 0xc6, 0xab, 0xc3, 0xaf, 0xc8, 0xb9, 0xe1, 0x9b, 0x8f, 0xe1, 0x9a, - 0xb9, 0xc3, 0xa9, 0xc5, 0x8e, 0x68, 0xc8, 0xaa, 0xc4, 0xb6, 0xe2, 0xb1, 0xbd, 0xe1, - 0x9b, 0xad, 0xc7, 0xa6, 0xc5, 0x96, 0xc6, 0x82, 0xc7, 0x84, 0x3f, 0xc3, 0x97, 0xc4, - 0xbe, 0xc8, 0x91, 0xc6, 0xaa, 0x41, 0xc4, 0xa9, 0xc6, 0x80, 0xc2, 0xb7, 0xe2, 0xb1, - 0xb1, 0xc2, 0xa3, 0xc6, 0xa8, 0xe1, 0x9a, 0xa7, 0xc2, 0xaf, 0xc8, 0x83, 0xe1, 0x9b, - 0xac, 0x37, 0xc4, 0x8f, 0xc5, 0xb9, 0xe2, 0xb1, 0xb8, 0xc3, 0x8f, 0xc6, 0xb1, 0xc4, - 0xaa, 0xc5, 0x97, 0xe2, 0xb1, 0xab, 0xe1, 0x9b, 0x80, 0x58, 0xe1, 0x9b, 0x8b, 0xc8, - 0xb8, 0x2c, 0x21, 0x36, 0xc5, 0xb3, 0xc6, 0xaa, 0xc7, 0x8a, 0xc4, 0xa3, 0xc4, 0xb6, - 0xc5, 0xa4, 0xc5, 0x92, 0xe1, 0x9a, 0xbf, 0x5a, + 0xe1, 0x9a, 0xa0, 0xc7, 0xbb, 0xe1, 0x9b, 0xa1, 0xce, 0x8a, 0xc8, 0xb3, 0x31, 0xc8, + 0xba, 0xc8, 0x95, 0xc7, 0xae, 0xcd, 0xb5, 0xc4, 0xac, 0xc3, 0x87, 0x6b, 0xc3, 0xbd, + 0xc3, 0x9a, 0xc8, 0x83, 0xc7, 0x92, 0x48, 0xe1, 0x9b, 0x90, 0xe2, 0xb1, 0xb2, 0xc6, + 0x89, 0xe1, 0x9a, 0xa7, 0xc6, 0x81, 0xc2, 0xa9, 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0xac, + 0xc3, 0xa8, 0xc5, 0xae, 0xc8, 0x8f, 0xc4, 0x96, 0xc3, 0x8e, 0xcd, 0xbb, 0xe1, 0x9b, + 0xaf, 0xc3, 0xa2, 0xc4, 0x92, 0xc5, 0xb2, 0xc6, 0x9f, 0xc3, 0xbb, 0xc5, 0xb5, 0xe2, + 0xb1, 0xb4, 0xc4, 0x95, 0xc7, 0x9f, 0xe1, 0x9a, 0xaf, 0xc9, 0x82, 0xc7, 0x8d, 0xc5, + 0x8c, 0xc3, 0x90, 0xe1, 0x9b, 0xa5, 0xe1, 0x9b, 0x94, 0xc9, 0x89, 0xe2, 0xb1, 0xa9, + 0xc4, 0x90, 0xc7, 0xa2, 0xc4, 0x8c, 0xc7, 0xbf, 0xc3, 0x80, 0xc6, 0x83, 0xc6, 0x95, + 0x24, 0x23, 0xe1, 0x9b, 0x90, 0xe1, 0x9a, 0xa3, 0xc3, 0x96, 0xc9, 0x8a, 0xc5, 0xb6, + 0x48, 0xc7, 0x9b, 0xc2, 0xaf, 0xc8, 0x86, 0xc5, 0xb9, 0xc8, 0x9b, 0x52, 0xc5, 0xa4, + 0x56, 0xe1, 0x9b, 0x9d, 0xe1, 0x9b, 0x95, 0xe1, 0x9a, 0xba, 0xc4, 0xa7, 0xc5, 0xaa, + 0xe2, 0xb1, 0xa6, 0xc8, 0xb5, 0x62, 0x4c, 0xe1, 0x9b, 0xaf, 0xc7, 0xab, 0xc5, 0x86, + 0xc5, 0x9d, 0x39, 0xc6, 0x9d, 0x3d, 0xc6, 0x82, 0xc8, 0x91, 0xe2, 0xb1, 0xaa, 0xc6, + 0xb8, 0xc5, 0x96, 0xc3, 0x90, 0xc3, 0xa5, 0x31, 0xc8, 0x94, 0x7d, 0xc7, 0xae, 0x56, + 0xc8, 0xaa, 0x66, 0xc7, 0x8d, 0x79, 0xc4, 0x9b, 0xc7, 0xb9, 0xc2, 0xbb, 0xc4, 0x84, + 0xce, 0x85, 0xc3, 0x9c, 0xc9, 0x83, 0xc8, 0xbc, 0xc8, 0x83, 0xc7, 0x96, 0xc6, 0xbf, + 0x28, 0xe1, 0x9a, 0xa1, 0xc6, 0xb3, 0xe2, 0xb1, 0xb5, 0xc4, 0x92, 0xc4, 0x92, 0xc2, + 0xa9, 0xc2, 0xb2, 0xc3, 0xad, 0xe2, 0xb1, 0xbe, 0xc6, 0xb3, 0xc8, 0x89, 0xc9, 0x8b, + 0xc4, 0x94, 0xc6, 0xa5, 0x2a, 0xc6, 0x8b, 0xe1, 0x9b, 0xa3, 0xe1, 0x9a, 0xa4, 0xc7, + 0x85, 0xc7, 0x8f, 0xc6, 0x90, 0xc7, 0xa3, 0xc7, 0xbe, 0xc3, 0x9e, 0xc2, 0xbd, 0x25, + 0xc8, 0xaf, 0xc6, 0x92, 0xe1, 0x9b, 0xab, 0xc8, 0xb9, 0x59, 0xc5, 0x93, 0xc7, 0xbf, + 0xc3, 0x96, 0xc6, 0xbf, 0xc3, 0xb0, 0xc6, 0x9e, 0xc9, 0x83, 0x35, 0xe2, 0xb1, 0xa1, + 0xc5, 0xaf, 0xc8, 0x9b, 0xc4, 0x9f, 0xc2, 0xa2, 0xcd, 0xb7, 0xc5, 0x83, 0xc6, 0x9b, + 0xc8, 0x92, 0xcd, 0xb7, 0xc8, 0xba, 0xc2, 0xa8, 0x44, 0xc4, 0xa6, 0xe1, 0x9a, 0xb8, + 0xc7, 0xa1, 0xc8, 0xa4, 0xc4, 0xbe, 0x6b, 0xc6, 0xa1, 0xc7, 0xa5, 0x4f, 0xc2, 0xa1, + 0xc8, 0x9b, 0xc4, 0xb8, 0x6e, 0xc3, 0x8f, 0xc6, 0xb5, 0xc4, 0x9c, 0xe1, 0x9b, 0x87, + 0xc5, 0x8a, 0xe2, 0xb1, 0xa7, 0xc3, 0x8d, 0xc4, 0x9b, 0xc7, 0xb0, 0x7a, 0xc7, 0x88, + 0xc5, 0xa7, 0x2e, 0xc2, 0xbb, 0xc3, 0x95, 0x6c, 0xe2, 0xb1, 0xa6, 0xe1, 0x9a, 0xad, + 0xc7, 0x85, 0xc9, 0x80, 0xc8, 0xa2, 0xc8, 0xaa, 0xe1, 0x9b, 0x9e, 0xc7, 0x9e, 0xc3, + 0x8b, 0xc6, 0xb4, 0xc8, 0x8c, 0xc9, 0x85, 0xc5, 0xab, 0xc5, 0x8a, 0x26, 0xc5, 0xa5, + 0xc3, 0x98, 0x30, 0xe1, 0x9b, 0x8b, 0xc5, 0xb3, 0xe2, 0xb1, 0xa9, 0x51, 0x33, 0xc6, + 0x85, 0x75, 0xc9, 0x82, 0xe1, 0x9a, 0xaa, 0xc6, 0x89, 0xe1, 0x9a, 0xb7, 0xc7, 0x81, + 0xc4, 0xa4, 0xc8, 0x86, 0xc3, 0xaf, 0xe1, 0x9b, 0x80, 0xe2, 0xb1, 0xab, 0xc7, 0x96, + 0x68, 0xc4, 0x93, 0x3f, 0xc3, 0x99, 0xc2, 0xb7, 0xc8, 0x8b, 0xc7, 0xb3, 0xc5, 0xa5, + 0xe1, 0x9b, 0xa9, 0xc5, 0x84, 0xc4, 0xa7, 0xc5, 0x99, 0xc4, 0xae, 0xc9, 0x87, 0xe1, + 0x9a, 0xba, 0xc4, 0x8a, 0xc4, 0xb2, 0x6d, 0x5a, ], - asset_id: [ - 0xf5, 0x4b, 0x0c, 0x9b, 0xad, 0x5a, 0x85, 0x26, 0x2b, 0x8a, 0x3b, 0xa4, 0x13, 0x6a, - 0x5b, 0x4c, 0xf3, 0x23, 0x85, 0xca, 0x49, 0x2f, 0x09, 0x4a, 0x42, 0xb2, 0xf6, 0xad, - 0x65, 0xc1, 0x07, 0x33, + asset_base: [ + 0x8e, 0x9c, 0x21, 0x17, 0xed, 0x4f, 0x4e, 0xe8, 0x9a, 0xb8, 0xb3, 0x53, 0xf5, 0xfd, + 0xd0, 0xcb, 0xde, 0xb7, 0xf2, 0xc9, 0x55, 0xfa, 0xdc, 0x7b, 0x1a, 0xda, 0x09, 0x97, + 0x56, 0x11, 0x72, 0x85, ], }, TestVector { @@ -168,48 +168,48 @@ pub(crate) fn test_vectors() -> Vec { 0x28, 0x88, 0xc6, 0x0e, ], description: [ - 0xce, 0x88, 0xcd, 0xb5, 0xc6, 0x9f, 0xc6, 0xa5, 0xc8, 0x9e, 0xc7, 0xb2, 0xc7, 0xbc, - 0x7d, 0xc3, 0xb9, 0xc5, 0x84, 0xc5, 0x8b, 0xc4, 0x9a, 0xc3, 0xb4, 0xc7, 0x9a, 0xe2, - 0xb1, 0xa1, 0xc7, 0xb4, 0xc3, 0x8d, 0xe1, 0x9a, 0xab, 0xc7, 0x92, 0xe1, 0x9b, 0xaa, - 0xc5, 0x88, 0x26, 0xc5, 0xba, 0xc4, 0xad, 0xc5, 0xb5, 0xc3, 0xa3, 0xc5, 0xa8, 0x30, - 0xc5, 0xaf, 0xc8, 0x96, 0xe1, 0x9b, 0xa6, 0xe1, 0x9b, 0xa9, 0xc2, 0xb2, 0xc7, 0xaa, - 0xc4, 0x93, 0xc8, 0x8f, 0xc5, 0xac, 0xe1, 0x9a, 0xa7, 0xc4, 0x89, 0xc8, 0xbc, 0xc3, - 0xb9, 0xc6, 0xb6, 0xe1, 0x9b, 0x99, 0xc7, 0xae, 0xc4, 0xa6, 0xc7, 0xb9, 0x7c, 0xce, - 0x88, 0xc3, 0xbe, 0xc5, 0x9c, 0xc8, 0x82, 0xc6, 0x88, 0xc7, 0x9a, 0xc6, 0xbb, 0xcd, - 0xb6, 0xc7, 0x8a, 0xc5, 0x88, 0xe1, 0x9a, 0xa2, 0x52, 0xc4, 0xae, 0xc2, 0xa9, 0xc5, - 0x9b, 0xc4, 0x83, 0x74, 0xc8, 0x9e, 0xc3, 0xb4, 0xc3, 0x82, 0x30, 0xc3, 0xbd, 0xc3, - 0x87, 0xc8, 0xba, 0xc5, 0xb1, 0xc8, 0x85, 0x6b, 0xc4, 0xb7, 0xc5, 0x9d, 0x57, 0xc7, - 0x90, 0xc6, 0xb9, 0x45, 0xc4, 0x9f, 0xc7, 0x8d, 0xc5, 0xa8, 0xc5, 0x8f, 0xc3, 0xaf, - 0xc3, 0xb3, 0xc3, 0xb3, 0xc3, 0xb1, 0xc2, 0xac, 0xc5, 0xb7, 0xe2, 0xb1, 0xa2, 0xc8, - 0xbb, 0xc7, 0xa7, 0xe1, 0x9a, 0xb9, 0xc5, 0xb2, 0xc5, 0xbd, 0xc6, 0xaf, 0xc3, 0xac, - 0xe1, 0x9b, 0xb0, 0xc7, 0x9d, 0xc4, 0x8a, 0xc6, 0xa9, 0xc5, 0xaa, 0xc3, 0x8e, 0xc2, - 0xa7, 0xc7, 0xaa, 0xc4, 0x90, 0x66, 0xe2, 0xb1, 0xb7, 0xe1, 0x9a, 0xbc, 0xc6, 0xbc, - 0xc5, 0x91, 0xc8, 0xbb, 0x44, 0xce, 0x8c, 0xc8, 0x84, 0xc8, 0x92, 0xe1, 0x9a, 0xbb, - 0xe1, 0x9a, 0xa2, 0xc6, 0x88, 0xc7, 0xb7, 0xc6, 0xa1, 0xe1, 0x9b, 0x90, 0xc4, 0xa2, - 0xc4, 0x92, 0x36, 0xc6, 0xb8, 0xc4, 0xaa, 0xc2, 0xb3, 0xe1, 0x9b, 0x81, 0xc9, 0x87, - 0xc7, 0xbc, 0x3b, 0xc8, 0xbc, 0xc8, 0x8e, 0xc3, 0xaa, 0xc9, 0x8a, 0xc6, 0x94, 0xe2, - 0xb1, 0xb4, 0xc5, 0x9a, 0xe1, 0x9b, 0x92, 0xc8, 0xa2, 0xc4, 0xb6, 0xc4, 0x91, 0xcd, - 0xbe, 0xc8, 0xac, 0xc4, 0xb5, 0xcd, 0xbc, 0x3d, 0xe1, 0x9b, 0xa7, 0xc2, 0xab, 0xc2, - 0xa8, 0xc6, 0xb0, 0xc4, 0x84, 0xc3, 0xb5, 0xe1, 0x9a, 0xb8, 0xc6, 0x96, 0xc3, 0x99, - 0x65, 0x56, 0xc3, 0xb9, 0xc8, 0xb0, 0xc4, 0xb2, 0xcd, 0xb6, 0x71, 0xc3, 0xb8, 0xc7, - 0xb6, 0xc8, 0x8b, 0xc3, 0xa3, 0xe1, 0x9b, 0x8f, 0x6c, 0xc4, 0xad, 0xc3, 0xa2, 0xc2, - 0xb2, 0xe1, 0x9a, 0xb6, 0xe1, 0x9b, 0x98, 0xe1, 0x9b, 0xae, 0xc8, 0xa2, 0xc2, 0xb6, - 0xc8, 0xb3, 0xc6, 0xbe, 0xe1, 0x9b, 0x85, 0xe1, 0x9b, 0x90, 0xe1, 0x9b, 0x89, 0xc3, - 0xbc, 0xe2, 0xb1, 0xa2, 0xc5, 0xb3, 0xc3, 0x84, 0xc7, 0x95, 0xc5, 0x9d, 0xc4, 0xba, - 0xe2, 0xb1, 0xb6, 0xc2, 0xa8, 0x78, 0xc8, 0xad, 0xc3, 0xae, 0xc6, 0x88, 0xc3, 0x9e, - 0xc3, 0xa9, 0xc3, 0x9d, 0xe2, 0xb1, 0xaf, 0xc5, 0x8c, 0xe2, 0xb1, 0xa1, 0xc5, 0xbc, - 0xe1, 0x9a, 0xab, 0xc8, 0xbf, 0xc7, 0x8b, 0xc6, 0xb2, 0x21, 0xc3, 0x93, 0xc5, 0xa5, - 0x6d, 0xcd, 0xb2, 0xe1, 0x9b, 0x88, 0x5e, 0xe1, 0x9a, 0xb6, 0xc5, 0xb1, 0xc7, 0x87, - 0xc8, 0x9a, 0xc7, 0xa6, 0xc2, 0xaf, 0xe1, 0x9b, 0xa6, 0xc4, 0x86, 0xc2, 0xb1, 0x29, - 0xe1, 0x9a, 0xb9, 0xc7, 0x90, 0xc9, 0x8a, 0xc4, 0xab, 0xe1, 0x9b, 0x8e, 0xc7, 0x90, - 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0xa5, 0xc6, 0xb8, 0xc4, 0xa6, 0xe1, 0x9b, 0x8a, 0xc5, - 0xb2, 0xc6, 0xa8, 0xc6, 0x8e, 0xc2, 0xbe, 0xc8, 0xbd, 0xc8, 0xa5, 0xc5, 0xa5, 0xc6, - 0x90, 0x3f, 0xc7, 0xa8, 0xc4, 0xaf, 0xc2, 0xaa, + 0xc6, 0xb9, 0xe2, 0xb1, 0xae, 0xe2, 0xb1, 0xbc, 0xc7, 0x97, 0xe1, 0x9b, 0x9f, 0xc6, + 0x98, 0xc8, 0x82, 0xc3, 0xa2, 0xc4, 0xba, 0xc7, 0xbc, 0xc4, 0xbc, 0xc4, 0xa6, 0xc6, + 0xad, 0xc8, 0xb7, 0x70, 0xc3, 0x94, 0xe1, 0x9b, 0x81, 0xc5, 0x86, 0xe2, 0xb1, 0xa9, + 0xc8, 0x99, 0xce, 0x8c, 0xc3, 0x99, 0xc7, 0x91, 0xc3, 0xbd, 0x30, 0xc7, 0xb9, 0xc4, + 0xb0, 0xc8, 0xae, 0xe1, 0x9b, 0xa5, 0xc6, 0xbe, 0xc5, 0xad, 0xc5, 0xb6, 0xc2, 0xaf, + 0xc4, 0xbf, 0xce, 0x8c, 0xc8, 0xb8, 0x4a, 0xe2, 0xb1, 0xaa, 0xc3, 0xb1, 0xc5, 0x9a, + 0xe1, 0x9a, 0xb8, 0xc5, 0x9a, 0x33, 0xc4, 0x91, 0xc3, 0x9f, 0xc4, 0x86, 0x39, 0xc8, + 0x89, 0xc7, 0xa9, 0xc3, 0x9b, 0xc7, 0x92, 0xce, 0x89, 0x63, 0xc6, 0x93, 0xc6, 0x90, + 0xc2, 0xb6, 0xc5, 0x8f, 0xc8, 0x91, 0xc2, 0xab, 0xe1, 0x9a, 0xbc, 0xe2, 0xb1, 0xa4, + 0xc3, 0xb1, 0xc5, 0xaf, 0xe1, 0x9b, 0x84, 0xc5, 0xb5, 0xc5, 0x80, 0xe2, 0xb1, 0xa0, + 0x68, 0xc5, 0xa2, 0x26, 0xe1, 0x9a, 0xa1, 0xc4, 0x87, 0xc4, 0x9d, 0xc4, 0x9f, 0xc5, + 0x8b, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0x8d, 0xe1, 0x9a, 0xbd, 0xce, 0x88, 0xc9, 0x81, + 0xc7, 0x92, 0xe1, 0x9b, 0x9b, 0xc3, 0xb8, 0xc2, 0xab, 0x39, 0xe1, 0x9b, 0x9f, 0xc5, + 0xb4, 0xc5, 0xb3, 0xce, 0x86, 0xc8, 0x8d, 0xe1, 0x9b, 0x9b, 0xc5, 0xba, 0x38, 0xc6, + 0x84, 0xc8, 0xbf, 0xc6, 0xa2, 0xc8, 0x96, 0xc7, 0x8b, 0xc7, 0xbe, 0xc4, 0x97, 0xc8, + 0xb9, 0xc6, 0xb3, 0xc3, 0xbb, 0xc4, 0x8f, 0xc9, 0x86, 0xc5, 0x85, 0xc7, 0x9b, 0x7c, + 0xe2, 0xb1, 0xa0, 0xc7, 0xb2, 0xc8, 0x9c, 0xc5, 0xa8, 0xc2, 0xa8, 0xe1, 0x9a, 0xb6, + 0xc4, 0xaf, 0xc3, 0x8e, 0xc8, 0xbf, 0xc4, 0xa9, 0xc3, 0x95, 0xe1, 0x9b, 0x80, 0xc4, + 0xb7, 0xc8, 0x88, 0xc8, 0x80, 0xc5, 0xaf, 0xe1, 0x9a, 0xa4, 0xc7, 0x96, 0xc3, 0xb0, + 0xc4, 0xa2, 0x7c, 0xcd, 0xb6, 0xc7, 0x95, 0x4e, 0xc9, 0x86, 0xc2, 0xb0, 0xc3, 0xbb, + 0xc7, 0x8b, 0xc4, 0xb3, 0xe2, 0xb1, 0xaa, 0xe1, 0x9b, 0x8f, 0xc7, 0x84, 0xe1, 0x9a, + 0xaf, 0xc4, 0x92, 0xc7, 0x97, 0x34, 0xc2, 0xbe, 0xe1, 0x9b, 0x96, 0xc4, 0x9d, 0xc6, + 0xab, 0xe1, 0x9b, 0xa8, 0x4b, 0xc3, 0x86, 0xc7, 0x97, 0xc4, 0xa7, 0xc3, 0xbb, 0xc8, + 0x90, 0x48, 0xe1, 0x9b, 0x9a, 0xc6, 0x9d, 0xe1, 0x9b, 0x9b, 0xc4, 0xbb, 0xc3, 0x8f, + 0xc7, 0xb8, 0xc8, 0x9d, 0xc6, 0xac, 0xc6, 0xa5, 0xc6, 0x9e, 0xc7, 0x83, 0xc3, 0x97, + 0xc8, 0xae, 0xc3, 0xaf, 0xc3, 0xb4, 0xc5, 0xab, 0xc4, 0x81, 0xe1, 0x9b, 0xa0, 0xc3, + 0x85, 0xc4, 0x84, 0x7c, 0x21, 0xc2, 0xb4, 0xc9, 0x8b, 0xc9, 0x8b, 0xc8, 0x9c, 0xc7, + 0x8f, 0xe2, 0xb1, 0xab, 0xe1, 0x9a, 0xbc, 0xc7, 0x8b, 0xc6, 0xa0, 0xc6, 0xb2, 0xc9, + 0x82, 0xc5, 0x8c, 0xe2, 0xb1, 0xb7, 0xc7, 0x8d, 0xc5, 0xa9, 0xc4, 0xbd, 0xc6, 0x8f, + 0xc4, 0x83, 0xc6, 0x80, 0xe1, 0x9b, 0xa7, 0xc8, 0x94, 0xc5, 0x8e, 0xc6, 0x9e, 0x4a, + 0x62, 0x70, 0xe1, 0x9a, 0xa5, 0xe2, 0xb1, 0xba, 0xc3, 0x8f, 0xc3, 0x85, 0xc4, 0x82, + 0xc7, 0xbc, 0xce, 0x85, 0x77, 0xc2, 0xb2, 0xc8, 0x89, 0xe1, 0x9a, 0xa2, 0xc5, 0xac, + 0xc5, 0x9e, 0xcd, 0xb5, 0xc6, 0x83, 0xc6, 0x93, 0xc8, 0x9d, 0xe1, 0x9a, 0xa2, 0xe1, + 0x9b, 0xa8, 0xc2, 0xa2, 0xe1, 0x9a, 0xa5, 0xcd, 0xb3, 0xc4, 0xb8, 0x3c, 0xc6, 0xb5, + 0xc3, 0x8c, 0xc3, 0x90, 0xc3, 0xa4, 0xc7, 0x83, 0xc4, 0xb4, 0xc7, 0x93, 0xc5, 0xa3, + 0xc6, 0xa6, 0x25, 0xc5, 0xbf, 0x7d, 0xc6, 0xa3, 0x46, 0xc3, 0xa6, 0xc6, 0x9b, 0xc7, + 0xbc, 0xc6, 0x81, 0xc2, 0xba, 0xc7, 0xa7, 0x60, ], - asset_id: [ - 0xe2, 0xc6, 0x6a, 0x5e, 0x81, 0xaf, 0x85, 0x65, 0x05, 0x7c, 0x42, 0xab, 0x5a, 0x5b, - 0x5b, 0xb8, 0xc3, 0xca, 0x18, 0x13, 0xbe, 0x45, 0x76, 0xd8, 0xea, 0xe8, 0xb2, 0x50, - 0xfd, 0xe9, 0xfd, 0x95, + asset_base: [ + 0xd4, 0x7d, 0x06, 0xf8, 0x2f, 0x2d, 0x15, 0x8a, 0xee, 0xf7, 0x02, 0x8a, 0x1d, 0xb5, + 0xf3, 0xa1, 0xd1, 0x25, 0x0e, 0x2c, 0xfa, 0x28, 0x94, 0x44, 0x1d, 0x86, 0xee, 0xc4, + 0x7a, 0xbf, 0xbd, 0xb5, ], }, TestVector { @@ -219,48 +219,48 @@ pub(crate) fn test_vectors() -> Vec { 0x1f, 0xbd, 0x81, 0x30, ], description: [ - 0xe1, 0x9a, 0xa5, 0xe1, 0x9a, 0xb5, 0xc7, 0xb1, 0x2b, 0x72, 0xc6, 0x83, 0xc3, 0x82, - 0xe1, 0x9b, 0x8e, 0x34, 0xe1, 0x9b, 0x98, 0x3c, 0xc2, 0xa5, 0xc8, 0xbe, 0x2c, 0xc3, - 0x82, 0xc3, 0xa4, 0xe2, 0xb1, 0xa3, 0xc5, 0xab, 0xc3, 0xb4, 0xc7, 0xb8, 0xc2, 0xa2, - 0xc6, 0x86, 0xc6, 0xad, 0xc3, 0x9a, 0xc5, 0x93, 0xc7, 0xa3, 0xc2, 0xb7, 0xc6, 0x9a, - 0x5f, 0x55, 0xc9, 0x8c, 0xc9, 0x89, 0x58, 0xc6, 0x95, 0xe1, 0x9a, 0xba, 0xc7, 0x80, - 0xc2, 0xb4, 0xe1, 0x9b, 0x9b, 0xc4, 0x90, 0xe1, 0x9b, 0x8b, 0xe1, 0x9a, 0xae, 0xc8, - 0x92, 0xe1, 0x9b, 0xa8, 0xe2, 0xb1, 0xb2, 0xcd, 0xbd, 0xc3, 0x98, 0xe1, 0x9a, 0xba, - 0xe1, 0x9a, 0xb0, 0x48, 0xc6, 0xa4, 0x2f, 0xc5, 0x9d, 0xe1, 0x9b, 0x86, 0xe1, 0x9a, - 0xb5, 0x7c, 0xc5, 0xa5, 0xe1, 0x9a, 0xba, 0xc4, 0x86, 0xc8, 0xa6, 0xc6, 0xa6, 0xc6, - 0x84, 0xc3, 0xbb, 0xc5, 0xbe, 0x6e, 0xe1, 0x9b, 0xa6, 0xc5, 0x95, 0xe1, 0x9b, 0xaa, - 0xc7, 0xb7, 0xe2, 0xb1, 0xbd, 0xce, 0x8c, 0xc3, 0xa6, 0xc6, 0x9e, 0xc4, 0xb5, 0xe1, - 0x9a, 0xa4, 0xc3, 0xa8, 0xc7, 0x9c, 0xc4, 0x82, 0xc2, 0xa6, 0x31, 0xc3, 0xa6, 0xe2, - 0xb1, 0xae, 0xc7, 0xbb, 0x26, 0xc7, 0xa0, 0xc5, 0x9d, 0xc5, 0xb9, 0xe1, 0x9a, 0xb4, - 0xe1, 0x9b, 0xad, 0xc7, 0x88, 0x30, 0x42, 0xc6, 0x9f, 0xc3, 0x9b, 0x25, 0xc4, 0x9c, - 0xce, 0x87, 0xc5, 0x9c, 0xc5, 0x8c, 0xe1, 0x9b, 0x81, 0xce, 0x89, 0xc4, 0x9a, 0xc5, - 0xa7, 0xe1, 0x9a, 0xa9, 0xc3, 0x93, 0xc7, 0x9b, 0xc3, 0x8d, 0xc3, 0xbe, 0xc3, 0x93, - 0xc8, 0xbc, 0xc8, 0xb3, 0xc5, 0xaf, 0xc7, 0xb3, 0xe1, 0x9a, 0xa7, 0xc4, 0x80, 0xc4, - 0x80, 0xcd, 0xb2, 0xc7, 0x82, 0xc4, 0x83, 0xc7, 0x88, 0xc6, 0x84, 0xe1, 0x9b, 0x90, - 0xc3, 0xa4, 0xc3, 0xbc, 0xc5, 0xad, 0xc6, 0x8b, 0xc2, 0xac, 0xc4, 0xa1, 0xc3, 0xae, - 0xce, 0x86, 0xe1, 0x9b, 0x94, 0xc5, 0x9e, 0xc6, 0x92, 0xe1, 0x9b, 0xac, 0xc3, 0x8d, - 0xc5, 0xb9, 0xc3, 0x82, 0xc8, 0x81, 0xe2, 0xb1, 0xbb, 0xc8, 0xa0, 0xc2, 0xbd, 0xc5, - 0xa2, 0xc6, 0x86, 0xc3, 0xb7, 0xe1, 0x9a, 0xad, 0xc5, 0xbc, 0x2c, 0x51, 0xe1, 0x9a, - 0xab, 0xe1, 0x9b, 0x99, 0x77, 0xc3, 0x9c, 0xc6, 0x9c, 0x31, 0x60, 0xc5, 0x8e, 0xc3, - 0xb5, 0xc3, 0x85, 0xe1, 0x9b, 0xad, 0xc9, 0x8f, 0xc4, 0x8b, 0xc5, 0x93, 0xc2, 0xa2, - 0xc6, 0x8a, 0xe1, 0x9a, 0xa3, 0x4a, 0xc3, 0x9e, 0x30, 0xc8, 0xae, 0xc7, 0xbc, 0xcd, - 0xb3, 0xc7, 0x94, 0xe1, 0x9b, 0x93, 0xc3, 0x93, 0xc3, 0xaa, 0xc4, 0xad, 0xc8, 0x91, - 0xc5, 0xac, 0xe1, 0x9b, 0xa6, 0x26, 0x74, 0xc6, 0xbd, 0xe1, 0x9b, 0xa3, 0xc9, 0x8e, - 0xc8, 0x94, 0xc5, 0xad, 0xc6, 0xac, 0xc6, 0xb7, 0xc7, 0xa5, 0xc3, 0xa5, 0xc8, 0xb4, - 0xc6, 0x95, 0xc8, 0x93, 0xc8, 0xbc, 0xc8, 0xb9, 0xe1, 0x9b, 0x86, 0xc3, 0xb2, 0xc2, - 0xb5, 0xc5, 0x92, 0xe1, 0x9b, 0xa2, 0xe2, 0xb1, 0xb2, 0xc8, 0x80, 0xc4, 0x90, 0xe1, - 0x9a, 0xb9, 0xe2, 0xb1, 0xa7, 0xc5, 0xab, 0xc5, 0xa6, 0xc6, 0xaa, 0xc5, 0x98, 0xc4, - 0xb0, 0xc7, 0xb0, 0xe1, 0x9a, 0xbe, 0xe1, 0x9a, 0xaa, 0xc5, 0xb7, 0xc4, 0x96, 0xc7, - 0xa1, 0xc6, 0xbc, 0xe1, 0x9a, 0xb5, 0xc3, 0x87, 0xc8, 0xa5, 0x73, 0xc3, 0x84, 0xc4, - 0xa6, 0xc6, 0x9d, 0xc5, 0xa9, 0xc5, 0xaa, 0xc7, 0xa6, 0xc6, 0x9e, 0xc8, 0xbc, 0xe1, - 0x9a, 0xbf, 0xc6, 0xa3, 0xc3, 0x99, 0xc5, 0x97, 0xe2, 0xb1, 0xa0, 0xc4, 0x9e, 0x74, - 0xc4, 0x90, 0xc6, 0xa0, 0xe1, 0x9b, 0xaa, 0xc7, 0xaf, 0xc5, 0x8c, 0xc4, 0x91, 0xc7, - 0x93, 0xe1, 0x9b, 0xa3, 0xc5, 0xbd, 0xc8, 0xa3, + 0xc5, 0x99, 0xc2, 0xa5, 0xc6, 0xb8, 0x6d, 0xc5, 0xa7, 0xc7, 0xbd, 0xc4, 0xa0, 0xe1, + 0x9b, 0xa7, 0xc8, 0xba, 0xc9, 0x81, 0x7d, 0x36, 0xc5, 0x80, 0x52, 0xcd, 0xb5, 0xc5, + 0xba, 0xc2, 0xbb, 0x6d, 0xe2, 0xb1, 0xb1, 0xc5, 0xa8, 0xc5, 0x8c, 0x38, 0x47, 0xc9, + 0x87, 0x7c, 0x43, 0xc3, 0x96, 0xc6, 0x87, 0xc7, 0xbf, 0xc4, 0x9b, 0xe1, 0x9b, 0x98, + 0xc7, 0x94, 0xe1, 0x9b, 0x9b, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, 0xbf, 0x35, 0xc7, 0xba, + 0xc8, 0x82, 0xc4, 0x80, 0xc6, 0xbf, 0xc7, 0xba, 0xc4, 0xbd, 0xc4, 0x81, 0xe2, 0xb1, + 0xbc, 0xe1, 0x9a, 0xad, 0xe1, 0x9a, 0xab, 0xc5, 0xab, 0xc5, 0xba, 0xc6, 0xa8, 0x3b, + 0xc6, 0x98, 0xc7, 0x8c, 0xc8, 0x9e, 0xc2, 0xbe, 0xc6, 0x8b, 0xc7, 0x9c, 0xc8, 0xb4, + 0x3f, 0xc5, 0xb8, 0xc4, 0xb7, 0xc8, 0xb2, 0xc6, 0x86, 0xc3, 0xa1, 0xc7, 0x9b, 0x5c, + 0xe1, 0x9a, 0xa6, 0xe1, 0x9b, 0xac, 0xc7, 0x8c, 0xc6, 0xa7, 0x53, 0xc6, 0xa5, 0xc7, + 0x90, 0xe1, 0x9b, 0x85, 0xc8, 0x94, 0xcd, 0xb1, 0xc6, 0x99, 0xc4, 0xa8, 0xc7, 0xb3, + 0xe1, 0x9a, 0xb1, 0x7b, 0xc2, 0xb1, 0xe1, 0x9b, 0x94, 0x36, 0xc9, 0x8d, 0xc2, 0xa2, + 0x73, 0xc5, 0x80, 0xc5, 0x8d, 0xc8, 0x84, 0xc7, 0xa6, 0xc9, 0x85, 0xc4, 0xbd, 0xc7, + 0xb8, 0xc8, 0xb0, 0xc4, 0x83, 0xc3, 0xb8, 0xcd, 0xb1, 0x77, 0xc3, 0xa6, 0xc6, 0x80, + 0xc4, 0x83, 0xc8, 0x8e, 0xc9, 0x87, 0xc7, 0xb4, 0xc5, 0xb8, 0xc5, 0x99, 0xe2, 0xb1, + 0xaa, 0xc6, 0xb6, 0xc4, 0xa3, 0xc6, 0xb4, 0xc6, 0x8d, 0xe2, 0xb1, 0xa3, 0xe1, 0x9a, + 0xaa, 0xe1, 0x9a, 0xb8, 0xc3, 0x92, 0x63, 0xcd, 0xb4, 0xc7, 0x91, 0xc8, 0x83, 0xc3, + 0xaf, 0xcd, 0xb2, 0xc7, 0x9b, 0x5a, 0xe1, 0x9b, 0x82, 0xc6, 0x87, 0xc8, 0x91, 0xc5, + 0x83, 0xc5, 0xa8, 0xc4, 0x85, 0xe1, 0x9b, 0xab, 0xe1, 0x9b, 0x9f, 0x39, 0xc6, 0xbc, + 0x64, 0xc5, 0x98, 0xe1, 0x9b, 0x9f, 0xc8, 0xab, 0xe1, 0x9a, 0xb4, 0xc4, 0x83, 0xe2, + 0xb1, 0xb2, 0xe2, 0xb1, 0xa8, 0x5e, 0xc8, 0x93, 0xc4, 0xb3, 0xe1, 0x9b, 0xa6, 0xc5, + 0x93, 0xe1, 0x9b, 0x86, 0xc3, 0x98, 0xc2, 0xbd, 0xc7, 0x9a, 0xe1, 0x9a, 0xb2, 0xc7, + 0x8a, 0x73, 0xc7, 0x96, 0xe2, 0xb1, 0xb0, 0xcd, 0xbc, 0xc7, 0xb8, 0xc7, 0x95, 0xc4, + 0xa7, 0xe2, 0xb1, 0xb4, 0xc5, 0xa6, 0xc4, 0xa6, 0xe1, 0x9a, 0xa1, 0xc4, 0xbd, 0xc2, + 0xa2, 0xc5, 0x96, 0xe1, 0x9b, 0x89, 0xe1, 0x9b, 0x8e, 0xe2, 0xb1, 0xab, 0xc8, 0x8e, + 0x24, 0xcd, 0xb7, 0xc5, 0xab, 0xc8, 0x97, 0xce, 0x86, 0xc3, 0xac, 0x63, 0xc7, 0x97, + 0xc5, 0x81, 0xc6, 0x8b, 0xc4, 0xb7, 0xe2, 0xb1, 0xad, 0xc4, 0x8e, 0xc8, 0x98, 0xcd, + 0xbc, 0xe1, 0x9a, 0xbb, 0xc5, 0xb8, 0xc4, 0x9d, 0x28, 0xc6, 0x87, 0xe1, 0x9b, 0x9d, + 0xe1, 0x9b, 0x93, 0xc3, 0xbb, 0xc7, 0x8f, 0x74, 0xc8, 0x9e, 0xce, 0x88, 0xc7, 0x9c, + 0xc8, 0x9d, 0xc9, 0x80, 0xc4, 0xbf, 0xc7, 0xad, 0xc3, 0x97, 0xe2, 0xb1, 0xad, 0x2e, + 0xc6, 0xb7, 0x40, 0xc3, 0xb7, 0xc3, 0xaf, 0xe1, 0x9a, 0xbe, 0xc7, 0x88, 0xc4, 0x8a, + 0xc3, 0x81, 0xc5, 0x97, 0xc8, 0x93, 0xc8, 0xb8, 0xe1, 0x9a, 0xa8, 0xc3, 0x9e, 0xc8, + 0xb1, 0xc8, 0xaa, 0x5c, 0xc6, 0xa4, 0xe1, 0x9b, 0x9d, 0xc2, 0xb6, 0xc8, 0x85, 0xc7, + 0x98, 0xc4, 0xb8, 0xc4, 0xa1, 0xc9, 0x81, 0xc5, 0x94, 0xc4, 0xa4, 0xc2, 0xa8, 0xc7, + 0xa7, 0xc5, 0xba, 0x5a, 0xcd, 0xb3, 0xe1, 0x9b, 0xa0, 0xc4, 0x83, 0xc6, 0x83, 0xc9, + 0x85, 0x45, 0xc3, 0xb5, 0xc7, 0x9f, 0xc5, 0x93, 0xc3, 0x90, 0xc7, 0x95, 0xc8, 0xb1, + 0xc7, 0x87, 0xc3, 0xb2, 0xc7, 0xb9, 0xc3, 0xa8, ], - asset_id: [ - 0x9e, 0xa8, 0x07, 0x5c, 0x02, 0xdf, 0xe4, 0x64, 0x18, 0x07, 0xe0, 0x7d, 0x2d, 0x8a, - 0x84, 0x6c, 0x1f, 0xfb, 0xaf, 0x66, 0x86, 0x85, 0x74, 0x5c, 0x04, 0x5a, 0xf9, 0xe3, - 0x6c, 0xbe, 0x91, 0xb9, + asset_base: [ + 0xa9, 0xa8, 0xef, 0x9a, 0x58, 0xbd, 0xab, 0xa1, 0x51, 0xcf, 0xc2, 0x58, 0x66, 0xca, + 0x40, 0x54, 0xd7, 0xac, 0xae, 0xbd, 0xde, 0x1a, 0xf7, 0xe9, 0xe4, 0x89, 0x6b, 0x43, + 0xc7, 0x18, 0xef, 0x9d, ], }, TestVector { @@ -270,48 +270,48 @@ pub(crate) fn test_vectors() -> Vec { 0x6a, 0xbc, 0x03, 0x33, ], description: [ - 0xc3, 0x92, 0xcd, 0xb4, 0xc2, 0xaa, 0xc2, 0xb7, 0x78, 0xc5, 0x8d, 0xc5, 0x8f, 0xc5, - 0x84, 0xe1, 0x9b, 0x9c, 0xc4, 0x8f, 0xc3, 0x9a, 0xc6, 0x8f, 0x42, 0xc4, 0x94, 0x50, - 0x3a, 0xc5, 0x9f, 0x60, 0xc8, 0xa5, 0x21, 0xc3, 0xa2, 0x3a, 0xe1, 0x9a, 0xb1, 0xc5, - 0x88, 0xc5, 0x81, 0xc6, 0x9d, 0xc7, 0x95, 0xc4, 0xa1, 0x55, 0x3f, 0x48, 0xc9, 0x8a, - 0xc4, 0x8d, 0xc3, 0xbf, 0xe1, 0x9b, 0x8e, 0xc6, 0x8e, 0xc4, 0xbb, 0xe1, 0x9b, 0x9f, - 0xe1, 0x9a, 0xb9, 0xc4, 0xb1, 0xe1, 0x9a, 0xb3, 0xe1, 0x9b, 0x9b, 0xc6, 0x84, 0xe1, - 0x9a, 0xac, 0x2b, 0x51, 0xc5, 0x99, 0xe1, 0x9a, 0xb3, 0xc3, 0xb8, 0xc6, 0x99, 0xc8, - 0x9b, 0xe1, 0x9a, 0xbc, 0xc8, 0xa4, 0xe1, 0x9b, 0x84, 0x6e, 0xc4, 0x83, 0x5e, 0xe1, - 0x9a, 0xa8, 0xc6, 0xad, 0xc5, 0x82, 0xc8, 0xa4, 0xc4, 0x8a, 0xe2, 0xb1, 0xab, 0xc6, - 0x89, 0xe1, 0x9b, 0x8c, 0xc8, 0x8d, 0xe1, 0x9a, 0xb2, 0xe2, 0xb1, 0xb1, 0xc5, 0x87, - 0xe2, 0xb1, 0xad, 0xc4, 0xab, 0x50, 0xc2, 0xb9, 0xc7, 0xae, 0xc5, 0x99, 0xc3, 0x8a, - 0xc3, 0xbc, 0xc4, 0xa9, 0xe1, 0x9b, 0xa6, 0xc8, 0x92, 0xc4, 0xa7, 0xc2, 0xbd, 0xc2, - 0xbb, 0xc8, 0xb2, 0xcd, 0xbd, 0xe1, 0x9b, 0xa0, 0xc2, 0xbe, 0x63, 0xc5, 0xae, 0x69, - 0xc4, 0x90, 0x2e, 0xc4, 0xb0, 0x53, 0xc3, 0x83, 0xc5, 0xa7, 0xc3, 0xb1, 0xc2, 0xb1, - 0xc6, 0x8a, 0xc8, 0x85, 0xc6, 0xb0, 0x46, 0xc2, 0xb6, 0xc9, 0x88, 0xc4, 0xa5, 0xc7, - 0xb9, 0xc5, 0xb5, 0xc8, 0x80, 0xc4, 0xa8, 0xc8, 0x87, 0xc5, 0x8d, 0xc4, 0x97, 0xc8, - 0x86, 0xc2, 0xa8, 0xc4, 0xa9, 0xc6, 0x99, 0xc3, 0x98, 0xc4, 0x97, 0xc8, 0xb1, 0xce, - 0x84, 0xe1, 0x9a, 0xb0, 0xc6, 0x86, 0xc4, 0x97, 0xc6, 0xab, 0xe2, 0xb1, 0xac, 0xc8, - 0xa5, 0xc8, 0xa9, 0xc5, 0x80, 0x65, 0x51, 0xc8, 0x87, 0xe1, 0x9b, 0x95, 0xc4, 0x88, - 0xe1, 0x9b, 0xb0, 0xc6, 0x9d, 0xc5, 0xa8, 0xc8, 0x8b, 0xc7, 0xb4, 0xc4, 0xb9, 0xc7, - 0xb2, 0xc4, 0xb4, 0xe1, 0x9b, 0x9c, 0xc2, 0xbb, 0xe2, 0xb1, 0xa9, 0xc4, 0xa7, 0xc7, - 0x86, 0xc8, 0xac, 0xe2, 0xb1, 0xb1, 0xe1, 0x9b, 0x81, 0x71, 0xc4, 0x8d, 0xc7, 0x97, - 0x33, 0xc3, 0x83, 0xc9, 0x8a, 0xc6, 0xb3, 0xc4, 0xb0, 0xc3, 0xb1, 0xe2, 0xb1, 0xac, - 0xe1, 0x9b, 0x91, 0xc6, 0x96, 0xc2, 0xb5, 0xc7, 0xac, 0x29, 0x6d, 0x36, 0xc6, 0x91, - 0xc4, 0xa8, 0xc4, 0xb1, 0xc7, 0x8d, 0xce, 0x8c, 0xc3, 0x88, 0x6b, 0xc7, 0xbd, 0xc7, - 0x98, 0xc8, 0x95, 0xc7, 0xa2, 0xe2, 0xb1, 0xa0, 0xc7, 0xa0, 0x46, 0x31, 0x2e, 0xc6, - 0x81, 0xc8, 0x96, 0xc8, 0x8f, 0xe1, 0x9b, 0x98, 0xc4, 0xb3, 0xc8, 0xb8, 0xe1, 0x9a, - 0xb2, 0xc8, 0x9e, 0xc5, 0x83, 0xc7, 0x87, 0xc6, 0xa1, 0xc2, 0xae, 0x43, 0xc8, 0xb3, - 0xc4, 0x89, 0xc3, 0x9e, 0xe1, 0x9b, 0x96, 0xc5, 0x84, 0x33, 0xc9, 0x87, 0x69, 0xce, - 0x88, 0xc8, 0xac, 0xc5, 0x87, 0xc5, 0x87, 0xe1, 0x9b, 0x8b, 0xc4, 0x89, 0xc5, 0xb0, - 0xc4, 0x9f, 0xe1, 0x9b, 0x97, 0xc7, 0xa8, 0xc8, 0xb3, 0xc7, 0x83, 0xc4, 0x91, 0xe1, - 0x9a, 0xba, 0xc7, 0x82, 0xc7, 0xb0, 0xc4, 0xbd, 0xc5, 0xab, 0xe1, 0x9b, 0xac, 0xe2, - 0xb1, 0xbe, 0xc4, 0x89, 0xc3, 0x8b, 0xe2, 0xb1, 0xae, 0xcd, 0xbe, 0xc4, 0x9b, 0xc4, - 0xab, 0xc6, 0xbc, 0xe1, 0x9b, 0xac, 0xc4, 0x84, 0xc5, 0x9f, 0xc7, 0xac, 0xc3, 0xba, - 0xc6, 0x83, 0xc3, 0x9b, 0xc6, 0xa6, 0xc6, 0xac, 0xc7, 0xb5, 0xc6, 0x8a, 0xc4, 0xbf, - 0xe2, 0xb1, 0xaa, 0xc3, 0x96, 0x42, 0xc4, 0x95, 0xc3, 0xa2, 0xc6, 0xa5, 0x5b, 0x2e, - 0xc3, 0xaf, 0xc3, 0x93, 0xc4, 0x9d, 0xc8, 0xa4, + 0x62, 0xc8, 0xbb, 0xc6, 0xb1, 0xc5, 0xa9, 0xc9, 0x8c, 0xc9, 0x8e, 0xc6, 0xb6, 0xc3, + 0x85, 0xc4, 0xb0, 0x70, 0xc2, 0xb9, 0x49, 0xc8, 0x9b, 0xe1, 0x9b, 0x91, 0x69, 0xc8, + 0xaf, 0xc6, 0x94, 0xc5, 0xa2, 0x24, 0xe1, 0x9a, 0xb3, 0xcd, 0xb3, 0xe1, 0x9a, 0xa1, + 0x62, 0x67, 0xc3, 0x9a, 0xc7, 0x84, 0xe1, 0x9b, 0xa2, 0xc9, 0x86, 0xc6, 0xab, 0xc5, + 0xad, 0xc8, 0xad, 0xc6, 0xbe, 0xc3, 0x84, 0xc4, 0xad, 0xc3, 0xbf, 0xe2, 0xb1, 0xb9, + 0xc8, 0x8c, 0xc5, 0xb7, 0xe1, 0x9b, 0xad, 0xc6, 0x87, 0xc3, 0xa8, 0xce, 0x88, 0xc2, + 0xa5, 0xc3, 0xa7, 0xc5, 0xb6, 0xc4, 0x82, 0xe1, 0x9a, 0xbf, 0xc5, 0xad, 0xc8, 0xb9, + 0xc8, 0xab, 0xc3, 0xb8, 0xc5, 0x85, 0xc3, 0xb4, 0xc3, 0xa4, 0xc4, 0xb0, 0xc9, 0x8b, + 0xc6, 0x9c, 0xc8, 0x94, 0xe1, 0x9b, 0xab, 0xc8, 0xaa, 0xe1, 0x9a, 0xab, 0xc4, 0xa2, + 0xc3, 0xbc, 0x68, 0xc5, 0x84, 0xc9, 0x8c, 0xc8, 0xa8, 0x39, 0xc7, 0xab, 0xe1, 0x9b, + 0x8d, 0x47, 0xe1, 0x9a, 0xa1, 0x26, 0xc4, 0x82, 0xe1, 0x9a, 0xb0, 0xc8, 0xb4, 0x50, + 0xc8, 0xab, 0xc7, 0x81, 0xe1, 0x9a, 0xb3, 0xc5, 0x81, 0xe1, 0x9b, 0x94, 0x3e, 0xc3, + 0xa1, 0x4e, 0xc4, 0xb7, 0xc5, 0xbf, 0xc4, 0xa2, 0x26, 0xc2, 0xb1, 0xc6, 0xb3, 0xc5, + 0xa6, 0xc4, 0xb2, 0xc5, 0x90, 0xc8, 0x92, 0xc5, 0xbe, 0xc5, 0xbb, 0xc8, 0xac, 0x3c, + 0xc4, 0x91, 0xc4, 0xac, 0xc6, 0x87, 0xc4, 0x94, 0xe1, 0x9a, 0xa7, 0xc9, 0x85, 0xe2, + 0xb1, 0xa3, 0xe1, 0x9b, 0xb0, 0xc6, 0xaf, 0x79, 0xe1, 0x9a, 0xad, 0xc9, 0x8e, 0xe1, + 0x9a, 0xa2, 0x23, 0xe2, 0xb1, 0xb7, 0xc4, 0xba, 0x45, 0xe1, 0x9a, 0xbe, 0xc7, 0xb7, + 0xc3, 0xa6, 0x5a, 0xce, 0x88, 0xc5, 0xa9, 0x46, 0x6a, 0xc3, 0xb5, 0xe1, 0x9b, 0xab, + 0xc2, 0xbe, 0xe2, 0xb1, 0xbf, 0xc6, 0x82, 0x66, 0x42, 0xc5, 0xb4, 0xc8, 0x85, 0xc4, + 0x97, 0xc2, 0xab, 0xc2, 0xa9, 0xc7, 0x8f, 0xc7, 0xb9, 0xe1, 0x9b, 0x8f, 0xc8, 0xb1, + 0xc7, 0xaf, 0xc9, 0x82, 0xc7, 0x8a, 0x38, 0xc2, 0xa3, 0xc4, 0xaf, 0xc4, 0xac, 0xc3, + 0x9b, 0xc7, 0xb9, 0x6d, 0xc7, 0xbf, 0xe1, 0x9a, 0xa1, 0xe1, 0x9b, 0xa4, 0xc6, 0xbe, + 0xc6, 0xa7, 0xc3, 0x8f, 0xe1, 0x9b, 0xa9, 0xc6, 0xb1, 0xce, 0x89, 0xc2, 0xb3, 0xc5, + 0x8f, 0xc6, 0x95, 0x52, 0xc8, 0x83, 0xc2, 0xb1, 0xc6, 0xb3, 0xc3, 0x87, 0xe1, 0x9b, + 0x84, 0xc6, 0xae, 0x32, 0xe1, 0x9b, 0x99, 0xcd, 0xb6, 0xc5, 0xbb, 0xc6, 0xa7, 0xc5, + 0xbd, 0xc6, 0x9f, 0xc8, 0x87, 0xc2, 0xbb, 0xc2, 0xbe, 0x5c, 0xc5, 0xb8, 0xc8, 0x8c, + 0xc8, 0x9c, 0xc2, 0xab, 0xe2, 0xb1, 0xac, 0x3e, 0xc6, 0xbc, 0x6b, 0xc2, 0xb2, 0xc7, + 0x95, 0xc6, 0xa0, 0xc3, 0xa6, 0xe2, 0xb1, 0xaf, 0xe1, 0x9b, 0xa8, 0xc6, 0xb1, 0xc5, + 0x81, 0xc5, 0x96, 0xc3, 0x99, 0xc8, 0x9b, 0x2c, 0xc4, 0x93, 0xe2, 0xb1, 0xbb, 0xc2, + 0xab, 0xc8, 0x92, 0xc2, 0xb9, 0xc4, 0xb5, 0xc7, 0x94, 0xc3, 0x94, 0xe1, 0x9a, 0xb0, + 0xc4, 0xae, 0xe1, 0x9b, 0x84, 0x30, 0xc7, 0x91, 0xc2, 0xa4, 0xc5, 0x9a, 0xc5, 0x92, + 0xc9, 0x8f, 0xe1, 0x9a, 0xb6, 0xe1, 0x9a, 0xaa, 0xc8, 0xb2, 0xc6, 0x9e, 0x30, 0xc4, + 0xae, 0x6f, 0x73, 0xc2, 0xa3, 0xc7, 0x8c, 0xe2, 0xb1, 0xb8, 0x57, 0xc9, 0x89, 0xe1, + 0x9b, 0x8c, 0x60, 0xc4, 0x88, 0xce, 0x87, 0x4c, 0xc4, 0xaa, 0xc4, 0xab, 0xc2, 0xae, + 0xc7, 0x8a, 0xc7, 0xad, 0xc4, 0x87, 0xc5, 0xb3, 0x5b, 0x68, 0xc4, 0x9a, 0xc4, 0x9c, + 0x3a, 0xc4, 0x8b, 0xe1, 0x9a, 0xb2, 0x2e, 0xc5, 0x9a, 0xc2, 0xb9, 0xe1, 0x9a, 0xa3, + 0xe1, 0x9b, 0x8b, 0xc8, 0xa9, 0xc6, 0x9d, 0x34, ], - asset_id: [ - 0x02, 0xce, 0x39, 0x82, 0x1e, 0x86, 0x41, 0xcd, 0x79, 0x5c, 0x1e, 0x41, 0xf7, 0x48, - 0x3c, 0x59, 0x88, 0x81, 0xb5, 0x0f, 0x88, 0xe7, 0x36, 0xcb, 0x4f, 0xb0, 0x00, 0xbc, - 0xf0, 0x28, 0x62, 0x2b, + asset_base: [ + 0x3e, 0x9f, 0x51, 0x16, 0x2c, 0xbf, 0x73, 0x86, 0x1a, 0xe5, 0xd7, 0xc5, 0x82, 0x4e, + 0x0e, 0x54, 0xac, 0x96, 0xe9, 0xd7, 0xa2, 0xcf, 0x5a, 0x76, 0x0b, 0xf2, 0x61, 0x21, + 0x93, 0xe5, 0x7a, 0x15, ], }, TestVector { @@ -321,48 +321,48 @@ pub(crate) fn test_vectors() -> Vec { 0x67, 0xb7, 0xc7, 0x18, ], description: [ - 0xc7, 0x84, 0xc3, 0xb8, 0xc7, 0xba, 0xc6, 0xbc, 0xc6, 0xa3, 0x28, 0xc5, 0xb4, 0xc7, - 0x8c, 0xc2, 0xba, 0xe1, 0x9b, 0xac, 0x3d, 0xc5, 0xb3, 0xc5, 0xbf, 0xc4, 0xb5, 0xce, - 0x8a, 0xc5, 0xab, 0xc7, 0xbe, 0xc7, 0xa0, 0xc4, 0x95, 0xe1, 0x9b, 0xa8, 0xc3, 0xab, - 0xc7, 0x99, 0xe1, 0x9a, 0xae, 0xcd, 0xb6, 0xe2, 0xb1, 0xb1, 0xc5, 0x8a, 0xe1, 0x9b, - 0xab, 0xc5, 0xaa, 0xc7, 0xb8, 0xc6, 0xb2, 0x48, 0xe1, 0x9b, 0x94, 0xc8, 0xb4, 0xc7, - 0x9e, 0xc8, 0x9b, 0x4f, 0xc7, 0xab, 0xc5, 0xa8, 0xc7, 0x9c, 0xc8, 0x9f, 0xc4, 0x8a, - 0xc8, 0x98, 0xe1, 0x9a, 0xa6, 0xc4, 0xb7, 0xc3, 0xb8, 0xe1, 0x9b, 0x97, 0xc7, 0xb6, - 0x57, 0xc4, 0xa0, 0xe1, 0x9b, 0x9f, 0xc5, 0x9a, 0xc2, 0xa7, 0x2c, 0xe1, 0x9a, 0xa4, - 0xc6, 0x84, 0xcd, 0xba, 0xc7, 0x90, 0xc4, 0xae, 0xc4, 0xaf, 0xc2, 0xb1, 0xce, 0x84, - 0xe1, 0x9a, 0xa0, 0xe1, 0x9b, 0xa9, 0xc4, 0xa0, 0xce, 0x86, 0xc3, 0x83, 0xc7, 0xab, - 0xcd, 0xb4, 0xc5, 0x83, 0xc8, 0xbd, 0xc8, 0x98, 0xce, 0x89, 0x73, 0xe1, 0x9a, 0xa6, - 0xc5, 0xa1, 0xc2, 0xa7, 0xc3, 0x81, 0xc9, 0x83, 0xc5, 0xbc, 0xc5, 0x9b, 0xc4, 0xbe, - 0x5f, 0xc6, 0xb8, 0xe1, 0x9b, 0x86, 0x74, 0xc3, 0xb4, 0x40, 0xc8, 0xbc, 0xc8, 0x93, - 0xc8, 0x9c, 0xc2, 0xa4, 0xe1, 0x9a, 0xb4, 0xc3, 0x98, 0xc5, 0x96, 0xe1, 0x9b, 0xa0, - 0x7c, 0xe2, 0xb1, 0xa0, 0xc4, 0xb2, 0xc2, 0xb7, 0xce, 0x85, 0xc3, 0x8c, 0xc2, 0xa2, - 0xc8, 0x9a, 0x4f, 0xc7, 0xae, 0xc4, 0xb5, 0xc7, 0x95, 0xc3, 0x8e, 0xc8, 0xa3, 0xe1, - 0x9a, 0xa3, 0xc3, 0xa7, 0xc7, 0xb7, 0xc6, 0xaa, 0xc6, 0xb6, 0xc8, 0xbb, 0xc2, 0xa9, - 0xe1, 0x9b, 0x8b, 0xc7, 0x9a, 0xc9, 0x84, 0xc3, 0xa2, 0x71, 0xc5, 0x83, 0xc3, 0x83, - 0xc8, 0x86, 0xcd, 0xb2, 0xc4, 0xa7, 0xe1, 0x9b, 0x80, 0x58, 0xc5, 0x96, 0xe2, 0xb1, - 0xb2, 0xe2, 0xb1, 0xbd, 0xc7, 0xbc, 0x4b, 0xcd, 0xbc, 0xc8, 0x88, 0xc4, 0x81, 0xc7, - 0xb8, 0xc4, 0x8f, 0xc8, 0x8d, 0x26, 0xc7, 0x92, 0xc3, 0xa0, 0xc5, 0x8c, 0xc5, 0xbd, - 0xc6, 0xb3, 0xc2, 0xa4, 0x67, 0xc8, 0x93, 0xc8, 0xac, 0xc9, 0x89, 0xc4, 0xbd, 0xc8, - 0x82, 0xe2, 0xb1, 0xa9, 0xe1, 0x9b, 0xa2, 0x79, 0x54, 0xe1, 0x9b, 0x94, 0xc7, 0x96, - 0xc8, 0xae, 0xc7, 0xba, 0xc8, 0xa3, 0xc6, 0xa3, 0xcd, 0xba, 0xc8, 0xa7, 0xc4, 0xa8, - 0x3b, 0xc7, 0xb9, 0xc6, 0x83, 0xc8, 0x98, 0xc2, 0xb0, 0xe1, 0x9a, 0xae, 0xc8, 0x8c, - 0xc3, 0xa3, 0xe1, 0x9a, 0xbd, 0x45, 0xc8, 0xb6, 0xc9, 0x80, 0x28, 0xe1, 0x9b, 0x81, - 0x2b, 0x6d, 0xc8, 0xb9, 0xc7, 0x80, 0xe2, 0xb1, 0xad, 0xc8, 0x8d, 0x6c, 0x7b, 0xc6, - 0x91, 0xc3, 0x93, 0xc8, 0xa9, 0xc7, 0xaf, 0xc5, 0x95, 0xe1, 0x9b, 0xa0, 0xc6, 0xbe, - 0x21, 0xc4, 0xac, 0xc4, 0xa8, 0xe1, 0x9a, 0xbe, 0xc9, 0x8e, 0xc3, 0x88, 0xc4, 0x9e, - 0xc4, 0xbe, 0xe1, 0x9b, 0x90, 0xc3, 0x99, 0xc7, 0x93, 0xc6, 0xa8, 0xe1, 0x9b, 0xa9, - 0xe1, 0x9b, 0xa5, 0xc7, 0xa4, 0xc6, 0x81, 0xe1, 0x9b, 0x9a, 0xc3, 0xa0, 0xc5, 0xab, - 0xc4, 0x86, 0xc8, 0xa4, 0x53, 0xce, 0x8c, 0xc9, 0x81, 0xc3, 0xb7, 0xc7, 0xaa, 0xc8, - 0x8a, 0xc3, 0xa9, 0x41, 0xe1, 0x9b, 0xaa, 0xcd, 0xb7, 0xc3, 0xac, 0xc3, 0xbf, 0xc8, - 0x8d, 0xc7, 0xa7, 0xc7, 0xa3, 0xe1, 0x9b, 0xa9, 0x5a, 0xc4, 0xb1, 0x68, 0xe2, 0xb1, - 0xbf, 0x2a, 0x5b, 0xc8, 0xb6, 0xc5, 0xa0, 0x39, 0xc4, 0x8b, 0xc8, 0xae, 0x6c, 0xe2, - 0xb1, 0xb5, 0xe1, 0x9b, 0x9b, 0xc5, 0x8c, 0xc5, 0x91, 0x68, 0xc6, 0xaf, 0xc9, 0x84, - 0x44, 0xc7, 0x93, 0xc2, 0xb5, 0xc8, 0x90, 0x67, + 0xc5, 0x94, 0xc5, 0xb4, 0xc2, 0xbd, 0xc6, 0xa4, 0xc6, 0x8e, 0xe1, 0x9b, 0x80, 0xc5, + 0x9c, 0xc4, 0xb5, 0xc3, 0x9f, 0xc7, 0x9b, 0xc6, 0xb2, 0xc2, 0xa8, 0xc8, 0xa2, 0xc3, + 0xad, 0x52, 0xc5, 0xa9, 0xc4, 0x87, 0xc3, 0xbf, 0x2e, 0xc4, 0x8c, 0xc5, 0x8c, 0xc4, + 0x88, 0xc2, 0xbf, 0xc7, 0xb0, 0xc9, 0x85, 0xc4, 0xa6, 0xc7, 0x99, 0xe1, 0x9b, 0x81, + 0x42, 0xc3, 0x8f, 0xc7, 0x8c, 0xe1, 0x9a, 0xa8, 0x2b, 0xc3, 0x9d, 0xc9, 0x87, 0xc4, + 0x89, 0xc6, 0x87, 0xc8, 0x8c, 0xc4, 0xbe, 0x51, 0xc5, 0xac, 0xc9, 0x81, 0xc3, 0xb7, + 0xc5, 0xb2, 0xe1, 0x9b, 0x87, 0xc6, 0xad, 0xc8, 0xa6, 0xc6, 0xad, 0xc6, 0x93, 0xc9, + 0x84, 0xc8, 0x85, 0x6f, 0x41, 0xc7, 0xb5, 0xe1, 0x9b, 0xa8, 0xc5, 0x89, 0xe2, 0xb1, + 0xa7, 0xc3, 0x9f, 0x64, 0xc7, 0x9e, 0x62, 0xc3, 0x95, 0xc7, 0xa1, 0xc6, 0x80, 0xc4, + 0xbb, 0xc2, 0xb1, 0x53, 0xc7, 0xb4, 0x63, 0xe1, 0x9b, 0x95, 0x21, 0xc5, 0xa2, 0xc4, + 0xa3, 0xc3, 0x9a, 0xc6, 0xbe, 0xc4, 0x93, 0xc5, 0xa5, 0xe1, 0x9b, 0x88, 0xc3, 0x85, + 0xc7, 0x9e, 0xc3, 0xbf, 0x48, 0xc5, 0x8a, 0xc3, 0xaf, 0x51, 0xc5, 0x9b, 0xe1, 0x9b, + 0xa3, 0xc4, 0xbf, 0xc5, 0x96, 0xe1, 0x9b, 0x97, 0xc7, 0x8c, 0xc7, 0xb0, 0x7b, 0xc6, + 0x94, 0x23, 0xe1, 0x9b, 0x86, 0xce, 0x86, 0xc4, 0x85, 0xc5, 0x94, 0xc5, 0x9f, 0xc7, + 0x84, 0xc3, 0xb1, 0xc6, 0x8a, 0xc8, 0x97, 0xc3, 0x81, 0xe2, 0xb1, 0xaf, 0xc7, 0xbf, + 0xc2, 0xa6, 0xc6, 0xbf, 0xc4, 0xbe, 0xcd, 0xb6, 0xc3, 0xb6, 0xc9, 0x8c, 0xc7, 0x86, + 0xc5, 0x9a, 0xc3, 0x9d, 0xc3, 0x91, 0xc8, 0xb9, 0xc4, 0x9c, 0xc4, 0x89, 0xc3, 0x99, + 0x70, 0xe1, 0x9b, 0x83, 0xc8, 0x97, 0xc8, 0xaf, 0xc3, 0xa3, 0xe2, 0xb1, 0xbd, 0xe2, + 0xb1, 0xb8, 0xc7, 0x8c, 0xc7, 0xa5, 0x5c, 0xc6, 0xb2, 0xc2, 0xa9, 0xc7, 0xb9, 0xe1, + 0x9b, 0x88, 0xc5, 0xbc, 0xc5, 0x83, 0xc7, 0x90, 0xc6, 0x91, 0xc7, 0xa3, 0x30, 0xe1, + 0x9a, 0xb9, 0xe2, 0xb1, 0xbe, 0xe1, 0x9b, 0xa0, 0x4c, 0xe1, 0x9b, 0x93, 0xc5, 0x93, + 0xc8, 0xb8, 0xc6, 0x98, 0xc3, 0xb2, 0xc6, 0xbf, 0xe1, 0x9b, 0xa6, 0xc5, 0x84, 0xe1, + 0x9b, 0x91, 0xc6, 0xb2, 0xc5, 0x94, 0xc4, 0x93, 0xe1, 0x9b, 0x98, 0xcd, 0xb6, 0xc6, + 0xae, 0x60, 0xc5, 0xa4, 0xc6, 0x81, 0x46, 0xc6, 0x86, 0xc4, 0xa1, 0x33, 0xc6, 0xb2, + 0x71, 0xc6, 0xae, 0xe2, 0xb1, 0xb9, 0x3d, 0x35, 0xe1, 0x9b, 0x9e, 0x62, 0xc8, 0x93, + 0x61, 0xc4, 0x90, 0xe1, 0x9b, 0x8c, 0xe1, 0x9b, 0x9d, 0x35, 0xe1, 0x9b, 0xae, 0xc9, + 0x83, 0xc7, 0x8d, 0xe1, 0x9a, 0xa6, 0xe1, 0x9a, 0xb9, 0xc3, 0x86, 0xc8, 0x9e, 0xc8, + 0xa8, 0xc9, 0x8f, 0xcd, 0xbe, 0xc8, 0xbe, 0xc5, 0x94, 0x63, 0x67, 0xc2, 0xa7, 0xc8, + 0xbf, 0xe2, 0xb1, 0xb2, 0xc3, 0x80, 0x32, 0xc6, 0xac, 0xe1, 0x9a, 0xbc, 0xc3, 0xa6, + 0xc3, 0x96, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb2, 0x4c, 0xe1, 0x9b, 0xac, 0xc8, 0xac, + 0xc3, 0xb7, 0xc3, 0x8d, 0x79, 0xc3, 0x9b, 0xc9, 0x8c, 0xcd, 0xbc, 0xc5, 0x9c, 0xe1, + 0x9b, 0xb0, 0xe1, 0x9b, 0x9a, 0x7c, 0xc7, 0xb6, 0xc6, 0xbc, 0xc4, 0x88, 0xe1, 0x9a, + 0xb0, 0xc7, 0x83, 0xc4, 0x9c, 0xe1, 0x9b, 0x82, 0xc5, 0xad, 0xc8, 0xac, 0xe1, 0x9b, + 0xa7, 0x7c, 0xc8, 0x8e, 0xc2, 0xbc, 0xc6, 0x91, 0xc7, 0xbb, 0xc6, 0x83, 0xc5, 0x92, + 0xc5, 0x8e, 0x73, 0xcd, 0xb3, 0xe1, 0x9a, 0xbc, 0x40, 0x61, 0xc6, 0x98, 0xe2, 0xb1, + 0xa9, 0xce, 0x8a, 0xc7, 0xb2, 0x60, 0xc4, 0xb7, 0xc8, 0x83, 0xc6, 0xaa, 0xc7, 0xb5, + 0xc6, 0xbf, 0x41, 0xc7, 0xaf, 0xc6, 0x89, 0x5a, ], - asset_id: [ - 0x7a, 0x8e, 0xea, 0x55, 0xfb, 0xde, 0x77, 0x4d, 0x8a, 0x7a, 0x5c, 0x01, 0xfa, 0x8e, - 0xbc, 0x8c, 0x57, 0x5f, 0xf9, 0x33, 0xd9, 0xd1, 0x51, 0x9b, 0x62, 0xf3, 0x18, 0xf4, - 0x8c, 0xa2, 0xab, 0x94, + asset_base: [ + 0xf1, 0x2e, 0x1e, 0x6c, 0xdd, 0x2a, 0xdb, 0x59, 0x2a, 0x2b, 0xe1, 0x2c, 0x09, 0x18, + 0x31, 0x10, 0xc7, 0x39, 0x0b, 0x80, 0xf3, 0x7b, 0xba, 0x6c, 0x6f, 0x6f, 0xe2, 0x06, + 0xf6, 0xf6, 0x67, 0xac, ], }, TestVector { @@ -372,48 +372,48 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0x22, 0xdf, 0x08, ], description: [ - 0xc6, 0x81, 0xc4, 0x90, 0xe1, 0x9a, 0xa0, 0xe1, 0x9b, 0x8c, 0x40, 0xc8, 0x8d, 0xc7, - 0xaf, 0xcd, 0xb2, 0xc5, 0xae, 0xc7, 0xb1, 0xce, 0x84, 0xc2, 0xb6, 0xc7, 0x99, 0xe1, - 0x9a, 0xb4, 0xe1, 0x9b, 0xaf, 0xc6, 0x93, 0xc9, 0x83, 0x37, 0xe2, 0xb1, 0xb1, 0xc4, - 0x98, 0xe1, 0x9b, 0xa7, 0xc8, 0x8f, 0xc3, 0x83, 0xc3, 0x82, 0xc4, 0x98, 0xc7, 0x9c, - 0xc2, 0xae, 0xc8, 0x9a, 0xcd, 0xb5, 0xc3, 0xac, 0xc6, 0x9c, 0xc8, 0xab, 0xc6, 0xbd, - 0x71, 0xc4, 0xaf, 0xe1, 0x9a, 0xa0, 0xe1, 0x9a, 0xb1, 0x23, 0xc5, 0xa8, 0xc4, 0xb9, - 0x45, 0xe1, 0x9b, 0xa8, 0xc6, 0xb0, 0xc4, 0xa0, 0xc8, 0xa7, 0xe1, 0x9b, 0x9b, 0xc6, - 0xa7, 0x79, 0xc7, 0xa8, 0xc7, 0xa1, 0xc7, 0xbd, 0xc3, 0xa1, 0xe2, 0xb1, 0xa2, 0xc3, - 0x82, 0xc6, 0xa7, 0xc4, 0x9d, 0xc7, 0xbb, 0x64, 0xc2, 0xb0, 0xc4, 0x91, 0xe1, 0x9a, - 0xbe, 0xc7, 0xaf, 0xe2, 0xb1, 0xaa, 0xc8, 0xa3, 0xe2, 0xb1, 0xbe, 0x3f, 0xc8, 0xa7, - 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0x88, 0xc8, 0xa0, 0xc8, 0x96, 0x28, 0xc6, 0xb7, 0xc7, - 0xa2, 0xc6, 0x99, 0x66, 0xc8, 0x8c, 0xc3, 0x93, 0xc5, 0x8b, 0xc8, 0xa2, 0xc5, 0x91, - 0xe2, 0xb1, 0xa6, 0xc3, 0xbd, 0xc3, 0xa4, 0xc6, 0x86, 0xe1, 0x9b, 0xa4, 0xc3, 0xbe, - 0xc4, 0xbf, 0xc9, 0x88, 0xc6, 0x97, 0xcd, 0xb5, 0xc4, 0xb1, 0xc7, 0x92, 0xc3, 0x86, - 0xc5, 0x80, 0xc5, 0x9c, 0xc5, 0x92, 0xc3, 0x80, 0xe1, 0x9a, 0xbd, 0xc6, 0x84, 0x46, - 0xc6, 0xb6, 0xc6, 0x87, 0xc4, 0x95, 0xc3, 0xbe, 0xc3, 0xbc, 0xc2, 0xaf, 0xc2, 0xa9, - 0xe1, 0x9a, 0xa1, 0xc3, 0xa4, 0xe1, 0x9b, 0xaf, 0xc5, 0x8f, 0xe1, 0x9b, 0x98, 0xc5, - 0x91, 0x55, 0xc3, 0x99, 0xc8, 0xbf, 0xc7, 0xb4, 0x63, 0xc5, 0xa0, 0xc8, 0xa1, 0xe2, - 0xb1, 0xb7, 0xc3, 0xaf, 0xc5, 0x8c, 0xc8, 0xab, 0xc8, 0x8b, 0x3c, 0xc3, 0x8d, 0xc6, - 0x80, 0xc8, 0xa1, 0xc7, 0xb9, 0xc3, 0xbf, 0xc2, 0xa4, 0x4f, 0xc8, 0x82, 0xe2, 0xb1, - 0xa8, 0xc2, 0xbd, 0x78, 0xe1, 0x9b, 0xac, 0xc5, 0x90, 0xc3, 0x94, 0xc3, 0xb8, 0xc7, - 0xb7, 0xc3, 0x84, 0xe2, 0xb1, 0xaf, 0xc6, 0x88, 0xc7, 0x83, 0xc9, 0x8d, 0xc5, 0x9f, - 0x78, 0xc3, 0xbb, 0xe2, 0xb1, 0xa7, 0xe2, 0xb1, 0xbc, 0xc5, 0x8d, 0xc6, 0xbd, 0xe2, - 0xb1, 0xa5, 0xc4, 0x94, 0xc7, 0x91, 0xc8, 0x97, 0x63, 0xc3, 0x99, 0xc2, 0xb6, 0xc7, - 0x99, 0xe1, 0x9a, 0xa2, 0xc7, 0xa0, 0xc8, 0xa6, 0xcd, 0xbc, 0xc6, 0x86, 0xe2, 0xb1, - 0xb5, 0x42, 0xc2, 0xa1, 0xc8, 0x97, 0xc8, 0xa6, 0xc5, 0x98, 0xc4, 0xba, 0xc4, 0x88, - 0xc3, 0x80, 0x59, 0xc8, 0xa0, 0xc6, 0xa7, 0xc4, 0xb5, 0xc8, 0x8e, 0xc3, 0xa1, 0x7c, - 0xc6, 0xae, 0xc2, 0xaa, 0x7c, 0xc8, 0xaa, 0xc2, 0xb8, 0xc4, 0xa9, 0xc7, 0xa8, 0xc3, - 0x98, 0xc9, 0x82, 0xc8, 0x87, 0xc3, 0x98, 0xc5, 0x9d, 0xc9, 0x8b, 0xc4, 0x87, 0xce, - 0x86, 0xc8, 0x96, 0xc2, 0xa5, 0x66, 0xe2, 0xb1, 0xbb, 0xc4, 0x9f, 0xc7, 0xaa, 0xc8, - 0x93, 0xc4, 0xbe, 0xe2, 0xb1, 0xac, 0x5c, 0xc3, 0x8f, 0x44, 0xcd, 0xb4, 0x53, 0x31, - 0xc8, 0xaf, 0xc2, 0xbd, 0xc4, 0x85, 0xc4, 0xa1, 0xc5, 0xaf, 0xc8, 0xa2, 0xc8, 0x95, - 0xc6, 0x95, 0xe1, 0x9b, 0xac, 0xc4, 0x95, 0x2b, 0x4e, 0x78, 0xc5, 0xbf, 0xc7, 0x89, - 0xc7, 0x9c, 0xc3, 0x9b, 0x72, 0xcd, 0xbc, 0xc8, 0x93, 0xc6, 0x93, 0xc3, 0xa5, 0x66, - 0xe1, 0x9a, 0xbf, 0xc3, 0xa6, 0xc5, 0x84, 0xc4, 0xbd, 0xe2, 0xb1, 0xaf, 0xc4, 0x92, - 0x4e, 0xc5, 0x8c, 0xe1, 0x9b, 0xae, 0xc3, 0xac, 0xce, 0x88, 0xc7, 0xb5, 0xc3, 0xa8, - 0xe1, 0x9a, 0xab, 0xc7, 0x95, 0xe2, 0xb1, 0xbd, + 0xc4, 0x81, 0xc7, 0x88, 0xc8, 0xa0, 0xc8, 0xa8, 0xc7, 0xa1, 0xc7, 0x86, 0x29, 0xc6, + 0x99, 0xe2, 0xb1, 0xbe, 0xc4, 0xb0, 0xe1, 0x9a, 0xaf, 0xc5, 0xa7, 0xc8, 0xbd, 0xe1, + 0x9b, 0x93, 0xe2, 0xb1, 0xa7, 0xe1, 0x9a, 0xb6, 0xc6, 0xb3, 0xe1, 0x9b, 0x89, 0xce, + 0x86, 0xc5, 0xa4, 0xc2, 0xa8, 0xc8, 0xa1, 0xe2, 0xb1, 0xa7, 0xc4, 0x98, 0xe1, 0x9b, + 0xa0, 0xc2, 0xb3, 0xe1, 0x9b, 0xa3, 0xe1, 0x9b, 0x9e, 0x3c, 0xe2, 0xb1, 0xa8, 0xc8, + 0xba, 0xc2, 0xb9, 0xc5, 0x9d, 0xc5, 0xa0, 0xe1, 0x9a, 0xb8, 0xc8, 0x85, 0xc6, 0x88, + 0xe2, 0xb1, 0xbd, 0xe1, 0x9b, 0x8b, 0xc6, 0xbb, 0xc2, 0xa5, 0xc5, 0x8e, 0xcd, 0xb7, + 0x74, 0xc4, 0xba, 0xc4, 0x9a, 0xc6, 0xb9, 0xc5, 0xbc, 0xc5, 0x86, 0xc8, 0x9d, 0xe2, + 0xb1, 0xb9, 0xe2, 0xb1, 0xa2, 0xe2, 0xb1, 0xa6, 0xc3, 0xba, 0xc4, 0xb8, 0xcd, 0xb4, + 0xc8, 0xa8, 0x3f, 0xc4, 0xa1, 0xc7, 0x9c, 0x41, 0xc7, 0x81, 0xc8, 0xb8, 0xc6, 0xb8, + 0xc7, 0xaa, 0xcd, 0xb1, 0xc4, 0xb1, 0xce, 0x8c, 0xe1, 0x9b, 0x86, 0x2d, 0xc8, 0x88, + 0xc5, 0xaa, 0xc8, 0xab, 0xc3, 0xb6, 0xc9, 0x8a, 0x75, 0xc8, 0xa1, 0xc4, 0xa7, 0xc4, + 0x85, 0x48, 0xc6, 0x88, 0x3c, 0xe2, 0xb1, 0xb6, 0xc4, 0x8b, 0xe1, 0x9b, 0xa3, 0xc6, + 0x9b, 0xc8, 0x9d, 0xe1, 0x9b, 0xac, 0xe2, 0xb1, 0xaf, 0x2d, 0xc8, 0x93, 0xc4, 0x88, + 0xc3, 0x83, 0xc7, 0x95, 0xe1, 0x9a, 0xb5, 0xc4, 0xa2, 0x68, 0xc3, 0xbf, 0xc4, 0x96, + 0xc8, 0x9d, 0x43, 0xcd, 0xb4, 0x3d, 0xc6, 0xb1, 0xc4, 0x9c, 0xe1, 0x9b, 0xad, 0xc6, + 0xa3, 0xc3, 0xbe, 0xc4, 0xbf, 0xc7, 0xb8, 0xc2, 0xaa, 0xc8, 0xac, 0xc4, 0x91, 0x6f, + 0xc7, 0xbf, 0xc5, 0x84, 0xc8, 0x94, 0xc7, 0x8b, 0x69, 0xc7, 0xb5, 0x3f, 0xc4, 0xb9, + 0xc3, 0xa7, 0xc2, 0xa7, 0xcd, 0xb3, 0xc3, 0xa2, 0xc2, 0xb9, 0xc5, 0xbb, 0xc4, 0x8b, + 0xce, 0x88, 0x74, 0xc4, 0x94, 0xc2, 0xa2, 0xc6, 0x81, 0xc8, 0xb9, 0xc3, 0xb8, 0xc4, + 0xae, 0xc7, 0xb1, 0xc6, 0xb1, 0xc8, 0xa5, 0xc6, 0x9b, 0xc2, 0xaa, 0xe1, 0x9b, 0xa6, + 0xe2, 0xb1, 0xb4, 0xc3, 0xb5, 0xc3, 0xaf, 0xc4, 0xb7, 0xc2, 0xa3, 0xc8, 0xb7, 0x55, + 0xc4, 0xb0, 0xe1, 0x9a, 0xad, 0xc5, 0x8f, 0xc8, 0x9e, 0xc6, 0xa0, 0xc8, 0x9c, 0xc7, + 0xad, 0xe1, 0x9b, 0x8b, 0xc7, 0xbb, 0x62, 0xe2, 0xb1, 0xba, 0xc6, 0xb1, 0xc6, 0x94, + 0xc8, 0x84, 0xe1, 0x9b, 0x9b, 0xc7, 0xa8, 0xc3, 0x8d, 0xc7, 0x8c, 0xce, 0x87, 0xc7, + 0xa1, 0xc4, 0x89, 0xc7, 0xb8, 0x4e, 0xc2, 0xb0, 0xc6, 0x8a, 0xe2, 0xb1, 0xb0, 0xc9, + 0x8e, 0x2e, 0xe2, 0xb1, 0xb3, 0xc8, 0x9d, 0xc5, 0x90, 0xe1, 0x9b, 0xa8, 0xc5, 0xac, + 0xc3, 0x98, 0x72, 0xc4, 0xb1, 0xc4, 0x9f, 0x69, 0xe1, 0x9b, 0x8f, 0x7e, 0xc3, 0xaf, + 0xc7, 0x97, 0xc8, 0x96, 0xc3, 0x8a, 0xe1, 0x9b, 0xa2, 0xc6, 0xb8, 0xc7, 0x80, 0xc8, + 0xbc, 0x7d, 0xce, 0x87, 0x47, 0xc4, 0xad, 0xc4, 0xb8, 0xc8, 0xa4, 0xe1, 0x9b, 0xad, + 0xc7, 0x8a, 0xc3, 0x9c, 0xc2, 0xba, 0xe1, 0x9b, 0x9f, 0xe1, 0x9b, 0x86, 0xc2, 0xaa, + 0xc4, 0xaf, 0xc8, 0x84, 0x28, 0x6c, 0xc2, 0xb9, 0xe1, 0x9b, 0xa6, 0xe1, 0x9b, 0xac, + 0xc3, 0xa5, 0x53, 0xc2, 0xa6, 0xc2, 0xa2, 0xe1, 0x9b, 0xa3, 0x57, 0xc9, 0x84, 0xc4, + 0xa5, 0xc5, 0x8a, 0x7d, 0xc2, 0xb1, 0x66, 0xc8, 0x86, 0xc8, 0xb3, 0xc8, 0x8d, 0xe1, + 0x9b, 0xae, 0xe2, 0xb1, 0xad, 0xc5, 0xb1, 0x55, 0xc8, 0x89, 0xc8, 0x8f, 0xc6, 0xa7, + 0xc4, 0xbd, 0xe2, 0xb1, 0xb4, 0xc4, 0xb6, 0x34, 0xc7, 0xb8, 0xc3, 0x86, 0xc7, 0xad, + 0xc4, 0x88, 0xc8, 0xa9, 0xc8, 0x8f, 0xc8, 0x80, ], - asset_id: [ - 0xbe, 0x14, 0xb4, 0xa7, 0x43, 0x0a, 0x90, 0xa9, 0x50, 0xd5, 0x8d, 0xd7, 0xbb, 0x10, - 0x72, 0x0e, 0xb9, 0x50, 0xb2, 0x4e, 0x6f, 0x27, 0xce, 0x85, 0x4a, 0x80, 0xf6, 0x4a, - 0x19, 0x24, 0xcd, 0x28, + asset_base: [ + 0xd6, 0x96, 0x5d, 0xaf, 0xad, 0x0f, 0xc5, 0xb1, 0x1a, 0x16, 0xc3, 0xc4, 0x0b, 0x27, + 0xc2, 0x10, 0x4c, 0xf9, 0x99, 0x7a, 0x43, 0x56, 0xa3, 0x82, 0xbb, 0xd7, 0xd4, 0xd2, + 0xcc, 0x84, 0x84, 0x9c, ], }, TestVector { @@ -423,48 +423,48 @@ pub(crate) fn test_vectors() -> Vec { 0x96, 0x26, 0xc5, 0x03, ], description: [ - 0xc2, 0xaa, 0xc2, 0xb5, 0xc2, 0xa5, 0xc7, 0xbc, 0xc3, 0x9a, 0xc9, 0x83, 0xc3, 0x8f, - 0x25, 0xc5, 0x83, 0xc3, 0x86, 0xc4, 0xa4, 0xc3, 0xac, 0xc7, 0xbf, 0xc3, 0x93, 0xc6, - 0x95, 0x42, 0x3b, 0xe1, 0x9b, 0x96, 0xc7, 0x85, 0xc3, 0x84, 0x23, 0xc3, 0xb9, 0x53, - 0xc6, 0xb0, 0xc2, 0xac, 0xc4, 0x94, 0xe1, 0x9a, 0xba, 0xc9, 0x8c, 0xc8, 0x8e, 0xce, - 0x87, 0xc7, 0x8f, 0xc8, 0xbb, 0x79, 0xc3, 0xb4, 0x36, 0xc5, 0x9c, 0xc4, 0x9b, 0xe1, - 0x9a, 0xb4, 0x51, 0xc5, 0xb3, 0x2b, 0xc7, 0x93, 0xe1, 0x9b, 0xa7, 0xc5, 0x93, 0xe1, - 0x9b, 0x9b, 0xc6, 0x81, 0xc4, 0xa8, 0xc8, 0x9a, 0xe1, 0x9b, 0x90, 0xc8, 0x9b, 0xc3, - 0xa5, 0xc4, 0xbd, 0xc7, 0x8b, 0xe1, 0x9b, 0xad, 0xc5, 0xa0, 0xe1, 0x9a, 0xb5, 0x5e, - 0x69, 0x78, 0xc5, 0xbc, 0xc7, 0x8e, 0xc4, 0x8b, 0xc4, 0xa9, 0xc6, 0x91, 0xc5, 0xa8, - 0xc5, 0xbe, 0xc4, 0xb0, 0xc5, 0x96, 0xe1, 0x9a, 0xac, 0xe2, 0xb1, 0xbf, 0xc8, 0xae, - 0xc3, 0x97, 0xc6, 0x8a, 0xc4, 0x9b, 0xc8, 0x9b, 0xc7, 0x89, 0xe1, 0x9a, 0xbd, 0xe1, - 0x9b, 0x89, 0xc9, 0x86, 0xc7, 0x91, 0xe1, 0x9b, 0x96, 0xe1, 0x9a, 0xa4, 0xc8, 0xad, - 0xcd, 0xb0, 0xce, 0x87, 0xc5, 0xb7, 0x5d, 0xe1, 0x9b, 0x9b, 0xc9, 0x80, 0xc3, 0x9b, - 0xc3, 0x85, 0xc3, 0x9a, 0xc6, 0xb7, 0xe1, 0x9b, 0x89, 0xc2, 0xb6, 0xe1, 0x9a, 0xac, - 0xe1, 0x9b, 0x8f, 0xc2, 0xb3, 0xcd, 0xbd, 0xc3, 0x85, 0xc6, 0x90, 0x32, 0xc7, 0xab, - 0xe2, 0xb1, 0xac, 0xc8, 0x8a, 0xc4, 0x86, 0xc5, 0x98, 0xc5, 0x90, 0xc8, 0x9c, 0xc3, - 0x8e, 0xc8, 0x96, 0xc5, 0xa8, 0xc3, 0xa4, 0x7c, 0xc6, 0xb9, 0xc5, 0xa8, 0xc3, 0xa5, - 0x36, 0xc2, 0xa3, 0x7a, 0xc5, 0xb1, 0xc7, 0xb0, 0xc5, 0xb6, 0x61, 0xc5, 0x80, 0xc9, - 0x84, 0xc6, 0xb0, 0xc5, 0x8f, 0xe1, 0x9b, 0x9a, 0xc6, 0xb0, 0xcd, 0xb7, 0xe1, 0x9b, - 0x8a, 0xc6, 0xba, 0xe1, 0x9b, 0x9e, 0x3e, 0x57, 0xc8, 0x9c, 0xc6, 0x9b, 0x5e, 0xc8, - 0xa7, 0xc8, 0x98, 0xc5, 0xbc, 0xc3, 0x9d, 0xc3, 0xa4, 0xe1, 0x9a, 0xbd, 0xe1, 0x9b, - 0x81, 0xc6, 0xbf, 0x6c, 0xc4, 0xbd, 0xc4, 0xbe, 0xe1, 0x9b, 0x8a, 0x75, 0x6c, 0xc5, - 0x97, 0xc8, 0xbc, 0xc5, 0x9e, 0xc5, 0x94, 0xe1, 0x9a, 0xa5, 0xc9, 0x81, 0xc6, 0x88, - 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xbe, 0x49, 0xc5, 0xa6, 0xc4, 0xb7, 0xc9, 0x88, 0xe1, - 0x9a, 0xa6, 0xc5, 0x91, 0xc5, 0xa5, 0xce, 0x8c, 0x56, 0xc3, 0x99, 0xc4, 0x9e, 0xc2, - 0xb4, 0xc3, 0x8b, 0x53, 0x2c, 0xc7, 0xb8, 0x3a, 0xc7, 0x81, 0xc6, 0xb3, 0xe1, 0x9b, - 0xaf, 0xc3, 0xaa, 0xc7, 0xa7, 0xc3, 0xbe, 0xe2, 0xb1, 0xb7, 0xe1, 0x9a, 0xb4, 0x5c, - 0x7c, 0xc2, 0xbf, 0xe1, 0x9a, 0xb3, 0xc8, 0xb6, 0xc6, 0x8e, 0xe1, 0x9b, 0xae, 0xc5, - 0xaf, 0xe1, 0x9b, 0x90, 0xc6, 0xab, 0xc5, 0xb2, 0xe1, 0x9b, 0x81, 0x49, 0xe1, 0x9b, - 0xa4, 0xc3, 0x80, 0x75, 0xc4, 0x9c, 0xc8, 0x96, 0xe1, 0x9a, 0xae, 0x5d, 0xc4, 0xba, - 0xe1, 0x9b, 0x86, 0x2b, 0xe2, 0xb1, 0xb0, 0xc4, 0x9d, 0xe2, 0xb1, 0xb9, 0xc6, 0xb5, - 0xc3, 0xb2, 0xc6, 0x87, 0xc5, 0x9c, 0xc5, 0x94, 0xc6, 0x92, 0xc3, 0x86, 0xc5, 0x82, - 0xc6, 0xb7, 0x47, 0xc6, 0x8b, 0xcd, 0xbd, 0xcd, 0xbd, 0xc7, 0xad, 0xc7, 0x97, 0xc2, - 0xa1, 0xc8, 0xa8, 0xe1, 0x9a, 0xbd, 0xc7, 0xad, 0xc4, 0xac, 0xc8, 0x99, 0x6c, 0x36, - 0x5f, 0xc5, 0x89, 0xc4, 0x87, 0xc4, 0x80, 0xc2, 0xbe, 0xe2, 0xb1, 0xbd, 0xc4, 0x8f, - 0xc4, 0xb1, 0xc3, 0x83, 0xc5, 0xbd, 0xc6, 0xa5, 0xc5, 0xb9, 0xc5, 0xa5, 0xc6, 0xba, - 0x6e, 0xc8, 0xaa, 0x6d, 0xc4, 0x80, 0x7c, 0x5a, + 0x2b, 0xc2, 0xbe, 0xe1, 0x9b, 0x94, 0xe2, 0xb1, 0xad, 0xc2, 0xa8, 0xc4, 0x9a, 0xc3, + 0x8c, 0xe2, 0xb1, 0xaa, 0xc7, 0x83, 0x6a, 0xc8, 0xbf, 0xc6, 0xbd, 0xc4, 0xa6, 0xc2, + 0xa2, 0xc5, 0x8e, 0xc8, 0x9e, 0xce, 0x89, 0xc5, 0xa1, 0xc6, 0xb8, 0xc8, 0x89, 0xe1, + 0x9a, 0xaf, 0xc8, 0xa1, 0xc9, 0x8e, 0xc3, 0xbf, 0xc7, 0xbc, 0x64, 0x72, 0xc4, 0xbb, + 0xc6, 0x9a, 0xc6, 0x97, 0x2a, 0xc3, 0xb4, 0x4f, 0x4b, 0xc4, 0xa2, 0xc3, 0x93, 0xe2, + 0xb1, 0xba, 0xe2, 0xb1, 0xb5, 0x37, 0xe1, 0x9b, 0x9a, 0xc2, 0xbb, 0xc5, 0x94, 0xc7, + 0xb8, 0xc5, 0x93, 0xc6, 0xa2, 0xc8, 0xa9, 0xc6, 0xa2, 0x5f, 0xc5, 0xb7, 0xc3, 0xae, + 0xc3, 0x98, 0xc6, 0x89, 0xc8, 0xa1, 0xc8, 0x87, 0xc4, 0x9c, 0xe2, 0xb1, 0xb5, 0xc7, + 0xb3, 0xc3, 0x9e, 0xc7, 0x8c, 0xc8, 0xa4, 0xe1, 0x9a, 0xa4, 0xe1, 0x9b, 0x9f, 0xe1, + 0x9b, 0x9a, 0xc8, 0x9c, 0xc7, 0xa4, 0xc3, 0xac, 0x47, 0x56, 0xe1, 0x9a, 0xae, 0x7e, + 0xc7, 0x8b, 0xc8, 0x9e, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, 0x84, 0x73, 0xc7, 0x93, 0xc5, + 0xba, 0x6f, 0xe2, 0xb1, 0xb0, 0xc4, 0xa0, 0xe1, 0x9b, 0x89, 0xe1, 0x9a, 0xb6, 0xc3, + 0x82, 0xe1, 0x9a, 0xbd, 0xc9, 0x8b, 0xc7, 0xb8, 0xe2, 0xb1, 0xaf, 0xc5, 0xba, 0x21, + 0xc3, 0x9c, 0x3c, 0xe1, 0x9b, 0x96, 0xc8, 0xac, 0x6e, 0xc5, 0x8d, 0xe1, 0x9b, 0x80, + 0xc3, 0xab, 0xc5, 0x85, 0xc4, 0xab, 0x6b, 0xc5, 0x90, 0xc8, 0x99, 0xe1, 0x9b, 0x99, + 0xc8, 0x84, 0xc3, 0xbb, 0xc8, 0x82, 0xc8, 0xa1, 0xc3, 0x92, 0xc7, 0x9d, 0xc4, 0xaf, + 0xc6, 0xaa, 0x61, 0xc5, 0x82, 0xc7, 0xb9, 0xc7, 0xa1, 0xce, 0x89, 0xc8, 0xb2, 0xe1, + 0x9b, 0xa8, 0xc7, 0x8d, 0xcd, 0xbe, 0x67, 0xc9, 0x87, 0xc4, 0xba, 0x43, 0xc7, 0xa2, + 0xc6, 0xb1, 0xe1, 0x9a, 0xad, 0xc5, 0x83, 0xc3, 0xb0, 0xc5, 0xb2, 0xc6, 0x9a, 0x3e, + 0xc4, 0xb8, 0xc2, 0xb9, 0xc8, 0xa1, 0xc6, 0x93, 0xc7, 0xa5, 0x6a, 0xc5, 0xa9, 0xc4, + 0xa7, 0xc8, 0xb6, 0xc3, 0xa6, 0xc4, 0xb2, 0xc8, 0x8d, 0xcd, 0xb1, 0x41, 0xc6, 0x85, + 0xc7, 0x84, 0xc4, 0x83, 0xe1, 0x9b, 0xa9, 0xc2, 0xb5, 0x52, 0xc5, 0x80, 0xe1, 0x9b, + 0x83, 0xc6, 0xbb, 0xc5, 0x8e, 0xe1, 0x9a, 0xa4, 0xc2, 0xa6, 0xe1, 0x9b, 0xa3, 0xe1, + 0x9a, 0xbd, 0xe1, 0x9b, 0xaf, 0xc4, 0xba, 0xe2, 0xb1, 0xa6, 0xc3, 0x89, 0x5a, 0xc4, + 0xa9, 0xe1, 0x9a, 0xba, 0x5d, 0xc6, 0x9f, 0xc4, 0xa8, 0xc4, 0xa3, 0xc5, 0x9f, 0xc6, + 0x8e, 0xe2, 0xb1, 0xb8, 0xc8, 0x9b, 0xe2, 0xb1, 0xa5, 0xc6, 0x9d, 0xe1, 0x9a, 0xaa, + 0xe1, 0x9b, 0x98, 0xc2, 0xa1, 0xc2, 0xb4, 0xc6, 0x87, 0xc7, 0x93, 0xc6, 0x88, 0xe1, + 0x9a, 0xb3, 0xc4, 0x98, 0xc2, 0xb1, 0xc8, 0x91, 0xc3, 0xb5, 0x62, 0xc7, 0xb8, 0xe1, + 0x9b, 0x94, 0xc3, 0x87, 0xc4, 0xa7, 0xc8, 0x8a, 0xc5, 0x95, 0xe1, 0x9b, 0xb0, 0xc4, + 0x98, 0xe2, 0xb1, 0xb3, 0xc5, 0xac, 0xcd, 0xb3, 0xc6, 0xbb, 0xc7, 0xbf, 0xc4, 0xbe, + 0xc3, 0x98, 0xcd, 0xba, 0x5d, 0xc3, 0x9e, 0x5a, 0xc4, 0x8c, 0x3e, 0x3f, 0x76, 0xc7, + 0x8a, 0xe1, 0x9a, 0xbf, 0xc6, 0xa6, 0xe1, 0x9b, 0x95, 0x77, 0xc7, 0xb2, 0xe1, 0x9b, + 0x91, 0xc8, 0x84, 0xe2, 0xb1, 0xa3, 0xc7, 0x82, 0xc4, 0x87, 0x70, 0xe1, 0x9a, 0xb1, + 0xc6, 0x91, 0xe1, 0x9a, 0xba, 0xc5, 0xa4, 0xc8, 0x8c, 0x59, 0xc4, 0xaa, 0xc6, 0x9a, + 0xc7, 0xb0, 0xc3, 0x87, 0xc7, 0xb6, 0xc6, 0x80, 0x3c, 0xcd, 0xb4, 0xc4, 0x8d, 0x71, + 0xe1, 0x9b, 0x9b, 0xe2, 0xb1, 0xb6, 0xc6, 0xb9, 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xba, + 0xc7, 0xb2, 0xc8, 0xa4, 0xe1, 0x9a, 0xa2, 0x5a, ], - asset_id: [ - 0xac, 0xa7, 0x66, 0x43, 0xac, 0xdd, 0x83, 0xe3, 0x8e, 0xe5, 0xcf, 0xe0, 0xe7, 0xd2, - 0x99, 0xd6, 0x35, 0x69, 0x0a, 0x82, 0xba, 0x96, 0x51, 0x47, 0xe2, 0xa4, 0x48, 0x24, - 0x9b, 0xee, 0xb2, 0x88, + asset_base: [ + 0x98, 0x06, 0x94, 0xc0, 0xcc, 0x2c, 0x02, 0x1c, 0xa3, 0x57, 0xa6, 0x06, 0x25, 0x2e, + 0x7e, 0x66, 0x90, 0xed, 0xa5, 0xea, 0x56, 0xc4, 0xfb, 0x57, 0x32, 0xdd, 0x0b, 0x8b, + 0xbf, 0xf0, 0x3b, 0x9d, ], }, TestVector { @@ -474,48 +474,48 @@ pub(crate) fn test_vectors() -> Vec { 0x60, 0x3e, 0xf8, 0x1f, ], description: [ - 0xc7, 0xad, 0x3b, 0xc8, 0x91, 0xc6, 0x96, 0xe1, 0x9a, 0xbd, 0xe1, 0x9a, 0xa6, 0xce, - 0x87, 0xc3, 0x83, 0xc3, 0x84, 0xe1, 0x9b, 0x84, 0xc9, 0x8a, 0xc4, 0x97, 0xc9, 0x87, - 0xe2, 0xb1, 0xba, 0xc6, 0x93, 0xc6, 0x98, 0xe2, 0xb1, 0xb7, 0xc6, 0x8e, 0xc8, 0x8f, - 0xc9, 0x84, 0xc2, 0xbe, 0x55, 0xc8, 0xb0, 0xc7, 0x82, 0xc2, 0xb2, 0xc6, 0x88, 0xcd, - 0xb3, 0xc6, 0xb2, 0x2e, 0x2e, 0xc3, 0x87, 0xc9, 0x80, 0xc7, 0x9c, 0xc8, 0x9f, 0xc5, - 0xb0, 0xc8, 0x9e, 0xc4, 0xbb, 0xc7, 0x81, 0x74, 0x6c, 0xc6, 0x8c, 0xc6, 0x8f, 0xe1, - 0x9a, 0xb4, 0xc8, 0x94, 0xc2, 0xac, 0xc4, 0x8f, 0xc5, 0xb6, 0xc8, 0xb5, 0xc3, 0xb7, - 0xcd, 0xb6, 0xc2, 0xb1, 0xc5, 0xb1, 0xc4, 0xa5, 0x40, 0x68, 0x58, 0x2b, 0xc5, 0xb7, - 0xc4, 0x91, 0xc6, 0xa1, 0xc7, 0xa7, 0x79, 0xe1, 0x9b, 0xa6, 0xe2, 0xb1, 0xac, 0xc6, - 0x99, 0x51, 0xc7, 0xaf, 0xcd, 0xb4, 0xe1, 0x9b, 0x8e, 0xe1, 0x9b, 0xad, 0xc8, 0x96, - 0xe1, 0x9b, 0xad, 0xc3, 0xa1, 0xc6, 0x95, 0xc5, 0x98, 0xc6, 0x95, 0xc2, 0xaf, 0xe2, - 0xb1, 0xac, 0xc4, 0xbe, 0xc5, 0xac, 0xc8, 0x85, 0xc5, 0xa9, 0xc4, 0x93, 0xc5, 0x9a, - 0x6c, 0xc3, 0xae, 0xe1, 0x9a, 0xba, 0xc6, 0x85, 0xc6, 0x92, 0xc5, 0xa7, 0xc4, 0xa5, - 0xc5, 0x80, 0xc6, 0xaa, 0xe2, 0xb1, 0xa5, 0xc4, 0xaa, 0xc8, 0x83, 0xc5, 0xad, 0xc9, - 0x88, 0x7c, 0xc7, 0xa6, 0xe1, 0x9a, 0xb9, 0xc3, 0xa4, 0xc9, 0x84, 0xc5, 0xa3, 0xc3, - 0xb6, 0xc5, 0x8c, 0xc8, 0xab, 0xc8, 0xa7, 0xc8, 0xb7, 0xc5, 0x9c, 0xc6, 0xb5, 0xc8, - 0x8d, 0xc2, 0xb7, 0xc5, 0x93, 0xc5, 0xb7, 0xc7, 0xac, 0xcd, 0xbe, 0xc3, 0xa2, 0xc5, - 0xa5, 0xc4, 0x8c, 0xe2, 0xb1, 0xbf, 0x66, 0xc5, 0xbf, 0xc6, 0x83, 0xc6, 0x99, 0xc2, - 0xa2, 0xe1, 0x9b, 0xad, 0x7c, 0xc4, 0x9e, 0xc6, 0xa2, 0xc3, 0xb8, 0xc6, 0xb6, 0xc6, - 0xaf, 0x72, 0xc6, 0xb1, 0xc6, 0x98, 0xc6, 0xb8, 0x49, 0xe1, 0x9a, 0xa6, 0x59, 0xe1, - 0x9b, 0xa1, 0xc8, 0xb6, 0xc4, 0xa6, 0xc6, 0xbe, 0xc8, 0xa1, 0xe2, 0xb1, 0xa5, 0xe1, - 0x9b, 0xa3, 0xc5, 0x8d, 0xc2, 0xb5, 0xc6, 0xa8, 0xc7, 0xbd, 0xc8, 0x8a, 0xe1, 0x9b, - 0xb0, 0xc5, 0xaf, 0x56, 0xc8, 0x8b, 0x34, 0xc4, 0x94, 0xc4, 0xbc, 0x67, 0xc6, 0xb5, - 0xc2, 0xb0, 0x63, 0xe1, 0x9b, 0x99, 0xc4, 0xa8, 0xc6, 0x9c, 0xe1, 0x9a, 0xbc, 0xe1, - 0x9b, 0x8a, 0xc6, 0x99, 0x4b, 0xc6, 0xb2, 0xe1, 0x9b, 0xa2, 0xc8, 0x9f, 0xc5, 0x88, - 0xc5, 0xb6, 0xc3, 0xb8, 0x6d, 0xe2, 0xb1, 0xa2, 0xc7, 0xb4, 0xcd, 0xb3, 0xc2, 0xa3, - 0xc7, 0xa1, 0xc4, 0x83, 0xc7, 0xb1, 0xc8, 0x98, 0xc8, 0x84, 0x6b, 0xc7, 0x84, 0xc6, - 0xb6, 0xe1, 0x9a, 0xb8, 0xc5, 0x93, 0xc8, 0x90, 0x79, 0xc8, 0xa3, 0xe1, 0x9a, 0xb0, - 0xe1, 0x9b, 0xad, 0xc8, 0xb0, 0xc4, 0x9e, 0xe1, 0x9b, 0x9a, 0xc7, 0x97, 0x32, 0xc6, - 0xb2, 0xc9, 0x83, 0xe1, 0x9b, 0x96, 0xc9, 0x8f, 0xc3, 0x8c, 0xe2, 0xb1, 0xad, 0xc4, - 0xbd, 0xc3, 0xbe, 0xe1, 0x9b, 0x8b, 0xc8, 0x9d, 0xc6, 0x95, 0xc8, 0x8f, 0xc8, 0x9e, - 0xc8, 0x83, 0x74, 0xc7, 0xbe, 0xe1, 0x9b, 0x8a, 0x3c, 0xc5, 0x93, 0x63, 0xc7, 0x98, - 0x31, 0xc4, 0x82, 0x56, 0xe2, 0xb1, 0xa3, 0x53, 0xe1, 0x9b, 0xa4, 0xc7, 0x94, 0xc7, - 0x9e, 0x2e, 0xcd, 0xbe, 0xc7, 0x9c, 0xc4, 0x90, 0xe2, 0xb1, 0xbe, 0xe2, 0xb1, 0xba, - 0xc7, 0x82, 0xc5, 0xb2, 0xe1, 0x9a, 0xa4, 0xc6, 0xb2, 0xcd, 0xb2, 0xc3, 0xa5, 0xe1, - 0x9b, 0xab, 0xc3, 0xa9, 0xc7, 0xa3, 0xc3, 0x8a, 0xc2, 0xa3, 0xc9, 0x82, 0x7b, 0xc6, - 0xb3, 0x4b, 0xc4, 0xb6, 0xc4, 0x85, 0xc7, 0x8c, + 0xc2, 0xb3, 0xe2, 0xb1, 0xb3, 0xc4, 0xab, 0xe1, 0x9b, 0x81, 0xe1, 0x9a, 0xbc, 0xc7, + 0x82, 0xc3, 0xa6, 0xc7, 0x94, 0xc4, 0x8a, 0xc7, 0x8f, 0xc6, 0xaf, 0xc7, 0xaf, 0xc3, + 0xbe, 0xe1, 0x9a, 0xa7, 0xc6, 0x88, 0xc6, 0xb2, 0xc6, 0xab, 0xc4, 0x98, 0xc6, 0xb4, + 0xc7, 0x9b, 0xc7, 0xbb, 0xe1, 0x9b, 0xa1, 0xc5, 0xba, 0xc4, 0xb3, 0xc8, 0xb5, 0xe1, + 0x9b, 0x97, 0xc5, 0xb7, 0xc8, 0x89, 0x35, 0x66, 0xcd, 0xba, 0xc6, 0xb2, 0xc6, 0xac, + 0x29, 0xe2, 0xb1, 0xa9, 0xc8, 0xb4, 0xc3, 0xa5, 0x7d, 0xc8, 0xa0, 0xc3, 0x9a, 0xc8, + 0xaf, 0xc8, 0x82, 0xc3, 0xa4, 0xc4, 0xb5, 0x37, 0xe1, 0x9b, 0xa0, 0xc4, 0x8e, 0x32, + 0xc5, 0xb2, 0xc4, 0x90, 0xc5, 0xbb, 0xe1, 0x9b, 0x8d, 0xc7, 0x8a, 0xe1, 0x9a, 0xb2, + 0xc6, 0xbb, 0xc7, 0xa5, 0xc2, 0xbe, 0xe1, 0x9b, 0x96, 0xc3, 0x91, 0xc6, 0x86, 0xe1, + 0x9b, 0xa7, 0xc5, 0x93, 0xc3, 0xb5, 0x59, 0xc6, 0x9a, 0xc7, 0x9c, 0xe1, 0x9a, 0xb8, + 0xc6, 0x83, 0xe2, 0xb1, 0xb9, 0x59, 0xc9, 0x8b, 0xc4, 0x90, 0xc6, 0x92, 0xc2, 0xbf, + 0xc7, 0xbf, 0xc6, 0x97, 0x61, 0x37, 0xc8, 0xbc, 0xc2, 0xbd, 0xc5, 0xb7, 0xc5, 0xa3, + 0xc4, 0xa4, 0xc7, 0x96, 0xc6, 0x84, 0xc6, 0xb6, 0xc4, 0x83, 0x42, 0xc8, 0xba, 0xc7, + 0x94, 0xe1, 0x9b, 0xa2, 0xc3, 0xbf, 0xc6, 0xb5, 0xc6, 0x94, 0x7c, 0xc2, 0xbc, 0x5e, + 0xc3, 0xa6, 0xe1, 0x9a, 0xb6, 0xc9, 0x8b, 0xc4, 0x83, 0xc8, 0x9b, 0xc8, 0x9d, 0xc3, + 0xb3, 0xc8, 0xb6, 0xe1, 0x9b, 0xa8, 0xc2, 0xbd, 0xe1, 0x9b, 0xa3, 0xc8, 0x8f, 0x26, + 0xe1, 0x9b, 0x8d, 0xc8, 0x88, 0xc6, 0xbd, 0x6a, 0xc3, 0x8b, 0xc5, 0x91, 0xc4, 0xb1, + 0xce, 0x89, 0x4b, 0xc5, 0xb1, 0xe1, 0x9b, 0x8c, 0xc3, 0x9f, 0xc4, 0xb8, 0xc3, 0x98, + 0xe1, 0x9b, 0x91, 0xc7, 0xa9, 0xc8, 0x9c, 0xc5, 0x93, 0xc6, 0xb0, 0xe1, 0x9b, 0x89, + 0x6c, 0xe1, 0x9b, 0xa4, 0x4a, 0xc6, 0xad, 0xc7, 0x92, 0xc3, 0x88, 0x71, 0xc6, 0xa0, + 0xc6, 0x9f, 0xe1, 0x9b, 0x94, 0xc4, 0xbe, 0xc5, 0x84, 0xc4, 0x9e, 0xc2, 0xb6, 0xcd, + 0xb7, 0xc4, 0xa6, 0xc7, 0xbb, 0xc3, 0x97, 0xc7, 0x87, 0xc4, 0x94, 0x75, 0x43, 0xc6, + 0xbd, 0xc3, 0xb1, 0xc8, 0x92, 0xc3, 0x93, 0xc7, 0x8d, 0x65, 0xc8, 0x8a, 0xe1, 0x9a, + 0xbf, 0xc8, 0xb5, 0xe2, 0xb1, 0xb0, 0xc7, 0x8d, 0x2f, 0x3f, 0xc3, 0xa9, 0xc8, 0xa1, + 0xc5, 0xa0, 0xc4, 0xa1, 0xc7, 0x87, 0xc2, 0xa6, 0x52, 0xc5, 0x89, 0xe1, 0x9b, 0xaf, + 0xc8, 0x84, 0xc5, 0xa3, 0xc7, 0x95, 0xc8, 0xa5, 0xc5, 0xb5, 0xc4, 0xa1, 0x79, 0xe1, + 0x9a, 0xba, 0xc8, 0x97, 0xc3, 0x94, 0xc5, 0x80, 0xe1, 0x9b, 0x88, 0x4b, 0x68, 0xc7, + 0x89, 0xc5, 0x98, 0x4e, 0xc4, 0xb9, 0xe1, 0x9b, 0xab, 0xc4, 0x95, 0xc6, 0xa0, 0xe1, + 0x9b, 0xa5, 0x24, 0xc6, 0x85, 0xc3, 0x93, 0xc6, 0x98, 0x6c, 0xc8, 0x94, 0xc5, 0xaa, + 0xc4, 0x94, 0xc3, 0xaf, 0xc4, 0xb6, 0x46, 0xc5, 0x90, 0xc4, 0x91, 0xc6, 0x97, 0xce, + 0x8a, 0xc7, 0xb9, 0xc6, 0xa7, 0xc3, 0x81, 0xc6, 0xa1, 0xc7, 0x82, 0xcd, 0xbc, 0xc6, + 0x82, 0xc2, 0xb9, 0xc5, 0xa7, 0xc5, 0xa3, 0xc9, 0x84, 0xc4, 0x8e, 0xc8, 0x9b, 0xe2, + 0xb1, 0xae, 0xe1, 0x9a, 0xbe, 0xc7, 0xb8, 0xe2, 0xb1, 0xb4, 0xe2, 0xb1, 0xba, 0xc4, + 0xb6, 0xc7, 0x8d, 0xe2, 0xb1, 0xb1, 0xc7, 0xbf, 0x50, 0xc5, 0x9f, 0xc6, 0x9d, 0xc5, + 0xa4, 0xc6, 0xb2, 0xc7, 0x83, 0x76, 0x68, 0xc8, 0x90, 0xc3, 0xaa, 0xc8, 0x8b, 0xc8, + 0x86, 0xc5, 0xba, 0x76, 0xcd, 0xb1, 0xc6, 0xa7, 0xc6, 0xa7, 0xc6, 0x84, 0xe1, 0x9b, + 0xa7, 0xc9, 0x8c, 0xc9, 0x89, 0x53, 0xc4, 0xb5, ], - asset_id: [ - 0x03, 0x74, 0x69, 0x16, 0xa8, 0xa6, 0xb8, 0xff, 0xa0, 0x4d, 0x71, 0x95, 0xbc, 0x06, - 0x74, 0x96, 0xa6, 0xce, 0xce, 0x35, 0x6a, 0x2a, 0x14, 0x6d, 0x69, 0x52, 0x9a, 0xea, - 0xac, 0x10, 0x1a, 0xb8, + asset_base: [ + 0xc1, 0x69, 0x63, 0x4b, 0xf8, 0x47, 0x9d, 0x3d, 0x09, 0x47, 0x76, 0x4f, 0xbd, 0x30, + 0x3c, 0x31, 0xdc, 0x10, 0xb0, 0xa2, 0x81, 0x39, 0x1f, 0x5a, 0xde, 0xac, 0xf8, 0x2a, + 0xae, 0xce, 0xf3, 0xbe, ], }, TestVector { @@ -525,48 +525,48 @@ pub(crate) fn test_vectors() -> Vec { 0xaf, 0x40, 0x8d, 0x12, ], description: [ - 0xe1, 0x9b, 0xad, 0xe1, 0x9a, 0xaf, 0x39, 0xc7, 0x92, 0xc4, 0x87, 0xc8, 0x8b, 0xe2, - 0xb1, 0xa9, 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, 0x97, 0xc6, 0x89, 0xc4, 0xb1, 0xc8, 0xa1, - 0xc7, 0xad, 0xc7, 0x8a, 0xe1, 0x9a, 0xb4, 0xe1, 0x9a, 0xa4, 0xc5, 0x99, 0xe1, 0x9b, - 0xa5, 0xcd, 0xb7, 0xc6, 0xa5, 0xc3, 0xb6, 0xe1, 0x9b, 0x9a, 0xe1, 0x9b, 0xab, 0xc5, - 0x9a, 0x4d, 0xe1, 0x9b, 0x81, 0xe1, 0x9b, 0x8a, 0xc2, 0xbe, 0xc5, 0x88, 0xc6, 0xbd, - 0xe2, 0xb1, 0xb8, 0xe2, 0xb1, 0xbb, 0xc5, 0x8d, 0xc2, 0xbc, 0xc6, 0x81, 0xc5, 0x9c, - 0xe2, 0xb1, 0xb5, 0xc8, 0x95, 0x6d, 0xc3, 0x9b, 0xc2, 0xb3, 0x36, 0xc4, 0x88, 0xc6, - 0xbf, 0xc7, 0xb6, 0xe1, 0x9b, 0xad, 0xc7, 0x8e, 0xe1, 0x9b, 0xa9, 0x69, 0xc3, 0xa5, - 0xe2, 0xb1, 0xb3, 0xc7, 0xbb, 0xc6, 0x9f, 0xc3, 0xa7, 0xc3, 0xbe, 0xce, 0x86, 0xc6, - 0xbd, 0xc6, 0x95, 0xc7, 0xa2, 0xc7, 0xbf, 0xc7, 0xad, 0xc4, 0x93, 0xc6, 0xb6, 0xc3, - 0x8b, 0xe2, 0xb1, 0xbb, 0xc3, 0x96, 0xc8, 0xaa, 0xc7, 0xa9, 0xc8, 0x8e, 0xc2, 0xb9, - 0xc8, 0x99, 0xc3, 0x93, 0xe1, 0x9b, 0x9c, 0xc2, 0xac, 0xc7, 0xbc, 0xc3, 0xb6, 0xc2, - 0xa7, 0xc3, 0xa9, 0xcd, 0xbc, 0xe2, 0xb1, 0xbf, 0xe1, 0x9a, 0xb1, 0xc2, 0xb8, 0xc3, - 0xb9, 0xe1, 0x9b, 0x9e, 0xc7, 0x88, 0xc5, 0x9e, 0xc6, 0xb9, 0xc4, 0x9e, 0xc6, 0x8e, - 0x3e, 0xc8, 0x93, 0x74, 0x37, 0xe2, 0xb1, 0xb2, 0x58, 0xcd, 0xbe, 0xc6, 0x9a, 0x5c, - 0xc8, 0x94, 0xe1, 0x9a, 0xb6, 0xc8, 0x90, 0xc5, 0x95, 0xe2, 0xb1, 0xa6, 0x23, 0xc5, - 0xa2, 0xc3, 0x9c, 0xe2, 0xb1, 0xb4, 0xc4, 0x94, 0xc3, 0x97, 0xc6, 0x9f, 0xc3, 0x92, - 0xcd, 0xbd, 0xc4, 0xbe, 0xc5, 0xba, 0xc6, 0xb0, 0x77, 0xc7, 0xba, 0xc5, 0xb0, 0xc3, - 0x9b, 0xc5, 0xbf, 0xc7, 0xa3, 0xc3, 0xad, 0xc6, 0xbf, 0xc3, 0xbe, 0xc5, 0xab, 0xc7, - 0xb9, 0xe1, 0x9b, 0xa9, 0xc5, 0xb3, 0xe1, 0x9a, 0xac, 0xe1, 0x9a, 0xa4, 0xc5, 0x9e, - 0xc2, 0xa7, 0xcd, 0xbe, 0x4e, 0xe2, 0xb1, 0xb5, 0xc4, 0xb8, 0xe1, 0x9a, 0xbd, 0xe1, - 0x9b, 0x83, 0xe2, 0xb1, 0xa2, 0xc6, 0xa4, 0xc6, 0xa6, 0xc7, 0xbc, 0xe1, 0x9b, 0x82, - 0x44, 0xe1, 0x9a, 0xa4, 0xc3, 0xb3, 0xc5, 0xb1, 0xc3, 0xa5, 0xc7, 0xaa, 0x5b, 0xc6, - 0x9c, 0xc7, 0x92, 0x2f, 0xc6, 0x86, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb5, 0x44, 0xc7, - 0xb1, 0xc4, 0xac, 0xc8, 0xae, 0xe1, 0x9a, 0xa1, 0xc8, 0xaa, 0xc5, 0x9a, 0xc3, 0xac, - 0xc8, 0xac, 0xe1, 0x9b, 0xa3, 0xc5, 0xab, 0xc7, 0x98, 0xe1, 0x9b, 0x93, 0x6e, 0xc7, - 0x8a, 0xc4, 0x9f, 0xe1, 0x9b, 0x9b, 0xc7, 0x86, 0xe2, 0xb1, 0xb8, 0xc6, 0xaa, 0xc8, - 0xa1, 0xc2, 0xbf, 0xc3, 0x97, 0xcd, 0xbd, 0xc8, 0x99, 0xc4, 0x98, 0xc3, 0x88, 0x3f, - 0x4a, 0xc7, 0x99, 0xc4, 0x8a, 0xc7, 0x9a, 0xc5, 0xa9, 0xc7, 0xb5, 0xc7, 0x9b, 0xc5, - 0xb1, 0xc5, 0xbf, 0xc7, 0x81, 0xc8, 0xb2, 0xc9, 0x89, 0xc5, 0xa4, 0xc8, 0x82, 0xc6, - 0x91, 0xe1, 0x9a, 0xa8, 0xc7, 0xac, 0x6c, 0x64, 0xc4, 0x86, 0xc8, 0x8b, 0xc5, 0x99, - 0xc6, 0x9a, 0xc3, 0x83, 0xc6, 0x8e, 0xc3, 0x9a, 0xc7, 0xa9, 0xc3, 0xb3, 0xe1, 0x9b, - 0x8a, 0xc7, 0x94, 0xc7, 0xbb, 0xe1, 0x9a, 0xbb, 0xc6, 0xb4, 0xc6, 0xaf, 0xe1, 0x9b, - 0xa8, 0xc2, 0xa1, 0x24, 0xe1, 0x9b, 0xab, 0xc8, 0xbb, 0xc3, 0xba, 0xe1, 0x9a, 0xb9, - 0xc8, 0x92, 0xc8, 0xb2, 0xc5, 0xa6, 0xc5, 0xb3, 0xc4, 0x8d, 0xc5, 0xad, 0xc5, 0xa0, - 0xc3, 0x9c, 0xe1, 0x9b, 0xae, 0xc7, 0xb2, 0xc4, 0x9b, 0xc6, 0xbb, 0xc5, 0xb0, 0xc7, - 0xbb, 0xc7, 0xba, 0xc5, 0xb7, 0xc8, 0xa4, 0x5a, + 0xc8, 0xa5, 0xc4, 0xb5, 0xc8, 0xb7, 0xc6, 0xa8, 0x2e, 0xc7, 0xa8, 0xc7, 0xb0, 0x52, + 0xc7, 0xac, 0xc8, 0xbf, 0x79, 0xe1, 0x9a, 0xba, 0xe1, 0x9b, 0x83, 0xc3, 0xa9, 0xc4, + 0x90, 0xc7, 0x90, 0xc3, 0x80, 0xe1, 0x9b, 0x93, 0xe1, 0x9a, 0xad, 0x58, 0xc7, 0x9b, + 0xc5, 0x85, 0x69, 0xc5, 0x90, 0xc2, 0xb8, 0xc5, 0x92, 0xc4, 0xaa, 0xc2, 0xa5, 0xc4, + 0xaa, 0xc3, 0xa9, 0xc6, 0xaa, 0xc8, 0xa1, 0xc5, 0x8b, 0xc2, 0xbf, 0xe1, 0x9b, 0xa3, + 0xcd, 0xb4, 0xc5, 0xb9, 0xc7, 0x95, 0x32, 0xc7, 0xba, 0xc5, 0x8f, 0xc2, 0xbb, 0xc3, + 0xb4, 0xe2, 0xb1, 0xb0, 0xc8, 0xb6, 0xe1, 0x9a, 0xbd, 0xc4, 0xa7, 0xc5, 0xad, 0xc4, + 0x9e, 0xe1, 0x9a, 0xb5, 0xc6, 0xae, 0xc3, 0xb9, 0xc3, 0x89, 0xc7, 0xba, 0xc3, 0x90, + 0xc7, 0xb4, 0xc3, 0xbe, 0xe2, 0xb1, 0xb7, 0xc6, 0x90, 0xc5, 0x83, 0xc8, 0xba, 0xc5, + 0x89, 0xc5, 0xa9, 0xc9, 0x86, 0x4d, 0x53, 0xcd, 0xb5, 0xc2, 0xb0, 0xc2, 0xb5, 0xc6, + 0x9b, 0x7a, 0xc4, 0x8f, 0xc3, 0x96, 0x45, 0xc3, 0xab, 0xc5, 0x8d, 0x4c, 0xc4, 0x81, + 0xe1, 0x9b, 0xad, 0xc8, 0x93, 0xe2, 0xb1, 0xbb, 0x5a, 0xc5, 0xaf, 0xc7, 0xa3, 0x71, + 0xc6, 0xa1, 0xe1, 0x9b, 0xaf, 0xc5, 0x84, 0xc6, 0x86, 0xc7, 0xa0, 0xc2, 0xae, 0xc4, + 0xac, 0xcd, 0xbb, 0xc4, 0x8e, 0xc6, 0x9c, 0xc8, 0x85, 0xc2, 0xa4, 0xc5, 0x85, 0xc8, + 0x9b, 0xc6, 0x87, 0xe1, 0x9b, 0xad, 0xc3, 0x80, 0xc4, 0xb5, 0xe2, 0xb1, 0xbb, 0xc5, + 0x9b, 0xc7, 0xb6, 0xc2, 0xb5, 0xc7, 0x8c, 0xc5, 0x86, 0xc6, 0xa8, 0xc5, 0xb7, 0xe1, + 0x9b, 0xa2, 0xc7, 0x90, 0xc2, 0xb0, 0x2e, 0xc5, 0x95, 0xe1, 0x9b, 0x82, 0xc5, 0x89, + 0xc4, 0xa3, 0xe1, 0x9b, 0x87, 0x3c, 0xc9, 0x84, 0x46, 0x2c, 0xe2, 0xb1, 0xbb, 0xe1, + 0x9b, 0x8c, 0xc3, 0xb2, 0xc6, 0xa1, 0xc6, 0x85, 0x31, 0x45, 0xe2, 0xb1, 0xa9, 0xc5, + 0x8c, 0xc6, 0x88, 0xce, 0x84, 0xc5, 0x93, 0xc5, 0xa9, 0xe1, 0x9a, 0xa7, 0xcd, 0xb6, + 0xe1, 0x9b, 0xae, 0xc8, 0xa3, 0x5f, 0xe1, 0x9b, 0x94, 0xe1, 0x9b, 0xac, 0xc5, 0xbb, + 0xc7, 0xa2, 0xc6, 0x99, 0xc7, 0xbb, 0xc5, 0xbf, 0xc4, 0x95, 0xc7, 0x94, 0xe1, 0x9a, + 0xb8, 0xe2, 0xb1, 0xaf, 0xc9, 0x8a, 0xc7, 0x9d, 0xc8, 0x88, 0x7e, 0xc9, 0x88, 0x3e, + 0x21, 0x3e, 0xc5, 0xba, 0xc4, 0x9a, 0x30, 0xc9, 0x87, 0xc5, 0x9c, 0x44, 0xc4, 0xa6, + 0xc3, 0xad, 0xc5, 0x90, 0xc4, 0xa7, 0xc7, 0x9b, 0x3c, 0x58, 0xc4, 0x89, 0xc5, 0x9e, + 0xc5, 0x93, 0xe1, 0x9a, 0xbf, 0xc8, 0xb3, 0xe1, 0x9a, 0xb3, 0xc2, 0xa2, 0xc8, 0xbc, + 0xc6, 0xa6, 0x24, 0xe1, 0x9a, 0xba, 0xc6, 0xae, 0xe1, 0x9a, 0xa0, 0x57, 0xc6, 0x9a, + 0xc2, 0xbc, 0xc8, 0xbc, 0xc2, 0xb0, 0xc3, 0xa5, 0xc5, 0x81, 0xc3, 0xba, 0xe2, 0xb1, + 0xa5, 0xc7, 0xbf, 0xc4, 0xae, 0xc8, 0xae, 0xc2, 0xa6, 0xc6, 0xad, 0xc7, 0x82, 0xc3, + 0xba, 0xc5, 0x9d, 0xc3, 0x96, 0xc7, 0x93, 0xc7, 0xb9, 0xc4, 0xa7, 0xc7, 0xba, 0xc2, + 0xb1, 0xcd, 0xb7, 0xc4, 0xa8, 0xe2, 0xb1, 0xac, 0xe1, 0x9b, 0x89, 0xe2, 0xb1, 0xbc, + 0xc6, 0xb3, 0xc8, 0x9b, 0xc8, 0xbb, 0xe1, 0x9a, 0xa1, 0xc2, 0xa1, 0xc7, 0x81, 0xc8, + 0x98, 0xc4, 0x9b, 0xe1, 0x9a, 0xb8, 0xc6, 0x9f, 0xc2, 0xa7, 0xc5, 0x85, 0xc3, 0xb8, + 0xc7, 0x97, 0xc9, 0x83, 0xc9, 0x89, 0xc7, 0x90, 0xc8, 0xbf, 0xc8, 0xaa, 0xc8, 0x8a, + 0xc6, 0x9a, 0xc5, 0x81, 0xc7, 0x9e, 0x4b, 0xc3, 0x90, 0xc6, 0xa8, 0xe1, 0x9b, 0x9c, + 0xc8, 0x94, 0xc7, 0x9c, 0xc5, 0x90, 0xc4, 0x9b, 0xe1, 0x9b, 0x9d, 0xe1, 0x9b, 0xb0, + 0xe1, 0x9a, 0xa2, 0xc6, 0xb8, 0x61, 0x5a, 0x5a, ], - asset_id: [ - 0x0f, 0x1a, 0x21, 0x20, 0x6c, 0x80, 0xdb, 0x63, 0x73, 0xde, 0x95, 0x66, 0xe9, 0x06, - 0xf1, 0x87, 0xe5, 0xea, 0x72, 0x84, 0x10, 0x86, 0x13, 0x86, 0x31, 0x77, 0x51, 0x0c, - 0xee, 0x14, 0xd7, 0xb1, + asset_base: [ + 0xed, 0x3b, 0xad, 0xc9, 0x6d, 0xc0, 0x5f, 0x5f, 0x70, 0x48, 0xcc, 0x86, 0xd9, 0xea, + 0xe7, 0x59, 0x9b, 0x57, 0xd8, 0x61, 0xbe, 0x33, 0x15, 0x4e, 0x3b, 0x88, 0xc3, 0xc6, + 0x86, 0xb2, 0x82, 0xbb, ], }, TestVector { @@ -576,48 +576,48 @@ pub(crate) fn test_vectors() -> Vec { 0xc1, 0xca, 0xcd, 0x02, ], description: [ - 0xc3, 0xa0, 0x26, 0xc8, 0xb0, 0xc3, 0x82, 0xc3, 0xb6, 0xc4, 0xa3, 0xc6, 0x85, 0xc3, - 0x8f, 0xc9, 0x8a, 0xc4, 0x99, 0xc8, 0xb8, 0xc6, 0xaa, 0xc4, 0xa4, 0xe1, 0x9b, 0x99, - 0xc6, 0x98, 0xe1, 0x9b, 0x99, 0xc6, 0x8a, 0x3c, 0xe1, 0x9b, 0x89, 0xc6, 0xa8, 0xc6, - 0xb4, 0x33, 0xe1, 0x9b, 0xa1, 0xc6, 0xb7, 0xcd, 0xb2, 0xc6, 0xbc, 0xc7, 0x86, 0xc6, - 0x9d, 0xc5, 0xac, 0xc2, 0xb7, 0xc6, 0x8a, 0xc7, 0xa5, 0xc3, 0x95, 0x35, 0xc3, 0x86, - 0x44, 0xc3, 0x89, 0xc5, 0xa1, 0xe1, 0x9b, 0xaf, 0xc6, 0xae, 0x41, 0xc4, 0x99, 0xc3, - 0xa8, 0x45, 0xe2, 0xb1, 0xb5, 0xc3, 0x83, 0x5f, 0x37, 0xc7, 0xbf, 0xe1, 0x9a, 0xa8, - 0xc7, 0x8f, 0xc5, 0x92, 0x7e, 0xc3, 0xad, 0xe2, 0xb1, 0xb9, 0xe1, 0x9a, 0xa9, 0xc6, - 0xa3, 0xc7, 0xbf, 0xcd, 0xb1, 0xc7, 0xb6, 0xe1, 0x9b, 0xa4, 0xe1, 0x9a, 0xb1, 0xe1, - 0x9a, 0xb8, 0x41, 0xc7, 0x90, 0xc5, 0x8e, 0xe1, 0x9b, 0xad, 0xc3, 0xb8, 0xc6, 0xae, - 0xc5, 0x9d, 0xc3, 0xb3, 0xc3, 0xbb, 0xc5, 0x97, 0xc7, 0x8f, 0xc8, 0xa4, 0xe1, 0x9b, - 0xb0, 0x63, 0x39, 0xe2, 0xb1, 0xa0, 0xc3, 0xbc, 0xc3, 0x97, 0xc8, 0x88, 0x5a, 0x30, - 0xc6, 0xb0, 0xe1, 0x9b, 0xa6, 0xc6, 0xbb, 0xc6, 0x86, 0xc6, 0xb8, 0xc6, 0x88, 0xe1, - 0x9a, 0xbc, 0xc5, 0xbb, 0xc5, 0xaa, 0xcd, 0xb6, 0xc6, 0xa0, 0xe2, 0xb1, 0xb7, 0xc3, - 0x8b, 0xc7, 0xa5, 0xc7, 0x9c, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x82, 0xc6, 0xb4, 0xc8, - 0xa1, 0xc3, 0xb2, 0x77, 0xc3, 0xaf, 0xc2, 0xb9, 0xc6, 0x8d, 0xe2, 0xb1, 0xbf, 0xc4, - 0xb8, 0x33, 0xc3, 0xa4, 0xc8, 0xa5, 0xc7, 0xb5, 0xc7, 0x94, 0xc2, 0xaa, 0xc2, 0xbd, - 0x40, 0xe1, 0x9a, 0xba, 0xc8, 0x80, 0xc6, 0x9c, 0xc4, 0x96, 0x32, 0xe1, 0x9a, 0xb8, - 0xc3, 0xa2, 0xc7, 0xb1, 0xc4, 0x94, 0xc7, 0x88, 0xcd, 0xb4, 0xc4, 0x8d, 0x49, 0xc4, - 0xbd, 0xe1, 0x9a, 0xb4, 0xc7, 0x88, 0xe1, 0x9b, 0xac, 0xc4, 0x9a, 0xcd, 0xbe, 0xc5, - 0x96, 0xc8, 0x92, 0xe1, 0x9b, 0xaf, 0xc9, 0x89, 0xc5, 0xb5, 0x2f, 0x41, 0xcd, 0xbe, - 0xc4, 0x9d, 0xc3, 0x86, 0xc2, 0xbb, 0x25, 0xc3, 0xaa, 0xc3, 0x86, 0xc4, 0x97, 0xc8, - 0x9f, 0xcd, 0xb5, 0xc6, 0xb9, 0xc4, 0x83, 0x35, 0xe1, 0x9b, 0x9b, 0xc4, 0xa0, 0xc4, - 0x89, 0xc8, 0xa8, 0xc4, 0x84, 0xc4, 0xba, 0xc3, 0x80, 0xc4, 0xb4, 0x53, 0xc7, 0x81, - 0xc9, 0x85, 0xc6, 0xbc, 0xcd, 0xbb, 0xc6, 0xa8, 0xc5, 0x92, 0xce, 0x87, 0xe1, 0x9b, - 0x88, 0x34, 0xc8, 0xbc, 0xc6, 0xae, 0xc3, 0xbe, 0xc4, 0x9d, 0xc8, 0x81, 0xc4, 0xa4, - 0x60, 0xc7, 0x93, 0xce, 0x86, 0xc7, 0x94, 0xc7, 0x84, 0x78, 0xc8, 0x82, 0xcd, 0xb0, - 0xc6, 0xa4, 0xc6, 0x8a, 0x65, 0xc7, 0xba, 0xc6, 0xb7, 0xc4, 0xae, 0xc9, 0x82, 0xc5, - 0xaf, 0xc4, 0x84, 0xc8, 0x96, 0xc7, 0xb6, 0xc2, 0xb1, 0xc5, 0xaf, 0xc3, 0xac, 0xe1, - 0x9b, 0xa9, 0xc4, 0x87, 0x43, 0xc8, 0x84, 0xc9, 0x82, 0xc7, 0xb3, 0x6a, 0xc5, 0x89, - 0xc3, 0xb4, 0xc8, 0xa0, 0xe1, 0x9b, 0x8d, 0xc7, 0xbd, 0xc2, 0xb3, 0xc3, 0x80, 0xc6, - 0xa6, 0xc4, 0x84, 0x69, 0xc7, 0xa7, 0xc5, 0xb5, 0xc7, 0x95, 0x21, 0xc4, 0xad, 0xe1, - 0x9b, 0xaf, 0xe1, 0x9a, 0xa8, 0xc5, 0x85, 0xc7, 0xa8, 0xc9, 0x8c, 0xc5, 0x96, 0xe2, - 0xb1, 0xa1, 0x33, 0xe1, 0x9b, 0xa2, 0xc3, 0xbc, 0x2e, 0x63, 0x2b, 0xc3, 0x9f, 0x7c, - 0xc6, 0xa4, 0xc6, 0xbf, 0xc8, 0x8d, 0xc5, 0xa8, 0xc5, 0xb5, 0xc5, 0x96, 0xe1, 0x9b, - 0x98, 0xc8, 0xb3, 0xc6, 0x90, 0xc3, 0xa6, 0x3d, 0xc9, 0x8e, 0xc8, 0xb4, 0xc7, 0xbf, - 0xc2, 0xa6, 0xe1, 0x9a, 0xad, 0x41, 0x5e, 0x40, + 0x79, 0x60, 0xc6, 0xb7, 0xc3, 0x8a, 0xc7, 0xb3, 0xe2, 0xb1, 0xbd, 0xc6, 0x85, 0xc6, + 0xb3, 0xc7, 0x9d, 0xe1, 0x9a, 0xa6, 0xc7, 0xba, 0xc4, 0xb8, 0xe1, 0x9b, 0xa1, 0xc3, + 0xbe, 0xe2, 0xb1, 0xb4, 0x7c, 0xe2, 0xb1, 0xae, 0xc8, 0x90, 0xc5, 0xab, 0xc5, 0xbc, + 0x4f, 0xc5, 0xb8, 0x6c, 0x5f, 0xe1, 0x9a, 0xbf, 0xc5, 0x8a, 0xe1, 0x9b, 0xa7, 0xc8, + 0xbc, 0xc8, 0x9b, 0xc3, 0xa7, 0xc5, 0xa6, 0xc4, 0xac, 0xe2, 0xb1, 0xab, 0x38, 0xc7, + 0x99, 0x54, 0xe2, 0xb1, 0xb6, 0x50, 0xc5, 0x8c, 0xe2, 0xb1, 0xb0, 0xc5, 0xb7, 0xc5, + 0x86, 0xc5, 0xa8, 0x3e, 0xc8, 0x88, 0xc4, 0xb5, 0xc5, 0x9c, 0xc7, 0x9b, 0xe1, 0x9b, + 0x8a, 0xc3, 0x97, 0xc8, 0xba, 0xe1, 0x9a, 0xa8, 0xc6, 0xb8, 0xc2, 0xa3, 0xe1, 0x9b, + 0x82, 0xe1, 0x9b, 0xa5, 0xc2, 0xae, 0xc8, 0x94, 0xe1, 0x9b, 0xa8, 0xc6, 0xb4, 0xc8, + 0xb9, 0xc3, 0xaf, 0xc6, 0xab, 0xc3, 0x91, 0xe2, 0xb1, 0xb3, 0xc4, 0xb6, 0xc5, 0xbf, + 0xc4, 0x8d, 0x43, 0xc6, 0xa0, 0xc4, 0xb3, 0xc6, 0x98, 0xc5, 0xbc, 0xc6, 0x9a, 0xc6, + 0xb3, 0xc3, 0x91, 0xc3, 0xa2, 0xc8, 0xa7, 0xc8, 0x9c, 0xc7, 0xb4, 0x43, 0xc7, 0x82, + 0xc2, 0xbe, 0xc7, 0xbf, 0xe1, 0x9a, 0xa9, 0xc3, 0xb2, 0xc4, 0xb2, 0xc8, 0xb0, 0xc7, + 0x80, 0xc6, 0xac, 0xc3, 0xb7, 0xc5, 0x91, 0xe1, 0x9b, 0x8f, 0xc8, 0xbb, 0xc3, 0x9f, + 0xc6, 0xa5, 0x7b, 0xc3, 0xb9, 0xcd, 0xb0, 0xe1, 0x9b, 0xa2, 0xc8, 0x8f, 0xc5, 0xa9, + 0xcd, 0xbd, 0xc8, 0x90, 0xcd, 0xb3, 0xe1, 0x9b, 0xa9, 0xc8, 0x82, 0xc3, 0xb6, 0xe1, + 0x9b, 0xa9, 0xc2, 0xb4, 0xc4, 0x9f, 0xc9, 0x8e, 0xc6, 0x8a, 0x37, 0xc7, 0x93, 0xc6, + 0x96, 0xc3, 0xa8, 0xc2, 0xae, 0xce, 0x84, 0xe2, 0xb1, 0xb2, 0xc2, 0xb6, 0xc5, 0x95, + 0xe2, 0xb1, 0xba, 0xc4, 0xa2, 0xc6, 0xbb, 0xc8, 0x93, 0xc3, 0x9f, 0xc5, 0xb0, 0xc5, + 0xb8, 0xe1, 0x9b, 0x8f, 0xc7, 0xb4, 0xc7, 0xaa, 0xc2, 0xb0, 0xe1, 0x9a, 0xb3, 0x5f, + 0xc6, 0xb1, 0xc8, 0x93, 0xc4, 0xb8, 0xe1, 0x9a, 0xa0, 0xc7, 0x9f, 0xc2, 0xb6, 0xe1, + 0x9b, 0xa2, 0xc8, 0x86, 0xe1, 0x9a, 0xa6, 0xc5, 0x8d, 0xc8, 0x89, 0xe1, 0x9a, 0xa4, + 0x44, 0xc5, 0xb3, 0xc8, 0x89, 0x5d, 0xc4, 0xa8, 0xc2, 0xa1, 0xcd, 0xbc, 0xc3, 0x88, + 0xc6, 0xb2, 0xe1, 0x9b, 0xa9, 0x26, 0xc8, 0xbb, 0xc3, 0xb9, 0xe1, 0x9b, 0x99, 0xc5, + 0xb2, 0x40, 0xc3, 0x8d, 0xc9, 0x8c, 0x5e, 0xe2, 0xb1, 0xa9, 0xc7, 0x9a, 0xe1, 0x9b, + 0xa1, 0xc4, 0x9a, 0xe1, 0x9b, 0x85, 0xc9, 0x80, 0xe1, 0x9a, 0xbf, 0xc3, 0x81, 0xe1, + 0x9b, 0x8e, 0xc8, 0x92, 0xe1, 0x9a, 0xaa, 0xc6, 0xac, 0xc9, 0x8f, 0xc7, 0x88, 0x3e, + 0xc3, 0xa8, 0xc3, 0xba, 0xc8, 0x96, 0xc6, 0xa2, 0xc7, 0x9e, 0xc8, 0x81, 0xc6, 0xac, + 0xc6, 0x85, 0xc8, 0xb6, 0xc8, 0x91, 0xc7, 0x99, 0xc6, 0x89, 0xc4, 0xae, 0xe1, 0x9b, + 0x8c, 0xe1, 0x9b, 0xad, 0xe1, 0x9b, 0xae, 0xc2, 0xb3, 0xc5, 0xa3, 0xc2, 0xa8, 0xc5, + 0xbc, 0xc3, 0xa7, 0xc8, 0xb6, 0xc6, 0xb1, 0xc8, 0x9e, 0xc6, 0x87, 0xc6, 0x80, 0x61, + 0xc6, 0xb3, 0x5c, 0xe1, 0x9a, 0xb0, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, 0xaa, 0x25, 0xcd, + 0xb4, 0xc7, 0x89, 0x28, 0xc6, 0x8d, 0x6e, 0x40, 0xc7, 0xb6, 0xc7, 0x9e, 0xc6, 0x93, + 0x2d, 0xc7, 0xaf, 0xc6, 0x86, 0xc6, 0xbf, 0xc6, 0x9a, 0xc7, 0x82, 0xc6, 0x8c, 0xc7, + 0xaa, 0xe2, 0xb1, 0xa4, 0xc7, 0xa9, 0x32, 0x75, 0xc8, 0x98, 0xc8, 0xb7, 0xe2, 0xb1, + 0xb5, 0xc5, 0x89, 0xc2, 0xb4, 0xc8, 0xb8, 0xc6, 0xad, 0xc4, 0x9a, 0xe2, 0xb1, 0xb3, + 0xc3, 0x84, 0xc2, 0xb0, 0xc8, 0xa4, 0xc6, 0xb3, ], - asset_id: [ - 0x8e, 0x95, 0x38, 0x48, 0xf3, 0xbd, 0xa6, 0xcd, 0xc0, 0x11, 0xdf, 0xd6, 0xe0, 0x1e, - 0x9f, 0x45, 0x71, 0xf9, 0x2c, 0xa1, 0x29, 0x4f, 0xd2, 0x69, 0xff, 0x98, 0x2b, 0xd2, - 0x1a, 0xac, 0xa0, 0xbc, + asset_base: [ + 0xb2, 0xd8, 0x44, 0xfe, 0xe4, 0x40, 0xbd, 0x64, 0x96, 0xd3, 0x1d, 0x5e, 0xdb, 0xee, + 0x95, 0x62, 0x3d, 0x19, 0x0e, 0xb3, 0x48, 0x4c, 0x48, 0x71, 0x0c, 0x76, 0x2f, 0x21, + 0x5b, 0x68, 0x4d, 0xbf, ], }, TestVector { @@ -627,48 +627,48 @@ pub(crate) fn test_vectors() -> Vec { 0x5b, 0xc5, 0xa8, 0x27, ], description: [ - 0xe1, 0x9b, 0x96, 0xe1, 0x9a, 0xb1, 0xc7, 0xb2, 0xc4, 0xb1, 0xc9, 0x81, 0xc2, 0xbe, - 0xc6, 0x84, 0xc4, 0x91, 0xc7, 0xb1, 0xc5, 0x83, 0xc2, 0xa3, 0xce, 0x8c, 0xce, 0x8c, - 0xc8, 0x8d, 0xc5, 0xaa, 0xc7, 0xa1, 0xe1, 0x9b, 0x9f, 0xc8, 0x8a, 0xc6, 0xbc, 0xc8, - 0xa3, 0xc8, 0xa8, 0xe1, 0x9b, 0x9b, 0xc8, 0xba, 0xc3, 0x88, 0xc7, 0x9f, 0x34, 0xc6, - 0xb9, 0xc2, 0xb9, 0xe1, 0x9a, 0xac, 0xc9, 0x88, 0xc5, 0x84, 0xc6, 0xa1, 0xe2, 0xb1, - 0xb6, 0xc2, 0xa8, 0xc6, 0xb4, 0xc7, 0xb3, 0x5a, 0x3d, 0xc7, 0xa1, 0xc8, 0x80, 0xc3, - 0x92, 0xc7, 0xa2, 0xc7, 0x93, 0xc7, 0xbb, 0xc8, 0xae, 0xc4, 0xb2, 0xc9, 0x83, 0xc6, - 0x88, 0xe2, 0xb1, 0xa2, 0xc8, 0x95, 0xc2, 0xb4, 0xc4, 0x86, 0xc5, 0xa5, 0x47, 0x70, - 0xe2, 0xb1, 0xb1, 0x62, 0xc3, 0x96, 0x5a, 0xe1, 0x9b, 0x97, 0xc5, 0x99, 0xc6, 0xb7, - 0xc3, 0xaa, 0xc5, 0x9d, 0xc7, 0x85, 0xc2, 0xa1, 0xc4, 0x93, 0xe1, 0x9a, 0xb8, 0xc3, - 0x8b, 0xe1, 0x9a, 0xad, 0xc7, 0xb3, 0xc7, 0x9a, 0xc7, 0xac, 0xe2, 0xb1, 0xaa, 0xc7, - 0xac, 0xc6, 0x91, 0xc2, 0xa9, 0xc5, 0xba, 0xc5, 0xa7, 0xc7, 0x9f, 0xc3, 0xad, 0xc8, - 0x81, 0xc8, 0x88, 0xc4, 0x86, 0xc9, 0x8d, 0xe1, 0x9b, 0xaf, 0xe1, 0x9b, 0xa1, 0xe2, - 0xb1, 0xb6, 0xc8, 0x8a, 0xc8, 0xa4, 0xc2, 0xaa, 0xe1, 0x9b, 0x9e, 0xc5, 0xa2, 0xc7, - 0x98, 0xc6, 0x93, 0xc4, 0xa8, 0xe1, 0x9b, 0x80, 0x2c, 0xc3, 0x8e, 0x25, 0x51, 0xe2, - 0xb1, 0xa7, 0xc8, 0xb3, 0xc3, 0xa4, 0xcd, 0xb6, 0xe2, 0xb1, 0xae, 0xc5, 0xb0, 0xe2, - 0xb1, 0xaa, 0xc7, 0xae, 0xc7, 0x8f, 0xc7, 0x9b, 0xc8, 0xa5, 0xc6, 0x9f, 0xc8, 0x8e, - 0x2e, 0x5a, 0xe1, 0x9a, 0xb9, 0xc2, 0xba, 0xc7, 0x8f, 0xc6, 0x90, 0xe1, 0x9a, 0xa9, - 0xc4, 0x85, 0xe1, 0x9b, 0x9f, 0x45, 0x3c, 0xc4, 0xbf, 0xc2, 0xa6, 0xc7, 0x9d, 0xe2, - 0xb1, 0xa8, 0xc7, 0x97, 0xc2, 0xbd, 0xc6, 0x8d, 0xcd, 0xb0, 0xc9, 0x83, 0x4a, 0xc8, - 0x80, 0xce, 0x89, 0xc9, 0x8f, 0xc3, 0xbb, 0xc4, 0xa7, 0xc7, 0x8c, 0x39, 0x7e, 0xc7, - 0x8f, 0xc5, 0xaa, 0x5a, 0xc3, 0x88, 0xc8, 0x93, 0xe1, 0x9b, 0xa6, 0xc5, 0x9e, 0xc8, - 0xaa, 0xc5, 0x90, 0x2e, 0xc8, 0xac, 0xe2, 0xb1, 0xb8, 0x7d, 0xc5, 0x9d, 0xc6, 0xaf, - 0xc8, 0x9d, 0xcd, 0xbe, 0xe2, 0xb1, 0xac, 0xc2, 0xbd, 0xc6, 0x9a, 0xc8, 0xb0, 0xe2, - 0xb1, 0xbc, 0xe1, 0x9b, 0x83, 0x29, 0x44, 0xe1, 0x9b, 0x9d, 0xc4, 0x87, 0xc6, 0x99, - 0xc7, 0xb6, 0xe1, 0x9b, 0x90, 0xcd, 0xb5, 0x3b, 0xc8, 0x92, 0xc6, 0x80, 0xc8, 0xa7, - 0xc9, 0x8e, 0xc2, 0xa8, 0xc7, 0x8b, 0xc2, 0xb1, 0xc5, 0xb4, 0xe2, 0xb1, 0xbf, 0xe1, - 0x9b, 0x86, 0xe1, 0x9a, 0xb8, 0x46, 0xe1, 0x9b, 0x81, 0x55, 0xc7, 0xa2, 0x26, 0xc5, - 0x99, 0x37, 0xe1, 0x9a, 0xa5, 0xc3, 0x93, 0xc7, 0x94, 0x6f, 0xe2, 0xb1, 0xba, 0xc7, - 0x86, 0xc2, 0xa9, 0xc5, 0x87, 0xc6, 0x9e, 0xc3, 0xae, 0xc8, 0xa7, 0xc3, 0x8c, 0x30, - 0xc7, 0x82, 0xc7, 0xaf, 0xc5, 0xa6, 0x77, 0xe1, 0x9b, 0x80, 0x5c, 0xcd, 0xbd, 0xc2, - 0xb5, 0xc7, 0x8f, 0x3c, 0xc3, 0x97, 0xc2, 0xb3, 0x58, 0xc6, 0x84, 0xc7, 0x86, 0xc6, - 0xaa, 0x61, 0xc5, 0x8c, 0xc5, 0xa1, 0xe2, 0xb1, 0xbf, 0xe1, 0x9b, 0xb0, 0xc3, 0x96, - 0xc8, 0x9e, 0xc8, 0xbb, 0xe1, 0x9a, 0xa0, 0xc6, 0x9d, 0xc4, 0xb3, 0xc8, 0x91, 0xc8, - 0xb2, 0xc8, 0xa5, 0xc8, 0x81, 0xc5, 0x80, 0xc8, 0x93, 0x62, 0x30, 0xe1, 0x9b, 0xa6, - 0xc5, 0x93, 0xc6, 0x81, 0xe1, 0x9a, 0xb3, 0x72, 0xc8, 0xa8, 0xc5, 0x90, 0xc8, 0x85, - 0xc3, 0x81, 0xc4, 0x97, 0xe1, 0x9b, 0x92, 0x5a, + 0xc7, 0x96, 0xc8, 0xad, 0xc4, 0xbd, 0xe1, 0x9b, 0x9b, 0xe1, 0x9b, 0x96, 0xe2, 0xb1, + 0xb2, 0xc3, 0x8f, 0xe1, 0x9b, 0x91, 0xc5, 0x85, 0xe1, 0x9a, 0xa2, 0xc4, 0xba, 0xc3, + 0xa8, 0xc3, 0xaa, 0xc3, 0xa9, 0xc8, 0x93, 0xc8, 0x9b, 0xc8, 0x80, 0xc4, 0xa5, 0xc5, + 0xa9, 0xc4, 0x90, 0x6f, 0xc2, 0xaf, 0xc3, 0x95, 0xc6, 0xa6, 0xc8, 0x86, 0xe1, 0x9a, + 0xbd, 0xc8, 0x87, 0xc7, 0x97, 0xc6, 0xaa, 0x79, 0x52, 0xc7, 0x89, 0xc2, 0xa1, 0xc4, + 0xa7, 0xc9, 0x8d, 0x53, 0xc8, 0x89, 0xc7, 0xa4, 0xe1, 0x9b, 0x84, 0xc5, 0xac, 0x79, + 0xc8, 0xbc, 0xc4, 0xb0, 0xc6, 0xa9, 0xe1, 0x9a, 0xa4, 0xe2, 0xb1, 0xb6, 0xc7, 0x86, + 0xc4, 0x9b, 0x72, 0xc7, 0x88, 0xc2, 0xbc, 0xe1, 0x9a, 0xa4, 0xcd, 0xb0, 0xc6, 0xb7, + 0xe1, 0x9b, 0x80, 0xe2, 0xb1, 0xb8, 0xc5, 0x89, 0xc9, 0x84, 0x35, 0xc3, 0xa3, 0xe1, + 0x9b, 0x90, 0xc7, 0x9c, 0x31, 0xc5, 0x9a, 0xc5, 0xa9, 0xc8, 0x88, 0xce, 0x8c, 0xc4, + 0x88, 0xc4, 0x95, 0xc8, 0xaa, 0x69, 0x46, 0xc8, 0x8d, 0xc5, 0xb9, 0xcd, 0xb0, 0xe1, + 0x9a, 0xb7, 0xc8, 0x83, 0xc4, 0x99, 0xe1, 0x9b, 0x81, 0xc4, 0x90, 0xc2, 0xb3, 0xc3, + 0x9b, 0x37, 0xc7, 0x95, 0xc3, 0x86, 0xe1, 0x9a, 0xbc, 0xc3, 0xba, 0xe2, 0xb1, 0xa5, + 0xc8, 0xac, 0x51, 0xc6, 0xa4, 0xc4, 0xb4, 0x21, 0xc5, 0x94, 0xc5, 0x92, 0xc4, 0xa3, + 0xc6, 0x8c, 0xc8, 0x84, 0xc8, 0xa9, 0xc3, 0x81, 0xc5, 0xb2, 0x53, 0xc7, 0x8a, 0xe1, + 0x9a, 0xba, 0xc4, 0xb7, 0xc8, 0x9e, 0xc3, 0xb6, 0xc7, 0xb1, 0xe2, 0xb1, 0xad, 0xc7, + 0x80, 0xc7, 0xb7, 0x51, 0xce, 0x85, 0xc4, 0xab, 0xc7, 0xaa, 0xc3, 0xad, 0xc5, 0x97, + 0xc8, 0xbe, 0x2e, 0x36, 0x71, 0xe1, 0x9b, 0x8a, 0xc5, 0xb1, 0xc4, 0x9b, 0xe1, 0x9b, + 0x8a, 0xc5, 0xb7, 0xc5, 0xb9, 0xc3, 0xbe, 0xc7, 0x80, 0xc3, 0xad, 0xc8, 0x80, 0xe1, + 0x9b, 0x9d, 0xc5, 0xb2, 0xc6, 0xaa, 0xc8, 0xa6, 0xc5, 0x93, 0xc6, 0xb2, 0xe1, 0x9a, + 0xb0, 0xc5, 0x86, 0xc5, 0xa2, 0xe1, 0x9a, 0xaf, 0x77, 0xc4, 0xb1, 0xe1, 0x9a, 0xa0, + 0xc4, 0x91, 0xc8, 0xb9, 0x21, 0xc3, 0x9a, 0xc6, 0x88, 0xc3, 0x80, 0xc4, 0x80, 0xc4, + 0x83, 0xc7, 0x81, 0x24, 0xc3, 0xa5, 0xc6, 0xbf, 0xc7, 0xb1, 0xe1, 0x9b, 0x98, 0xc8, + 0xaf, 0xc5, 0x9a, 0xc7, 0xa1, 0xc4, 0x89, 0x4f, 0xc2, 0xaf, 0xc9, 0x8c, 0x2f, 0xc4, + 0x94, 0x74, 0xc5, 0xb8, 0x26, 0xe1, 0x9b, 0x85, 0xc6, 0x97, 0xc2, 0xa3, 0xc5, 0xb4, + 0xc7, 0xbe, 0xc6, 0xa3, 0xc4, 0x9b, 0xe1, 0x9b, 0xa2, 0xc8, 0xb9, 0x7d, 0xc8, 0xa2, + 0xc7, 0x8a, 0xe2, 0xb1, 0xaa, 0xc3, 0x92, 0x5b, 0xc3, 0xaa, 0xc8, 0xa4, 0xc7, 0xad, + 0xc4, 0x91, 0xc8, 0xad, 0xc8, 0x8a, 0xc4, 0x89, 0x3e, 0xc5, 0xba, 0x58, 0xc4, 0xb7, + 0xc5, 0x82, 0xe1, 0x9b, 0x82, 0x51, 0xc5, 0xa5, 0xc3, 0x96, 0xc2, 0xb1, 0xc2, 0xa4, + 0xc8, 0x8f, 0xc3, 0xac, 0xc6, 0x91, 0xe1, 0x9b, 0xa3, 0xc8, 0xba, 0xc4, 0x82, 0x21, + 0xc6, 0xb3, 0xc7, 0xb1, 0xc3, 0x92, 0x2f, 0xc4, 0x9a, 0xc7, 0x86, 0xc4, 0x82, 0x7c, + 0x2e, 0xc8, 0xb6, 0xe1, 0x9b, 0x8a, 0x2f, 0x34, 0xc4, 0xaf, 0xc7, 0xb8, 0xc9, 0x8b, + 0xc6, 0xb6, 0xe1, 0x9b, 0x91, 0xc7, 0xb2, 0xc5, 0x87, 0xce, 0x85, 0xc4, 0x8b, 0xc7, + 0x88, 0xc5, 0xb7, 0xc8, 0x9c, 0xc6, 0xbb, 0xc4, 0x9e, 0xc4, 0xb2, 0xc4, 0xa8, 0xe1, + 0x9b, 0x83, 0xc7, 0x91, 0xc8, 0x82, 0xc8, 0xb6, 0xc5, 0x8e, 0xe1, 0x9b, 0xaf, 0xc7, + 0x89, 0xc4, 0x98, 0xc7, 0x90, 0xc2, 0xb8, 0xc8, 0xa2, 0xc8, 0xbf, 0xc5, 0xb8, 0x6e, + 0xc2, 0xbc, 0xc3, 0xb0, 0xc3, 0xa0, 0xc6, 0xb6, ], - asset_id: [ - 0x08, 0xfe, 0xbb, 0x02, 0x39, 0x9f, 0x3d, 0x81, 0x83, 0x8b, 0x51, 0xbf, 0x9a, 0xb5, - 0x35, 0xe9, 0x5b, 0xba, 0x0f, 0x19, 0x9a, 0xda, 0x1c, 0x26, 0x65, 0xd4, 0x39, 0x4e, - 0xa0, 0xb2, 0xa7, 0x02, + asset_base: [ + 0xee, 0xb5, 0xc9, 0x51, 0xcd, 0x1c, 0x9b, 0x20, 0x4f, 0x65, 0xe6, 0xf2, 0xb9, 0xeb, + 0xa1, 0xd2, 0x16, 0x1e, 0x21, 0x2b, 0x6f, 0x8e, 0x1c, 0x37, 0x96, 0x22, 0xbb, 0x7c, + 0x44, 0xb8, 0x8e, 0xa7, ], }, TestVector { @@ -678,48 +678,48 @@ pub(crate) fn test_vectors() -> Vec { 0x8c, 0x10, 0x44, 0x20, ], description: [ - 0xc3, 0x92, 0xe1, 0x9b, 0x95, 0xe1, 0x9a, 0xbf, 0xc4, 0xbc, 0x42, 0xc3, 0x88, 0xc7, - 0xb1, 0x42, 0xc8, 0xb4, 0xc4, 0x8b, 0xc4, 0xa9, 0xc4, 0xbe, 0xc2, 0xa4, 0xc2, 0xa3, - 0xc8, 0xaf, 0xc4, 0x87, 0xc4, 0xaa, 0xc3, 0x94, 0xcd, 0xb0, 0xc8, 0x87, 0xc5, 0xaa, - 0x3d, 0xc2, 0xbb, 0xc7, 0x9c, 0xc3, 0xb1, 0xc2, 0xb9, 0xc8, 0x94, 0xc4, 0x93, 0x5e, - 0xe1, 0x9b, 0xa1, 0xc8, 0x91, 0xc7, 0xb7, 0x41, 0x46, 0x44, 0xc4, 0xac, 0xc6, 0x83, - 0xc5, 0xbe, 0xc3, 0xa7, 0xc8, 0x9a, 0xe1, 0x9b, 0x86, 0xc3, 0xa5, 0xc3, 0x9f, 0xc6, - 0xb5, 0xe1, 0x9b, 0xa8, 0xe2, 0xb1, 0xbc, 0xc6, 0xaa, 0xe1, 0x9a, 0xa1, 0xc3, 0x81, - 0xce, 0x87, 0xc3, 0x8c, 0xc6, 0xa0, 0xe1, 0x9a, 0xa7, 0x38, 0xc4, 0x98, 0xc4, 0x99, - 0xc2, 0xbd, 0xc3, 0xa4, 0xc3, 0xab, 0xc4, 0xa7, 0xe1, 0x9a, 0xa3, 0xcd, 0xb4, 0x7b, - 0xe1, 0x9a, 0xb7, 0xc4, 0xbb, 0xe2, 0xb1, 0xb3, 0xe2, 0xb1, 0xa7, 0xc6, 0x97, 0xc3, - 0x9f, 0xc3, 0x91, 0xce, 0x8c, 0xc3, 0x84, 0xc7, 0xac, 0xcd, 0xb1, 0xe2, 0xb1, 0xb9, - 0xe2, 0xb1, 0xac, 0xc9, 0x87, 0xc3, 0x9a, 0xc7, 0xb9, 0xc5, 0x96, 0xc7, 0x8e, 0xc4, - 0x8e, 0xc7, 0xbb, 0xc4, 0x9b, 0xe1, 0x9b, 0x9c, 0xc4, 0xad, 0xc7, 0x81, 0xc4, 0xa4, - 0x39, 0xc6, 0x81, 0xc6, 0x89, 0xc7, 0xa9, 0xc2, 0xa3, 0xe2, 0xb1, 0xac, 0xc9, 0x80, - 0x51, 0xcd, 0xbd, 0xc6, 0xb8, 0xc9, 0x81, 0xc5, 0x93, 0xc8, 0xa0, 0x5d, 0xc4, 0x9c, - 0xc6, 0x90, 0x35, 0xc4, 0xb7, 0xc8, 0x9a, 0xc5, 0x90, 0xc8, 0x94, 0xc8, 0x95, 0xc8, - 0x92, 0xc9, 0x8c, 0xc4, 0xb5, 0x49, 0xc6, 0xbe, 0xc9, 0x84, 0xc2, 0xbf, 0xc6, 0xbb, - 0xc2, 0xab, 0xe1, 0x9b, 0xac, 0xc6, 0x87, 0x6a, 0xc6, 0xbc, 0xc4, 0xae, 0xe1, 0x9b, - 0x81, 0xc4, 0xb3, 0xe2, 0xb1, 0xb4, 0xc3, 0x96, 0x2f, 0xc4, 0x94, 0xc7, 0x8c, 0xc3, - 0xb2, 0xc2, 0xab, 0xc5, 0x80, 0xc5, 0xac, 0xe2, 0xb1, 0xad, 0xc4, 0x9c, 0xc4, 0xae, - 0xc7, 0xb7, 0x7d, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, 0xbd, 0xc4, 0xb3, 0xcd, 0xb3, 0xc2, - 0xa6, 0xe1, 0x9a, 0xbc, 0x33, 0xe2, 0xb1, 0xb8, 0xc7, 0xa8, 0xe1, 0x9a, 0xa1, 0xe1, - 0x9b, 0xad, 0xc5, 0xac, 0xce, 0x8a, 0xc4, 0x94, 0xc3, 0x80, 0xc7, 0xb4, 0xc7, 0xa9, - 0xc9, 0x84, 0xc2, 0xb1, 0xc5, 0x9c, 0xc7, 0x88, 0xe2, 0xb1, 0xb6, 0xcd, 0xb0, 0xc5, - 0x93, 0xc2, 0xb7, 0xe1, 0x9b, 0x8e, 0xe1, 0x9a, 0xa4, 0xc4, 0x87, 0xc4, 0x8c, 0xc6, - 0x92, 0xc3, 0xa9, 0xc5, 0xa7, 0xc7, 0x96, 0xc3, 0xbd, 0xc4, 0x83, 0xc3, 0xb4, 0x44, - 0xc3, 0x96, 0xc2, 0xb3, 0x7b, 0xe1, 0x9b, 0x8d, 0xc6, 0x86, 0xc6, 0x89, 0x61, 0xc7, - 0x90, 0xc2, 0xb1, 0xc5, 0xaf, 0xc7, 0x94, 0xc6, 0xb5, 0xc7, 0xae, 0xe1, 0x9b, 0x8f, - 0xc7, 0xa6, 0xc8, 0xac, 0xc5, 0x92, 0xc5, 0xb3, 0xc5, 0xb3, 0xc8, 0x92, 0xc3, 0x8e, - 0xc4, 0x93, 0xc3, 0xb0, 0xc4, 0x9b, 0xc4, 0x8c, 0xc3, 0x83, 0xce, 0x89, 0xc6, 0x9b, - 0x79, 0xc2, 0xa5, 0xc7, 0xa9, 0xc4, 0xa3, 0xc2, 0xa2, 0xc3, 0x90, 0xc6, 0x9e, 0xc6, - 0x9d, 0xe1, 0x9a, 0xbb, 0xc4, 0x8c, 0xc5, 0xa8, 0xc8, 0xb2, 0xc3, 0xac, 0x5e, 0xc8, - 0xb2, 0x38, 0xc7, 0xa0, 0xc4, 0x9e, 0xc5, 0x8f, 0xc6, 0xa9, 0xe1, 0x9a, 0xb1, 0xe1, - 0x9b, 0x84, 0xcd, 0xbe, 0x61, 0xc7, 0x87, 0xce, 0x85, 0xc4, 0x89, 0xc8, 0x96, 0xc8, - 0xa3, 0xc8, 0x96, 0xc3, 0xab, 0xc6, 0xae, 0xce, 0x88, 0xe1, 0x9a, 0xbf, 0xc5, 0x91, - 0xe1, 0x9b, 0xab, 0xc7, 0x96, 0x33, 0xc3, 0xab, 0xe2, 0xb1, 0xb9, 0xe2, 0xb1, 0xac, - 0xe2, 0xb1, 0xbb, 0xe2, 0xb1, 0xae, 0xc2, 0xbf, + 0xc3, 0x82, 0xc9, 0x85, 0xc3, 0xa9, 0xc7, 0xac, 0xc3, 0x93, 0xe1, 0x9b, 0xa7, 0xe1, + 0x9b, 0x81, 0xc8, 0xb5, 0x26, 0xe2, 0xb1, 0xbf, 0xc3, 0x96, 0xc4, 0xa2, 0xc5, 0x8c, + 0x4c, 0xc7, 0xbe, 0xce, 0x89, 0xc8, 0xa0, 0xc5, 0xb7, 0xc5, 0x92, 0xc7, 0xa6, 0xc4, + 0x8f, 0xc8, 0x84, 0x2f, 0xe2, 0xb1, 0xad, 0xc3, 0xab, 0xc6, 0xbc, 0xe1, 0x9a, 0xa8, + 0xc2, 0xb9, 0x72, 0x6b, 0xc3, 0xa9, 0xc3, 0xa3, 0xc9, 0x87, 0xc4, 0xb8, 0xc6, 0xbc, + 0xc8, 0xb8, 0xc6, 0x80, 0xe1, 0x9a, 0xbc, 0xc6, 0xb7, 0xc3, 0x9c, 0x3e, 0xc8, 0x8f, + 0xe1, 0x9b, 0x92, 0xc7, 0x88, 0x33, 0xc6, 0xab, 0xc8, 0x80, 0xc8, 0x9e, 0xe2, 0xb1, + 0xa2, 0x29, 0xc3, 0x9d, 0xc6, 0x82, 0xc3, 0xad, 0xc8, 0xa1, 0xe1, 0x9b, 0x99, 0xc4, + 0xad, 0xc9, 0x8c, 0xc7, 0xa8, 0xc8, 0x89, 0xc4, 0x90, 0xe1, 0x9b, 0xa0, 0xc4, 0xae, + 0xc6, 0xb5, 0xc7, 0x92, 0xc6, 0xbc, 0xc8, 0xa1, 0xc3, 0xac, 0xc3, 0x83, 0xe1, 0x9b, + 0x83, 0xc3, 0xb9, 0xc3, 0x9d, 0xc5, 0xa8, 0xe2, 0xb1, 0xbb, 0xc8, 0x9f, 0xc4, 0xb0, + 0xe2, 0xb1, 0xa3, 0xc7, 0xa8, 0xc4, 0x82, 0xc7, 0x87, 0xe1, 0x9b, 0x9e, 0xc8, 0x81, + 0xc3, 0xb7, 0xc5, 0x95, 0x34, 0xc6, 0xb8, 0xc5, 0xbd, 0xc4, 0x82, 0xc6, 0x92, 0xc4, + 0x9f, 0xc5, 0x9d, 0xc8, 0x9a, 0xc4, 0x89, 0xc3, 0x81, 0xc5, 0x8d, 0xe1, 0x9b, 0x85, + 0xc8, 0x84, 0xcd, 0xbe, 0xc6, 0xb5, 0xc7, 0xb5, 0xc4, 0xbe, 0x4d, 0xc6, 0x8c, 0xc6, + 0x83, 0xc6, 0x99, 0xc7, 0xa3, 0xc4, 0xae, 0xe1, 0x9b, 0x8d, 0xe1, 0x9b, 0x86, 0xe1, + 0x9a, 0xa1, 0xc6, 0x84, 0xc3, 0xb0, 0xc9, 0x8b, 0xcd, 0xb0, 0xc7, 0x8c, 0xc6, 0xb4, + 0xc5, 0x82, 0xe2, 0xb1, 0xba, 0xc2, 0xbb, 0xc4, 0xbd, 0xc2, 0xaf, 0xc6, 0xba, 0x7b, + 0xc4, 0x89, 0x25, 0xe1, 0x9b, 0xae, 0xc7, 0x9d, 0xe1, 0x9b, 0x8b, 0xe2, 0xb1, 0xb8, + 0xe2, 0xb1, 0xa5, 0xc3, 0xb4, 0xc8, 0xb2, 0xc5, 0x9f, 0xc8, 0x9c, 0xc3, 0xa7, 0x38, + 0xc7, 0x8e, 0xc7, 0x92, 0xc6, 0xa8, 0xc6, 0x88, 0xe2, 0xb1, 0xa2, 0xc5, 0xb1, 0x39, + 0x6b, 0x4c, 0xe1, 0x9b, 0x86, 0xe1, 0x9a, 0xa8, 0xc2, 0xa6, 0xc5, 0xbf, 0xc5, 0xb5, + 0xc4, 0xaa, 0xe2, 0xb1, 0xa2, 0x3b, 0xc8, 0x98, 0xc9, 0x8f, 0xc4, 0x83, 0xc8, 0x91, + 0xc7, 0x8e, 0xe2, 0xb1, 0xab, 0xc8, 0x94, 0xc6, 0xb3, 0xc3, 0x93, 0xc3, 0x92, 0x3d, + 0xc4, 0x86, 0xc6, 0x88, 0xc4, 0xa3, 0xc5, 0x98, 0xc8, 0xb9, 0xc8, 0xb5, 0x26, 0xc4, + 0xb9, 0xc3, 0x90, 0xc5, 0xa7, 0xc6, 0xa6, 0xe2, 0xb1, 0xba, 0xc2, 0xb8, 0xc5, 0x93, + 0xce, 0x89, 0xc3, 0xa0, 0xc3, 0x8e, 0xe1, 0x9b, 0x81, 0xc2, 0xbb, 0xc7, 0xba, 0xc4, + 0x83, 0xc9, 0x83, 0xc5, 0xa8, 0xc4, 0x84, 0xc3, 0xb5, 0xc3, 0xad, 0x5d, 0xc4, 0x9b, + 0xc7, 0xbb, 0xe2, 0xb1, 0xb4, 0xc4, 0xb5, 0xc4, 0x8c, 0xc3, 0x8a, 0xc6, 0xb2, 0xe2, + 0xb1, 0xa5, 0xc6, 0xb1, 0xc4, 0xa7, 0xc3, 0xb3, 0xe1, 0x9b, 0xa6, 0xc7, 0x9d, 0xc4, + 0xb3, 0xc3, 0xbd, 0x3b, 0xe1, 0x9b, 0xa5, 0x3e, 0xc3, 0xbe, 0xc7, 0x87, 0xc3, 0xa4, + 0xc6, 0xbb, 0xe1, 0x9b, 0xad, 0xe2, 0xb1, 0xa4, 0xce, 0x89, 0xc8, 0xa2, 0xc8, 0x84, + 0x7a, 0xc8, 0x84, 0xc4, 0xb5, 0xc4, 0xbb, 0xc5, 0xa2, 0xc7, 0xaf, 0x49, 0xe1, 0x9b, + 0xb0, 0xc8, 0xab, 0xc6, 0xa7, 0xc7, 0xa4, 0xe2, 0xb1, 0xbd, 0xc4, 0x8f, 0xc6, 0x96, + 0xe1, 0x9b, 0x86, 0xc6, 0x9f, 0xc3, 0x83, 0xc4, 0x8b, 0x2b, 0xe1, 0x9a, 0xa9, 0x38, + 0xe2, 0xb1, 0xbc, 0xc3, 0x8c, 0xc8, 0x94, 0xcd, 0xb0, 0xc3, 0xb5, 0xc7, 0x82, 0x36, + 0x23, 0x41, 0xe2, 0xb1, 0xa8, 0x67, 0x5a, 0x5a, ], - asset_id: [ - 0xda, 0x5b, 0xdf, 0x78, 0xe8, 0x94, 0xa9, 0x67, 0xb8, 0x2b, 0xfe, 0xc3, 0x50, 0x04, - 0x41, 0x5e, 0xe1, 0xc8, 0xc3, 0xf2, 0x66, 0x22, 0xa2, 0xc2, 0x0c, 0xf5, 0x13, 0x9b, - 0x79, 0xf1, 0x08, 0xba, + asset_base: [ + 0x65, 0x3e, 0x99, 0x25, 0x68, 0x30, 0x69, 0xc9, 0x88, 0x32, 0xaf, 0x7d, 0x3a, 0xa9, + 0xd3, 0x14, 0x41, 0xcc, 0x0f, 0x76, 0x34, 0x07, 0x91, 0x49, 0xf3, 0xef, 0xcb, 0x64, + 0xc7, 0x36, 0x97, 0x3d, ], }, TestVector { @@ -729,48 +729,48 @@ pub(crate) fn test_vectors() -> Vec { 0x19, 0x68, 0x73, 0x26, ], description: [ - 0xe1, 0x9b, 0xa7, 0xe2, 0xb1, 0xb3, 0xc4, 0x8f, 0xe1, 0x9b, 0x97, 0x23, 0xe1, 0x9b, - 0xaf, 0x70, 0xc6, 0x9f, 0xc8, 0x82, 0xc4, 0x9c, 0xc7, 0x96, 0xc5, 0x81, 0xc3, 0x90, - 0xc5, 0xaf, 0xc6, 0x81, 0x33, 0xc8, 0xb2, 0x46, 0xc8, 0xba, 0x65, 0xcd, 0xb6, 0xe2, - 0xb1, 0xb7, 0xc8, 0xae, 0x5a, 0xc3, 0x87, 0xc6, 0xb3, 0xc6, 0x9f, 0x3d, 0xc3, 0x8a, - 0xc2, 0xb2, 0xc6, 0xab, 0xe1, 0x9b, 0x90, 0xc8, 0xbb, 0xe2, 0xb1, 0xab, 0xc3, 0x9f, - 0xc7, 0xb9, 0x67, 0xe2, 0xb1, 0xba, 0xe1, 0x9b, 0x88, 0xc4, 0x91, 0xc5, 0x9a, 0xe1, - 0x9b, 0x86, 0xe2, 0xb1, 0xbf, 0xc5, 0x9c, 0xc5, 0xad, 0x7d, 0xe2, 0xb1, 0xb1, 0xc4, - 0x9e, 0xc6, 0x90, 0xc5, 0x8b, 0xc4, 0xa3, 0xc5, 0x8c, 0xc3, 0xaf, 0xc4, 0x90, 0xc4, - 0xb2, 0x76, 0xc8, 0xbe, 0x33, 0xc9, 0x85, 0xc5, 0x80, 0xc7, 0x98, 0x6b, 0xe1, 0x9a, - 0xa8, 0x5e, 0xc4, 0xa3, 0xe1, 0x9b, 0x9c, 0xc7, 0x87, 0xc4, 0xbd, 0xce, 0x89, 0xc8, - 0xb4, 0x50, 0x3d, 0xc7, 0xa7, 0xc6, 0x97, 0xe1, 0x9b, 0xac, 0xc3, 0xb4, 0xe2, 0xb1, - 0xbc, 0xc6, 0x9f, 0xc4, 0xb5, 0xc5, 0xb7, 0xe1, 0x9a, 0xac, 0xc7, 0xa1, 0xe1, 0x9a, - 0xbe, 0xe2, 0xb1, 0xbb, 0xc6, 0x94, 0xc7, 0x90, 0xe1, 0x9b, 0x82, 0xe1, 0x9b, 0x80, - 0xc6, 0x98, 0xc4, 0x9f, 0xc7, 0xac, 0xc6, 0xab, 0xc5, 0xb2, 0x48, 0x6e, 0xc2, 0xa5, - 0xc4, 0x8c, 0xc9, 0x83, 0xc9, 0x86, 0x73, 0x29, 0x6b, 0xc3, 0xbd, 0xc2, 0xbf, 0xc4, - 0x9b, 0xe1, 0x9a, 0xbf, 0xc7, 0xbe, 0xe1, 0x9b, 0x83, 0xe2, 0xb1, 0xab, 0xc7, 0x8d, - 0xe2, 0xb1, 0xa2, 0x57, 0xc5, 0x84, 0xc6, 0xbc, 0xe1, 0x9b, 0xaf, 0xc5, 0xa3, 0xc8, - 0x8f, 0x25, 0xe2, 0xb1, 0xa3, 0x6d, 0x35, 0xc8, 0xae, 0x34, 0xe2, 0xb1, 0xb9, 0xe2, - 0xb1, 0xad, 0xc3, 0xb6, 0x71, 0xce, 0x84, 0xc8, 0x92, 0xc5, 0xa7, 0xc6, 0xb9, 0xce, - 0x87, 0xc4, 0xb8, 0xe1, 0x9b, 0xa8, 0xe1, 0x9b, 0x89, 0x76, 0xc4, 0xaf, 0xc4, 0x85, - 0xc2, 0xac, 0xc4, 0xbd, 0x7c, 0xc4, 0xba, 0xc4, 0x80, 0xc4, 0xa0, 0xc9, 0x82, 0xc3, - 0xb3, 0xe1, 0x9b, 0x9e, 0xc2, 0xaf, 0xc3, 0x86, 0x7e, 0xc6, 0xa0, 0xc4, 0x8d, 0xc6, - 0x8a, 0xc2, 0xba, 0xc4, 0xbd, 0xe1, 0x9b, 0x84, 0x75, 0xe1, 0x9a, 0xa1, 0xe2, 0xb1, - 0xbe, 0xc7, 0xa1, 0xc7, 0x90, 0xcd, 0xbb, 0x29, 0xc5, 0xa4, 0xc4, 0xb8, 0xc4, 0xbd, - 0xc9, 0x87, 0xc4, 0x9a, 0xc6, 0xa2, 0xe2, 0xb1, 0xa3, 0xc5, 0xae, 0xc2, 0xb4, 0xc5, - 0x89, 0xc7, 0x93, 0xc2, 0xa9, 0xc4, 0x9c, 0xe1, 0x9a, 0xa9, 0xc9, 0x81, 0xc6, 0x88, - 0xc3, 0x95, 0xc6, 0xb5, 0x56, 0x6b, 0x69, 0xc4, 0x86, 0xc4, 0xa5, 0xc4, 0xb3, 0xc3, - 0x85, 0xe2, 0xb1, 0xb0, 0xc4, 0x8e, 0x38, 0x5e, 0x3c, 0xc7, 0xb1, 0xc8, 0xa1, 0xc5, - 0x84, 0xc6, 0x85, 0xc8, 0xb9, 0xc6, 0x96, 0xc8, 0x94, 0xc3, 0x98, 0xc5, 0xb6, 0xc8, - 0x9a, 0xc8, 0x97, 0xc3, 0xa4, 0xc3, 0x81, 0xc3, 0xa9, 0x5c, 0xc7, 0xb7, 0xe1, 0x9b, - 0xac, 0xc8, 0x90, 0x2c, 0xe1, 0x9b, 0xa2, 0xc6, 0xb8, 0xc7, 0x93, 0xc4, 0x9e, 0xc4, - 0xbd, 0xc4, 0x90, 0xe1, 0x9a, 0xb7, 0xc9, 0x85, 0xc7, 0x9f, 0xc4, 0xbf, 0xc5, 0xba, - 0xc2, 0xa9, 0xe1, 0x9b, 0x9f, 0x76, 0xc3, 0xa3, 0xc8, 0xa6, 0xc5, 0x8c, 0xc6, 0xa0, - 0xc9, 0x8d, 0xc3, 0xa0, 0xc8, 0xa7, 0x2c, 0xc6, 0x80, 0xc8, 0xbf, 0x75, 0x2b, 0xc7, - 0xbe, 0xc5, 0xb5, 0xe1, 0x9b, 0x87, 0xc3, 0xbe, 0xcd, 0xba, 0xe1, 0x9b, 0x8f, 0xc6, - 0x82, 0xc7, 0xa7, 0xe1, 0x9b, 0x87, 0x62, 0xc3, 0x95, 0xc4, 0xbf, 0xe1, 0x9b, 0xaf, - 0xc4, 0xb3, 0xc7, 0xaf, 0xc3, 0x95, 0xc7, 0x9f, + 0xc8, 0x9b, 0x56, 0xe1, 0x9b, 0x9d, 0xc6, 0xaf, 0xe2, 0xb1, 0xbd, 0xc3, 0x80, 0xc5, + 0x8f, 0xe1, 0x9b, 0xaa, 0xc7, 0xbd, 0x45, 0x30, 0xe1, 0x9a, 0xbd, 0x62, 0xc5, 0x8a, + 0xc5, 0xba, 0xc7, 0x83, 0xc4, 0xa7, 0xe1, 0x9a, 0xa5, 0xc6, 0xab, 0xc6, 0x94, 0xe2, + 0xb1, 0xa0, 0xc3, 0x81, 0x6f, 0xc3, 0x84, 0x31, 0xc5, 0xbe, 0xc3, 0x87, 0xc7, 0xa8, + 0xe1, 0x9a, 0xa0, 0xc2, 0xa7, 0xc5, 0xb1, 0xc8, 0x85, 0xc8, 0xa1, 0x48, 0x2c, 0x41, + 0x53, 0xe2, 0xb1, 0xb4, 0xc7, 0xad, 0xc7, 0xb9, 0xc8, 0x9e, 0xc6, 0xa5, 0x4d, 0xe2, + 0xb1, 0xa4, 0xc3, 0x96, 0xc8, 0xbf, 0xc4, 0x95, 0xc6, 0x94, 0xc4, 0xa5, 0x64, 0xc4, + 0xbe, 0x69, 0xc8, 0xb9, 0x7d, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0x9b, 0xce, 0x86, 0xe1, + 0x9a, 0xa9, 0xc4, 0x9f, 0x30, 0xc8, 0x8b, 0xe1, 0x9b, 0xa7, 0xc6, 0xbf, 0xc7, 0xbb, + 0xc7, 0x9a, 0xc8, 0x94, 0xc8, 0x9d, 0xc8, 0x8c, 0xc3, 0xb2, 0xc7, 0x95, 0x34, 0x71, + 0x38, 0xc6, 0xb5, 0xc4, 0xa6, 0xc8, 0x96, 0xce, 0x89, 0xc4, 0x93, 0x26, 0xc8, 0xa4, + 0xc6, 0xa7, 0xe1, 0x9b, 0xa7, 0x3b, 0xc4, 0x80, 0xc5, 0xb8, 0xc7, 0x86, 0xc8, 0xa0, + 0xc4, 0xbb, 0xc4, 0xa1, 0xc8, 0x88, 0x70, 0x5d, 0xe2, 0xb1, 0xa5, 0xc9, 0x89, 0xc7, + 0xbc, 0xc6, 0xb3, 0xc9, 0x8a, 0xc3, 0xbe, 0xe2, 0xb1, 0xa9, 0xc2, 0xbd, 0xc5, 0x88, + 0xc5, 0x88, 0xc4, 0xbc, 0xc6, 0x88, 0x5c, 0xc8, 0x86, 0xc3, 0xa8, 0x23, 0x58, 0xe1, + 0x9a, 0xa2, 0xc4, 0xb2, 0xc7, 0xbc, 0x5e, 0xe2, 0xb1, 0xb2, 0x45, 0xc7, 0xb7, 0xc9, + 0x81, 0xc2, 0xba, 0xe1, 0x9b, 0x91, 0xc3, 0x87, 0xc9, 0x8c, 0xce, 0x84, 0xe1, 0x9a, + 0xa8, 0xc8, 0x8c, 0xc7, 0x8b, 0xce, 0x86, 0xe2, 0xb1, 0xaf, 0x32, 0xc8, 0x88, 0xc4, + 0x9c, 0xe1, 0x9a, 0xac, 0xe1, 0x9b, 0x9e, 0xc6, 0xb1, 0xc7, 0x90, 0xe2, 0xb1, 0xa6, + 0xc8, 0x91, 0xc5, 0x9a, 0xc6, 0x8e, 0xc6, 0x84, 0xe1, 0x9a, 0xbd, 0xc4, 0xa6, 0xc5, + 0x84, 0xc3, 0x91, 0xc6, 0xbf, 0xc4, 0xb9, 0xce, 0x85, 0xc2, 0xa1, 0xc7, 0x93, 0xc9, + 0x8e, 0xc5, 0xb4, 0xc8, 0x91, 0xc5, 0xa1, 0xe1, 0x9b, 0x95, 0xc8, 0xa9, 0xe1, 0x9b, + 0x92, 0x5f, 0xc6, 0xba, 0x56, 0xc4, 0x95, 0x32, 0xe2, 0xb1, 0xa5, 0x53, 0xc3, 0xba, + 0x23, 0xc7, 0x99, 0xc7, 0xa8, 0xc3, 0x81, 0xc6, 0xa1, 0x34, 0xc5, 0xb1, 0xc3, 0x85, + 0xe1, 0x9b, 0xac, 0xc7, 0xad, 0xc4, 0x90, 0xc5, 0x9f, 0xc5, 0xaf, 0xc8, 0x9e, 0xc7, + 0xb5, 0xc5, 0x82, 0xc9, 0x81, 0xc5, 0x8d, 0xc5, 0x92, 0xc6, 0x9d, 0xc5, 0xba, 0xe1, + 0x9a, 0xa7, 0xc4, 0x81, 0xe2, 0xb1, 0xa1, 0xc6, 0xa5, 0xe2, 0xb1, 0xb9, 0xc4, 0x9f, + 0xce, 0x88, 0xc6, 0x97, 0xc6, 0xaf, 0xe1, 0x9b, 0xac, 0xc5, 0xa1, 0xe2, 0xb1, 0xb3, + 0xc9, 0x83, 0xc5, 0x86, 0xc6, 0xaa, 0xe2, 0xb1, 0xb0, 0xc7, 0x8b, 0xc5, 0xae, 0xc2, + 0xb5, 0x42, 0xc6, 0xab, 0x58, 0xc8, 0x93, 0xc6, 0x82, 0xe2, 0xb1, 0xb6, 0xc7, 0x92, + 0xe1, 0x9b, 0x95, 0xc4, 0x81, 0xc3, 0x9f, 0xc2, 0xb7, 0xc5, 0x8f, 0xc8, 0xb7, 0xc3, + 0xac, 0xc4, 0xbf, 0x48, 0xc5, 0xba, 0xe1, 0x9a, 0xb9, 0xc4, 0x8c, 0xe1, 0x9b, 0x87, + 0xc6, 0x93, 0xc4, 0x8a, 0xc7, 0x99, 0xc6, 0x98, 0xc6, 0xb7, 0xc5, 0xb9, 0xc4, 0x8b, + 0xc3, 0xbb, 0xc8, 0x8b, 0xc3, 0xbb, 0xc5, 0x93, 0xe1, 0x9b, 0xad, 0xe1, 0x9a, 0xb1, + 0xc3, 0x82, 0xc6, 0x99, 0xc5, 0x93, 0xc6, 0x8e, 0xcd, 0xb4, 0xe2, 0xb1, 0xa8, 0xc6, + 0x97, 0xc6, 0x99, 0xc5, 0x80, 0xc4, 0x9c, 0x78, 0xcd, 0xb2, 0xc4, 0xb3, 0xc5, 0x80, + 0xe1, 0x9b, 0x99, 0xc7, 0xa8, 0xc5, 0x8e, 0x5a, ], - asset_id: [ - 0x4f, 0x20, 0x3c, 0x3a, 0x6f, 0x5b, 0x58, 0xbb, 0x4b, 0x01, 0x14, 0xf0, 0x2c, 0x1f, - 0x4e, 0xbb, 0x78, 0x4a, 0xa3, 0xa3, 0x7e, 0x5d, 0xae, 0x4a, 0x27, 0xf0, 0xea, 0xcc, - 0xf6, 0x8b, 0xab, 0x29, + asset_base: [ + 0x76, 0xb6, 0xcc, 0x39, 0x90, 0xd8, 0xf1, 0x14, 0x96, 0x01, 0xe6, 0x8f, 0x2e, 0xca, + 0xcd, 0x97, 0x0f, 0xa0, 0xb7, 0xc0, 0xbe, 0xab, 0x7c, 0x88, 0x28, 0x21, 0x4a, 0x37, + 0xce, 0x87, 0x10, 0xa3, ], }, TestVector { @@ -780,48 +780,48 @@ pub(crate) fn test_vectors() -> Vec { 0xbf, 0xcd, 0x06, 0x38, ], description: [ - 0xc8, 0xb4, 0x34, 0xc3, 0x8c, 0xc7, 0x89, 0xc7, 0x86, 0x5e, 0xc5, 0xbb, 0xc7, 0xba, - 0xe1, 0x9b, 0x96, 0x5d, 0xc5, 0x88, 0x52, 0xcd, 0xb1, 0xe1, 0x9b, 0xad, 0xce, 0x88, - 0xc7, 0x80, 0xc5, 0x91, 0xc6, 0xba, 0xc6, 0x8f, 0xc6, 0x81, 0xc7, 0xa8, 0xc6, 0xb1, - 0x6b, 0xc6, 0x8c, 0xc5, 0x8f, 0xe2, 0xb1, 0xb3, 0xc5, 0x95, 0xc5, 0xa3, 0xc7, 0xaa, - 0xc5, 0xb5, 0xc7, 0xbe, 0xc6, 0xb2, 0xc6, 0x8d, 0x61, 0x23, 0xe2, 0xb1, 0xb3, 0xc4, - 0xbb, 0xc5, 0x96, 0xc6, 0x91, 0xc7, 0x99, 0x60, 0x2c, 0xe1, 0x9b, 0x82, 0xce, 0x86, - 0xc8, 0x92, 0xc4, 0xa1, 0xc4, 0xa2, 0xc7, 0xb4, 0x56, 0x23, 0xe1, 0x9b, 0xae, 0xc7, - 0x8d, 0xc3, 0xa0, 0xc6, 0xa4, 0xc4, 0x9b, 0xc9, 0x81, 0xc8, 0xb6, 0xe1, 0x9b, 0xa0, - 0xe2, 0xb1, 0xbc, 0xe1, 0x9b, 0x82, 0xc8, 0x98, 0xc3, 0xb7, 0xe1, 0x9b, 0x8b, 0xe1, - 0x9b, 0x80, 0xe1, 0x9a, 0xa5, 0x2a, 0xc3, 0x90, 0x5c, 0xc4, 0xb8, 0xc8, 0x9e, 0xc5, - 0x80, 0xc8, 0x9b, 0xe2, 0xb1, 0xaf, 0xc7, 0x9f, 0xc7, 0x97, 0xc3, 0x9d, 0xe1, 0x9b, - 0x9e, 0xc4, 0xaf, 0xc4, 0xb8, 0xc2, 0xb9, 0x3c, 0xc4, 0x9a, 0xc8, 0x80, 0xc6, 0x9d, - 0x2f, 0x47, 0xc6, 0xb0, 0xc6, 0xb4, 0xc7, 0xb9, 0xe2, 0xb1, 0xb6, 0xc8, 0xa5, 0xc7, - 0x91, 0xe1, 0x9b, 0x9d, 0xc6, 0x95, 0x74, 0xe1, 0x9b, 0x9b, 0xc4, 0xac, 0xc6, 0xa3, - 0xe1, 0x9b, 0xa8, 0xc4, 0x8d, 0xc6, 0x97, 0xc5, 0xb6, 0xc6, 0xb8, 0xe2, 0xb1, 0xa8, - 0xc2, 0xbb, 0xe1, 0x9b, 0x95, 0xc7, 0x91, 0xe1, 0x9a, 0xba, 0xc8, 0xbe, 0xc3, 0xa1, - 0xc2, 0xbf, 0xc6, 0x9d, 0xcd, 0xb2, 0x51, 0xc6, 0x8d, 0xe1, 0x9a, 0xb9, 0xc8, 0x8d, - 0xc5, 0xaf, 0xc4, 0xa9, 0xc6, 0xa4, 0xc5, 0x8b, 0xc6, 0xbd, 0xc3, 0xb6, 0xc4, 0x8d, - 0xc7, 0x80, 0xc6, 0x95, 0xc5, 0xb9, 0xc2, 0xae, 0xe1, 0x9a, 0xa4, 0x54, 0x69, 0xc3, - 0x9b, 0xc4, 0x8e, 0xc6, 0x9f, 0xc8, 0xb5, 0x65, 0xc5, 0x95, 0xcd, 0xb3, 0xc5, 0x9f, - 0xc7, 0xae, 0xc4, 0xa4, 0xc3, 0x83, 0xc3, 0x82, 0xe1, 0x9a, 0xa4, 0xc4, 0x93, 0xc7, - 0x88, 0x67, 0xc3, 0xaf, 0xc3, 0xb9, 0xc5, 0xb5, 0x46, 0xcd, 0xb1, 0x5e, 0x28, 0xe1, - 0x9a, 0xb6, 0xc6, 0x86, 0x67, 0xc3, 0xb9, 0xc5, 0xb2, 0xc5, 0x8c, 0xc4, 0xb5, 0xc3, - 0xba, 0xe1, 0x9a, 0xbe, 0xc6, 0x85, 0x5a, 0xcd, 0xb4, 0xe1, 0x9b, 0xa8, 0xc6, 0x86, - 0xc7, 0xb5, 0xc6, 0x83, 0xc3, 0x8d, 0xc4, 0xa0, 0xc7, 0x9d, 0xc6, 0xab, 0x57, 0xc4, - 0xa3, 0xc3, 0x9d, 0xc7, 0x88, 0x3f, 0xc8, 0x99, 0xc5, 0x98, 0xc4, 0x91, 0xe1, 0x9b, - 0x88, 0xe2, 0xb1, 0xa1, 0xc7, 0x97, 0xc5, 0x8d, 0xe1, 0x9a, 0xb8, 0xc8, 0xa8, 0xc2, - 0xac, 0x4d, 0xc6, 0xa2, 0xe2, 0xb1, 0xb8, 0x3f, 0xe2, 0xb1, 0xb8, 0xc8, 0xa4, 0xc7, - 0x98, 0xc7, 0x98, 0x63, 0xc6, 0xb3, 0xc5, 0x8f, 0xc8, 0x86, 0xc4, 0xbf, 0xe2, 0xb1, - 0xb8, 0xc8, 0xb6, 0xc4, 0x98, 0xc4, 0x8a, 0xc6, 0x93, 0xe1, 0x9b, 0x87, 0xc7, 0x93, - 0xc6, 0xbb, 0xc8, 0x84, 0xc7, 0x92, 0xc8, 0x97, 0xe2, 0xb1, 0xa2, 0xc6, 0x8b, 0xc5, - 0xa1, 0xc8, 0x8b, 0xc9, 0x8b, 0xc3, 0x9a, 0xe1, 0x9b, 0x81, 0xc2, 0xa2, 0xc6, 0x95, - 0xc8, 0x99, 0x38, 0xc4, 0xb2, 0x68, 0xc7, 0x83, 0xe1, 0x9a, 0xb2, 0xc4, 0xae, 0xc8, - 0x8d, 0xc5, 0xb6, 0xc5, 0x9e, 0x79, 0xc6, 0xa9, 0x45, 0xc6, 0x9f, 0xc7, 0x99, 0xc7, - 0x99, 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0xa1, 0xc7, 0xbc, 0xc8, 0x88, 0xc6, 0xbe, 0xc4, - 0xb3, 0xc8, 0x90, 0x4c, 0xc8, 0xba, 0xc3, 0x9d, 0xe1, 0x9b, 0x8f, 0xe1, 0x9a, 0xb7, - 0xe2, 0xb1, 0xb6, 0xc4, 0x83, 0xc5, 0xa9, 0x5a, + 0xc5, 0x87, 0xe2, 0xb1, 0xbb, 0xc8, 0xa4, 0xc5, 0x85, 0xc4, 0x84, 0xe1, 0x9b, 0x99, + 0xc9, 0x85, 0xe1, 0x9a, 0xbe, 0xc4, 0x85, 0xc7, 0x8b, 0xe1, 0x9b, 0xa2, 0xc6, 0xa4, + 0x5a, 0xc6, 0xad, 0xc7, 0x80, 0x23, 0xc5, 0x9f, 0xc4, 0xb2, 0xe1, 0x9b, 0x94, 0xc3, + 0xb1, 0xc6, 0xae, 0xe1, 0x9a, 0xaa, 0x71, 0xc6, 0xa1, 0xc8, 0x9e, 0xc8, 0x97, 0xc6, + 0xac, 0xc3, 0x83, 0xc8, 0x9a, 0xc6, 0xa7, 0x41, 0xe1, 0x9a, 0xbf, 0xc2, 0xaa, 0xc8, + 0x9b, 0xc4, 0xa4, 0xc3, 0x97, 0xc8, 0x9d, 0x55, 0xc4, 0x92, 0xc5, 0xa2, 0xc5, 0x8b, + 0xc8, 0xaa, 0xc6, 0xa3, 0xc3, 0x81, 0xc6, 0x81, 0x7a, 0xcd, 0xb0, 0x6e, 0xc3, 0xb4, + 0xc4, 0x90, 0xc4, 0xaa, 0xe2, 0xb1, 0xa6, 0xc4, 0xa0, 0xc2, 0xbf, 0xc7, 0xa7, 0xc3, + 0xad, 0x5b, 0xc7, 0xa3, 0xc5, 0xb3, 0xc7, 0xbe, 0xc6, 0x9a, 0xc7, 0x80, 0xc2, 0xab, + 0xc5, 0x99, 0xe1, 0x9b, 0x91, 0xc6, 0x90, 0x68, 0xc4, 0xb9, 0xc6, 0x87, 0x66, 0xc3, + 0xb6, 0xc5, 0xb8, 0xc6, 0x9a, 0x7b, 0xc7, 0x81, 0xc5, 0x8b, 0xc5, 0x87, 0xc3, 0x9b, + 0xc6, 0x94, 0xc4, 0x8d, 0xc2, 0xb9, 0xe2, 0xb1, 0xbd, 0xc6, 0x9e, 0xc7, 0xbc, 0x68, + 0xc3, 0xaa, 0x5b, 0xc5, 0x85, 0xc9, 0x87, 0xe1, 0x9b, 0x85, 0x5d, 0xc9, 0x8c, 0xe1, + 0x9b, 0xa6, 0x5d, 0xcd, 0xb7, 0xc7, 0x9f, 0x30, 0xc4, 0x9d, 0xc2, 0xb7, 0xe1, 0x9b, + 0xa0, 0xc4, 0xab, 0xc2, 0xaf, 0xc5, 0xb2, 0xe1, 0x9b, 0xa6, 0xc3, 0x81, 0xc5, 0xab, + 0xc8, 0xa0, 0xe1, 0x9b, 0x9c, 0xc5, 0xa5, 0xc4, 0x9e, 0xc3, 0x94, 0xc6, 0xa0, 0x7e, + 0xc6, 0x8c, 0xc5, 0x80, 0xc8, 0x9a, 0xcd, 0xb6, 0xc6, 0xa4, 0xc5, 0x9b, 0xe1, 0x9b, + 0x87, 0xe1, 0x9a, 0xa4, 0x62, 0xe2, 0xb1, 0xa4, 0x35, 0x3f, 0xc2, 0xaa, 0xc7, 0xb0, + 0xc5, 0xb4, 0xc9, 0x82, 0xe1, 0x9a, 0xab, 0xc8, 0xb1, 0xc8, 0xae, 0xc6, 0xbc, 0xc8, + 0x98, 0x33, 0xc5, 0xa4, 0x31, 0xe1, 0x9a, 0xbd, 0xc8, 0xb7, 0xc4, 0xa2, 0x45, 0xc5, + 0x8a, 0xe1, 0x9a, 0xb0, 0xc2, 0xb2, 0xc6, 0x8f, 0xc8, 0x96, 0xc6, 0x93, 0xc6, 0x89, + 0xe2, 0xb1, 0xb4, 0xc7, 0xb9, 0xc3, 0x88, 0xc7, 0x9f, 0xc7, 0x85, 0xe2, 0xb1, 0xa8, + 0xc7, 0xa9, 0xc8, 0x99, 0xc4, 0x8c, 0xc4, 0xaf, 0xc4, 0x99, 0x3b, 0xc5, 0xa8, 0xe1, + 0x9a, 0xaa, 0xc6, 0x9e, 0xc6, 0x86, 0xc2, 0xb5, 0x43, 0xc2, 0xaa, 0xe1, 0x9b, 0x95, + 0xc8, 0xba, 0xc2, 0xac, 0xc7, 0x9e, 0xe2, 0xb1, 0xb5, 0xc8, 0xb3, 0xe1, 0x9b, 0xa4, + 0xc8, 0xa6, 0xc6, 0x8c, 0xc6, 0x99, 0xc6, 0x89, 0xc5, 0x82, 0xc7, 0xa4, 0x7c, 0xce, + 0x89, 0xc6, 0xbf, 0xc8, 0x9d, 0xc3, 0x92, 0xc6, 0xab, 0xe1, 0x9a, 0xab, 0xe1, 0x9b, + 0x84, 0xc6, 0x9e, 0x21, 0x79, 0xcd, 0xb1, 0xc4, 0xb1, 0xce, 0x8c, 0xe1, 0x9b, 0x98, + 0xe1, 0x9b, 0x8d, 0xc6, 0xb0, 0xe1, 0x9a, 0xa5, 0xc7, 0xb9, 0xe1, 0x9b, 0x9d, 0x48, + 0xc4, 0xbe, 0xc8, 0xaf, 0xc8, 0x89, 0xe1, 0x9b, 0xb0, 0xc2, 0xb8, 0xe2, 0xb1, 0xb1, + 0xc3, 0x96, 0xc5, 0xb1, 0x44, 0xc3, 0x9e, 0x6c, 0xe1, 0x9a, 0xbb, 0xc4, 0xaf, 0xc4, + 0x8c, 0xc2, 0xa1, 0xc3, 0xa1, 0xc3, 0x98, 0xc8, 0xac, 0xc3, 0xa3, 0xc8, 0xa2, 0xcd, + 0xbb, 0xc6, 0xb3, 0xe1, 0x9b, 0x9c, 0x51, 0xc5, 0xa3, 0xc5, 0xb3, 0x77, 0xc3, 0x87, + 0xc3, 0xbb, 0x3b, 0xc8, 0x98, 0xc5, 0xb9, 0x2a, 0x4a, 0xc5, 0xb7, 0xc9, 0x8c, 0x6e, + 0xe1, 0x9b, 0xa9, 0xc3, 0x94, 0xc3, 0x9f, 0xc3, 0xaa, 0xe1, 0x9b, 0xb0, 0xc3, 0x85, + 0x59, 0xc8, 0xbb, 0xc4, 0x87, 0xc7, 0xb2, 0xcd, 0xbe, 0xc5, 0xb4, 0x6c, 0xe2, 0xb1, + 0xad, 0x6d, 0xc2, 0xa9, 0xc4, 0x8b, 0xc6, 0xb6, ], - asset_id: [ - 0x61, 0xb6, 0x64, 0xff, 0x70, 0xb4, 0x5a, 0x10, 0x5a, 0x5e, 0x5e, 0x2a, 0x65, 0xbd, - 0x5b, 0x37, 0x7a, 0x0d, 0x89, 0xf0, 0x65, 0x6d, 0xb9, 0xe5, 0x72, 0x43, 0x2a, 0x3b, - 0x41, 0x09, 0xb8, 0xba, + asset_base: [ + 0xba, 0xb2, 0xba, 0xb5, 0x2d, 0x54, 0x67, 0xd4, 0xa6, 0x36, 0x0c, 0xb2, 0x74, 0xc9, + 0x2a, 0x7b, 0x8e, 0x0b, 0xc5, 0x02, 0x28, 0xa9, 0x68, 0x0f, 0xcd, 0xa0, 0x38, 0x17, + 0x62, 0x3f, 0x48, 0x91, ], }, TestVector { @@ -831,48 +831,48 @@ pub(crate) fn test_vectors() -> Vec { 0xbd, 0xb7, 0x75, 0x19, ], description: [ - 0xc4, 0xae, 0xc6, 0x83, 0xc3, 0xb4, 0xe1, 0x9b, 0xa2, 0xc6, 0x93, 0xc9, 0x86, 0xc4, - 0xa7, 0xe2, 0xb1, 0xb9, 0xc8, 0x9b, 0x3d, 0xcd, 0xbd, 0x3f, 0x54, 0xc8, 0xa9, 0xce, - 0x84, 0xc8, 0x87, 0xc4, 0x8d, 0xe1, 0x9b, 0x83, 0xc6, 0xac, 0xe1, 0x9b, 0x9f, 0xc5, - 0x83, 0xc7, 0x89, 0x66, 0xc4, 0x86, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, 0x8f, 0xc6, 0x99, - 0xc5, 0xb0, 0xc4, 0x8e, 0xc4, 0x8b, 0xc7, 0x93, 0xc5, 0x9b, 0xc5, 0xb7, 0xc8, 0x89, - 0xc3, 0x9b, 0x6e, 0xc5, 0xbd, 0xc2, 0xbe, 0xc4, 0x9e, 0x5f, 0xe1, 0x9b, 0x9a, 0xc4, - 0x86, 0xe2, 0xb1, 0xa2, 0x7c, 0xcd, 0xb7, 0xc3, 0xab, 0x43, 0xc7, 0xa7, 0xe2, 0xb1, - 0xa0, 0xcd, 0xbc, 0xc8, 0x90, 0xc7, 0x9f, 0xc7, 0xb4, 0xc8, 0x9d, 0xc4, 0x9e, 0xe1, - 0x9a, 0xb3, 0x38, 0xc6, 0xaa, 0xe2, 0xb1, 0xb4, 0xc8, 0x97, 0xc8, 0x96, 0xc6, 0x90, - 0xc7, 0xaf, 0xc7, 0x97, 0x77, 0x5f, 0xc4, 0x9d, 0xc7, 0xa9, 0xc8, 0x9f, 0xe1, 0x9a, - 0xb0, 0xc3, 0x90, 0x35, 0x49, 0xc4, 0xb9, 0xc5, 0x96, 0xcd, 0xbc, 0xc7, 0xb3, 0xc8, - 0xa4, 0x37, 0x46, 0xc2, 0xba, 0xe1, 0x9b, 0x89, 0xc5, 0x86, 0xc6, 0x84, 0xc5, 0x9b, - 0xe1, 0x9b, 0x93, 0xc7, 0x81, 0xc5, 0x8d, 0x29, 0xc4, 0x9c, 0xc6, 0xbe, 0xc4, 0xad, - 0xc8, 0x83, 0xe1, 0x9b, 0x81, 0xc4, 0xa2, 0xc8, 0x9d, 0xc4, 0x9c, 0xc7, 0xae, 0xc7, - 0x80, 0x35, 0xe1, 0x9a, 0xa6, 0xe1, 0x9a, 0xac, 0xc4, 0xb7, 0xe1, 0x9b, 0xa2, 0xc7, - 0xa6, 0xe2, 0xb1, 0xad, 0xc5, 0x89, 0xc6, 0x95, 0xc4, 0x98, 0xc8, 0x8d, 0xe2, 0xb1, - 0xa3, 0xc6, 0xb3, 0xc7, 0xaf, 0xe1, 0x9a, 0xb7, 0xc4, 0xb8, 0xe2, 0xb1, 0xa8, 0xc8, - 0xa9, 0xc8, 0xba, 0xc3, 0x97, 0xe1, 0x9b, 0x89, 0xc3, 0x93, 0xc5, 0x9a, 0xc4, 0x8b, - 0xc5, 0xa6, 0xc4, 0xad, 0xc5, 0xb3, 0xe2, 0xb1, 0xb5, 0x66, 0xc6, 0x9c, 0x40, 0xc2, - 0xa1, 0xc8, 0x96, 0xe2, 0xb1, 0xa3, 0xc3, 0xbf, 0xc5, 0xa5, 0xcd, 0xb0, 0xc8, 0xb8, - 0xc6, 0xa1, 0x33, 0xe1, 0x9a, 0xb1, 0xe1, 0x9a, 0xbd, 0x33, 0xc3, 0xa2, 0xc6, 0xb7, - 0xc4, 0xb9, 0xc7, 0xba, 0x30, 0xc5, 0x9f, 0xc8, 0xad, 0xc5, 0x9c, 0xc4, 0xa5, 0xc2, - 0xbc, 0xce, 0x88, 0x4c, 0xc8, 0x9f, 0x7c, 0xc5, 0xbd, 0xc5, 0xa2, 0xe2, 0xb1, 0xae, - 0xc3, 0xb2, 0xc7, 0xb6, 0xc4, 0x96, 0xc5, 0xaa, 0xc6, 0x87, 0xc5, 0xb6, 0xe1, 0x9b, - 0x9a, 0xc3, 0xb1, 0xcd, 0xbb, 0xc6, 0xbd, 0xcd, 0xb5, 0x70, 0xce, 0x88, 0xc4, 0x8a, - 0xc2, 0xa8, 0xc4, 0xa6, 0xc2, 0xb0, 0xc4, 0xaf, 0xc6, 0xb5, 0xcd, 0xbd, 0x34, 0xc4, - 0x9a, 0xc4, 0x93, 0xc8, 0xbb, 0xc5, 0x99, 0xc7, 0x9d, 0xc2, 0xb4, 0xc9, 0x86, 0xe1, - 0x9b, 0x91, 0xc4, 0x9b, 0xc8, 0x94, 0xc7, 0xae, 0xe1, 0x9b, 0x9c, 0xc8, 0xab, 0xe1, - 0x9b, 0xa9, 0xc3, 0x99, 0xc8, 0x9c, 0xc3, 0x83, 0x7a, 0xe1, 0x9b, 0x87, 0xe1, 0x9a, - 0xad, 0xc5, 0x8c, 0xe1, 0x9a, 0xaa, 0xc7, 0xbe, 0x5f, 0xc8, 0xb5, 0xc6, 0x99, 0xe1, - 0x9b, 0xa7, 0xc7, 0xb1, 0xc6, 0x90, 0xc7, 0xb0, 0xc4, 0xac, 0xc3, 0x90, 0x77, 0xc7, - 0xb8, 0xc6, 0xa9, 0xc7, 0xa7, 0xce, 0x88, 0xe1, 0x9a, 0xa1, 0x36, 0xc4, 0xbb, 0xc4, - 0xa1, 0xc8, 0x8c, 0xc3, 0xb4, 0xc2, 0xa2, 0xe1, 0x9a, 0xb9, 0x68, 0xc7, 0x9a, 0xc5, - 0x9e, 0x75, 0xcd, 0xb5, 0xe1, 0x9b, 0x98, 0xc7, 0x82, 0xce, 0x88, 0xe1, 0x9b, 0x9c, - 0xc5, 0xa6, 0xc7, 0x98, 0xc5, 0xa7, 0x30, 0xc8, 0xbf, 0xcd, 0xb6, 0xc5, 0xbe, 0xc7, - 0x97, 0x6e, 0xc6, 0xab, 0xc8, 0x92, 0xc8, 0x88, 0xc5, 0x87, 0xc7, 0x95, 0xc3, 0x97, - 0xc4, 0xbb, 0xc7, 0x9c, 0xc5, 0x80, 0xc2, 0xb6, + 0xc7, 0x93, 0xc6, 0xb5, 0xc4, 0x82, 0xc6, 0x85, 0xe1, 0x9a, 0xac, 0xc7, 0x91, 0xc4, + 0xad, 0xe1, 0x9b, 0x84, 0xe2, 0xb1, 0xbc, 0xc2, 0xbb, 0xc8, 0xa9, 0xc7, 0xaf, 0xc4, + 0xa6, 0x79, 0xc6, 0x8a, 0xc5, 0xac, 0xc6, 0x98, 0xe1, 0x9b, 0x8f, 0xc5, 0x8b, 0xc3, + 0x81, 0xe1, 0x9b, 0x84, 0xe1, 0x9a, 0xa9, 0xe2, 0xb1, 0xa2, 0xe1, 0x9b, 0x92, 0x40, + 0xe2, 0xb1, 0xa0, 0xc4, 0xa6, 0xc8, 0xac, 0xc7, 0xb9, 0xc9, 0x8d, 0xc7, 0xab, 0xc3, + 0x8a, 0xc6, 0xb8, 0x7c, 0xc5, 0xa1, 0xc8, 0xaf, 0xc4, 0x80, 0xc3, 0xb4, 0xc5, 0x82, + 0xc7, 0xb7, 0xc6, 0x8a, 0xc6, 0xb2, 0x2b, 0x6b, 0xc6, 0x9d, 0xe2, 0xb1, 0xb6, 0xc7, + 0x94, 0xcd, 0xb5, 0xc5, 0x96, 0xc7, 0xae, 0xc4, 0xb1, 0xc4, 0xb0, 0xe1, 0x9b, 0x8e, + 0xcd, 0xb2, 0xe1, 0x9b, 0x83, 0xc5, 0xb5, 0xc8, 0x84, 0xc6, 0x88, 0xcd, 0xb7, 0xe2, + 0xb1, 0xa5, 0xc8, 0xa6, 0xc5, 0x8c, 0xc5, 0x8f, 0x60, 0xc8, 0x83, 0xc6, 0x9f, 0xc4, + 0xa2, 0xc5, 0x9f, 0x5b, 0xc8, 0x97, 0xcd, 0xbc, 0xc4, 0xbb, 0xc5, 0x93, 0xc6, 0xa9, + 0xc3, 0x8e, 0x31, 0xe2, 0xb1, 0xae, 0x49, 0xc7, 0x93, 0xc2, 0xba, 0xc5, 0x9c, 0xc2, + 0xb4, 0xe1, 0x9a, 0xa6, 0xc9, 0x8b, 0x75, 0x36, 0xe1, 0x9b, 0x89, 0x6c, 0xc3, 0x95, + 0xc4, 0xba, 0x7e, 0x21, 0xc8, 0xac, 0xc4, 0xa0, 0x4f, 0xc5, 0xbc, 0x5b, 0xce, 0x88, + 0x37, 0x38, 0xc6, 0x8b, 0xc2, 0xb9, 0x58, 0xc3, 0x86, 0xc4, 0x96, 0x23, 0xc6, 0xbb, + 0xc8, 0xa3, 0x5a, 0xc6, 0xbc, 0xe1, 0x9b, 0x89, 0xc3, 0x82, 0xc3, 0x9d, 0x69, 0xe1, + 0x9a, 0xbe, 0xe1, 0x9b, 0x8d, 0xc3, 0xb6, 0x73, 0xc4, 0xb9, 0xe1, 0x9b, 0xaa, 0x6a, + 0xc2, 0xa8, 0xc6, 0xbb, 0xce, 0x85, 0xc7, 0x94, 0xc5, 0xaa, 0xc2, 0xb5, 0x5e, 0xc2, + 0xb5, 0xc3, 0xa1, 0xc6, 0x93, 0xc3, 0xb6, 0xc5, 0x95, 0xc6, 0x91, 0xc7, 0xb1, 0xc8, + 0xb3, 0x66, 0x21, 0xc4, 0x8a, 0xc7, 0xb9, 0xc5, 0x8d, 0x33, 0xc9, 0x8c, 0x5e, 0xc4, + 0xb6, 0xc7, 0x88, 0xc3, 0xae, 0xc5, 0x8e, 0xc7, 0xaf, 0x4e, 0xc4, 0xa6, 0xe1, 0x9b, + 0xad, 0xc7, 0x8c, 0xe1, 0x9a, 0xbf, 0xc7, 0x89, 0xc9, 0x88, 0xc6, 0xab, 0xe2, 0xb1, + 0xbf, 0xc7, 0x85, 0xc6, 0xa1, 0xc3, 0x86, 0xe1, 0x9b, 0x9c, 0x3b, 0xc2, 0xa6, 0x7c, + 0xc3, 0x94, 0x5c, 0xc8, 0x82, 0xc3, 0xad, 0xc7, 0x98, 0xc5, 0xab, 0xc7, 0xa1, 0xe1, + 0x9a, 0xa3, 0xc8, 0xa3, 0xc6, 0x96, 0xc5, 0x82, 0xe1, 0x9b, 0x84, 0xc8, 0xb0, 0xc2, + 0xaa, 0xc4, 0x94, 0x68, 0xc6, 0x8f, 0xe2, 0xb1, 0xb8, 0xc6, 0xae, 0x54, 0xe1, 0x9b, + 0x88, 0xc7, 0x82, 0xc3, 0x81, 0xc8, 0xaf, 0xc7, 0xa0, 0x3d, 0xc4, 0x98, 0xc4, 0x97, + 0xc7, 0xba, 0xe1, 0x9b, 0xa8, 0xc6, 0xba, 0xc3, 0x93, 0xc2, 0xa7, 0xc7, 0xa1, 0xc5, + 0x8d, 0xc7, 0x87, 0xc3, 0xa1, 0xc5, 0xa4, 0xc6, 0x9b, 0x21, 0xc5, 0xa8, 0xc8, 0xb2, + 0xc4, 0xb9, 0xc6, 0x81, 0xc7, 0xb6, 0xc8, 0xaa, 0xc3, 0x89, 0xe1, 0x9b, 0xac, 0x45, + 0xc3, 0xa0, 0xc4, 0xae, 0xe1, 0x9b, 0xa5, 0xc8, 0xad, 0xe1, 0x9a, 0xb6, 0x55, 0xe1, + 0x9b, 0x9d, 0xc4, 0x97, 0xc8, 0x89, 0xc8, 0xa8, 0xc5, 0xbe, 0xc7, 0x90, 0xc2, 0xab, + 0xc8, 0xbd, 0xc3, 0x96, 0xc7, 0x99, 0xc8, 0xa8, 0xc2, 0xa1, 0xe1, 0x9b, 0x80, 0xc7, + 0x9a, 0xc7, 0xba, 0xc5, 0xac, 0x26, 0xc5, 0x96, 0xe1, 0x9a, 0xa4, 0xc8, 0x9d, 0xc6, + 0xa6, 0xe1, 0x9a, 0xb9, 0xc4, 0x86, 0xe1, 0x9a, 0xbf, 0xc8, 0xab, 0xce, 0x87, 0xe1, + 0x9b, 0x94, 0xc4, 0x81, 0xc3, 0xaf, 0xc5, 0xb6, 0xc8, 0x8c, 0xe1, 0x9a, 0xbd, 0xc3, + 0xbc, 0xc3, 0x9b, 0xc4, 0xb5, 0x7b, 0xc8, 0xaf, ], - asset_id: [ - 0x8b, 0x7d, 0xde, 0x16, 0x1b, 0xad, 0x63, 0xb2, 0x3f, 0x2a, 0xa4, 0x2d, 0x23, 0xa3, - 0x7b, 0x5e, 0x0e, 0x33, 0x61, 0xa9, 0x85, 0x97, 0x47, 0x96, 0xf7, 0x10, 0xef, 0x46, - 0x4e, 0xa7, 0xa0, 0xaf, + asset_base: [ + 0x86, 0x7f, 0xd2, 0x6b, 0xe6, 0xf1, 0x84, 0x89, 0x32, 0x91, 0xf8, 0x22, 0x44, 0xee, + 0x64, 0xa0, 0x63, 0xac, 0x28, 0xd1, 0xb2, 0x32, 0x0e, 0x4b, 0x40, 0xca, 0x6a, 0xf2, + 0x0a, 0xa8, 0x11, 0xbe, ], }, TestVector { @@ -882,48 +882,48 @@ pub(crate) fn test_vectors() -> Vec { 0x79, 0xc0, 0x76, 0x27, ], description: [ - 0xc7, 0xa3, 0xc8, 0x83, 0xc6, 0xa9, 0xc6, 0x9c, 0xe1, 0x9b, 0x95, 0xc3, 0x94, 0xc2, - 0xa1, 0xc2, 0xa5, 0xc5, 0x92, 0xe2, 0xb1, 0xbe, 0xe1, 0x9a, 0xa9, 0x60, 0xc6, 0xbc, - 0x51, 0xe1, 0x9a, 0xa9, 0xe1, 0x9a, 0xb9, 0xe1, 0x9a, 0xae, 0xc8, 0xb1, 0xcd, 0xb7, - 0xc8, 0x9a, 0xc8, 0xa2, 0xc6, 0x91, 0xc5, 0x90, 0xc5, 0x8a, 0xc8, 0x94, 0xe1, 0x9a, - 0xbe, 0xce, 0x88, 0xc6, 0xb8, 0xc8, 0x8e, 0xc2, 0xbe, 0xce, 0x86, 0xc5, 0xb4, 0xe1, - 0x9a, 0xa1, 0xc5, 0xbe, 0xc2, 0xa1, 0x39, 0xc8, 0xbd, 0xc4, 0xbb, 0xc8, 0x96, 0xe1, - 0x9b, 0x98, 0x72, 0xc3, 0x98, 0xc8, 0x9e, 0x33, 0x40, 0xc3, 0x9c, 0xe1, 0x9b, 0x97, - 0xc8, 0x8e, 0xc7, 0xab, 0x4b, 0xc6, 0xa1, 0xc6, 0x91, 0xc3, 0x90, 0xc7, 0xa5, 0xc4, - 0x88, 0xc5, 0x96, 0xc5, 0xb2, 0xc9, 0x84, 0xc6, 0xa6, 0xe1, 0x9a, 0xb0, 0xe2, 0xb1, - 0xad, 0xc3, 0x99, 0x45, 0xc3, 0x9d, 0xc3, 0xaf, 0xc6, 0xb0, 0xc5, 0x9c, 0xc4, 0x83, - 0xc4, 0x86, 0xc5, 0x91, 0xc7, 0xbe, 0xc4, 0x98, 0xc4, 0xa8, 0x62, 0xc4, 0x9b, 0xc3, - 0xb0, 0xe1, 0x9a, 0xa3, 0xc6, 0xab, 0xc4, 0x95, 0xc8, 0x99, 0xc5, 0xa8, 0xe1, 0x9b, - 0x92, 0xc8, 0xae, 0x4d, 0xe1, 0x9a, 0xae, 0xcd, 0xb2, 0xc3, 0x95, 0xc4, 0x8f, 0xc6, - 0xa9, 0xc5, 0x83, 0xc2, 0xaf, 0xc2, 0xb6, 0x5b, 0xc9, 0x8b, 0xe1, 0x9a, 0xae, 0xc3, - 0x9e, 0xc5, 0xa1, 0xcd, 0xb0, 0xc6, 0x87, 0xe1, 0x9a, 0xaa, 0xe1, 0x9a, 0xb8, 0xc7, - 0x94, 0xc6, 0xbc, 0xc7, 0xb4, 0xe1, 0x9b, 0x98, 0xc3, 0xbf, 0xc4, 0xbc, 0xcd, 0xb6, - 0xc4, 0x9b, 0xc4, 0xb7, 0xc2, 0xa9, 0xc7, 0x8e, 0xc3, 0xa0, 0xc3, 0x82, 0xc8, 0x9a, - 0xce, 0x89, 0xc6, 0xac, 0xc4, 0x94, 0xc3, 0x84, 0xc7, 0xb5, 0xce, 0x85, 0xc8, 0xa8, - 0xc3, 0x8c, 0xc8, 0x8d, 0xc2, 0xa8, 0xc8, 0x9a, 0xc9, 0x8e, 0xc8, 0xaa, 0xc3, 0x90, - 0xc7, 0x9d, 0xc8, 0xb3, 0xc4, 0x92, 0xc6, 0x83, 0x77, 0xc5, 0xa8, 0x52, 0xc4, 0xa4, - 0xc8, 0x91, 0xc6, 0xbd, 0xe1, 0x9a, 0xb6, 0xc7, 0xa8, 0xc3, 0xbf, 0xc7, 0x93, 0xe1, - 0x9b, 0x87, 0xe1, 0x9b, 0xad, 0x6f, 0xc8, 0xaa, 0xc6, 0xbb, 0xc6, 0xa3, 0xc7, 0xbe, - 0xc5, 0xb4, 0xe1, 0x9a, 0xab, 0xc7, 0xaa, 0xc7, 0x88, 0xc8, 0x85, 0xc6, 0xaa, 0xce, - 0x8c, 0xe1, 0x9b, 0x94, 0xc5, 0xb4, 0xc3, 0xa5, 0x66, 0x45, 0xc7, 0x80, 0xc5, 0x8f, - 0xc2, 0xb4, 0xc9, 0x8f, 0x39, 0xc3, 0x90, 0xc5, 0xa8, 0xc3, 0x91, 0xc6, 0x9e, 0xc8, - 0xb5, 0x72, 0xc6, 0x99, 0x5d, 0x2b, 0xc8, 0xb4, 0xc7, 0xbb, 0x79, 0xc5, 0xb8, 0xc6, - 0xb9, 0xc7, 0x9d, 0xc7, 0xb0, 0xe1, 0x9b, 0xa9, 0xe1, 0x9b, 0x92, 0xcd, 0xb6, 0xce, - 0x85, 0x42, 0xc2, 0xba, 0xc7, 0x99, 0xc7, 0x9c, 0xc5, 0x89, 0xc6, 0xbc, 0x29, 0xc2, - 0xb4, 0xc3, 0x8a, 0xc8, 0x81, 0xc3, 0x84, 0xc8, 0x92, 0xc3, 0x97, 0xe1, 0x9b, 0x91, - 0xc8, 0xa7, 0xc6, 0x99, 0xc4, 0x88, 0xe1, 0x9b, 0x9e, 0xc5, 0xab, 0xce, 0x88, 0xc5, - 0x93, 0xcd, 0xb1, 0xe2, 0xb1, 0xbc, 0xc5, 0xa0, 0xe1, 0x9b, 0x83, 0xc9, 0x80, 0xc4, - 0xbb, 0x24, 0xc6, 0x90, 0xc3, 0x8c, 0xc7, 0xa0, 0xc8, 0x9d, 0xc3, 0x8a, 0xc4, 0xa0, - 0xc6, 0xac, 0x72, 0xe1, 0x9b, 0x82, 0xe1, 0x9a, 0xba, 0xc3, 0x8f, 0x6c, 0xe1, 0x9a, - 0xb4, 0xc4, 0xbe, 0xc4, 0xaf, 0xc4, 0x9a, 0xc5, 0xa7, 0x41, 0xe2, 0xb1, 0xbf, 0xe2, - 0xb1, 0xb3, 0xc5, 0x8a, 0xe1, 0x9b, 0xa7, 0xc3, 0xa0, 0xc5, 0xaf, 0xc9, 0x8e, 0x35, - 0x34, 0xc2, 0xa3, 0xc5, 0xa4, 0xc2, 0xb3, 0xcd, 0xb1, 0xc9, 0x85, 0xc4, 0xa3, 0xe1, - 0x9b, 0x9f, 0xe1, 0x9b, 0x84, 0xc7, 0xa6, 0x5a, + 0xc7, 0x95, 0xc7, 0xa0, 0xe2, 0xb1, 0xb9, 0xc4, 0xb2, 0x36, 0x48, 0x2b, 0xc5, 0x93, + 0xc7, 0xb1, 0xc3, 0xbc, 0xc6, 0x9c, 0xc8, 0x98, 0xc5, 0xba, 0xe2, 0xb1, 0xa4, 0xc5, + 0x89, 0xc5, 0x9d, 0x2a, 0xc7, 0xa9, 0xe1, 0x9a, 0xb1, 0x7e, 0xc6, 0x98, 0xc7, 0xa2, + 0xc4, 0x85, 0xc8, 0xa3, 0xc8, 0xbb, 0xc6, 0x81, 0xc6, 0x9c, 0xc3, 0xb7, 0xc6, 0x98, + 0xc6, 0x8e, 0xce, 0x86, 0xc8, 0xa0, 0xce, 0x85, 0xe2, 0xb1, 0xb4, 0xc4, 0xaa, 0xc6, + 0xbb, 0xc5, 0xb1, 0xc8, 0x9f, 0x69, 0x21, 0xe1, 0x9a, 0xa8, 0xc4, 0xa3, 0x6f, 0xc3, + 0x93, 0xe1, 0x9b, 0x99, 0xc4, 0xa2, 0xcd, 0xb5, 0xe1, 0x9a, 0xa7, 0xc5, 0x82, 0x32, + 0xc5, 0x80, 0xc2, 0xb0, 0xc7, 0x82, 0x41, 0xc7, 0x90, 0xc8, 0xb8, 0xc6, 0xbe, 0xc5, + 0xa0, 0xc6, 0x8c, 0xe1, 0x9a, 0xb8, 0xc3, 0xb6, 0xc4, 0xb2, 0xc4, 0xa4, 0xc9, 0x84, + 0xc5, 0x8d, 0xc4, 0xb1, 0x54, 0xc7, 0x8f, 0xc8, 0x8b, 0x54, 0xe1, 0x9b, 0x9e, 0xc9, + 0x84, 0xe1, 0x9b, 0x82, 0xc8, 0xb5, 0x73, 0xc6, 0xa4, 0xc4, 0xa8, 0xc4, 0xba, 0xc7, + 0xa7, 0x26, 0x3d, 0xe2, 0xb1, 0xae, 0xc4, 0xbc, 0xc8, 0x91, 0xe1, 0x9a, 0xbe, 0xc6, + 0xb7, 0xc5, 0xb3, 0xc8, 0xad, 0xc6, 0xb4, 0xe1, 0x9a, 0xab, 0x44, 0x77, 0xc5, 0x93, + 0xc5, 0xab, 0xc3, 0xbb, 0xe1, 0x9a, 0xbe, 0xc4, 0x81, 0xc2, 0xbe, 0xc7, 0xbd, 0xcd, + 0xbc, 0x70, 0x45, 0xc5, 0x9a, 0xc9, 0x8d, 0x32, 0x76, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, + 0xa0, 0xe1, 0x9b, 0x8a, 0xc3, 0x81, 0xc8, 0xad, 0x4c, 0xc3, 0x89, 0xc6, 0xbd, 0xc4, + 0x93, 0xc7, 0x9c, 0x62, 0x4c, 0xe2, 0xb1, 0xa1, 0xcd, 0xbc, 0xc8, 0xb7, 0xe1, 0x9a, + 0xaf, 0xe1, 0x9a, 0xb9, 0xc3, 0xb2, 0xc5, 0xaa, 0xe1, 0x9b, 0xad, 0xc5, 0x8d, 0xce, + 0x8a, 0x6a, 0xc4, 0xbf, 0xc7, 0x8b, 0xc7, 0xa2, 0x7e, 0x6e, 0xe1, 0x9a, 0xb1, 0x47, + 0x2b, 0xc9, 0x82, 0xc7, 0x8b, 0xcd, 0xba, 0xc6, 0xaf, 0xc4, 0x91, 0xc6, 0x86, 0x52, + 0xe1, 0x9b, 0x9b, 0xc9, 0x8e, 0xe2, 0xb1, 0xbd, 0xc2, 0xbd, 0xc4, 0xb2, 0xc7, 0xb5, + 0xc5, 0xb0, 0xc8, 0xb6, 0xe2, 0xb1, 0xa6, 0xc6, 0x92, 0xc4, 0xbf, 0x4a, 0xc4, 0xa9, + 0xc6, 0xb2, 0xe1, 0x9b, 0x96, 0xc3, 0xa4, 0x70, 0x3d, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, + 0x93, 0xc6, 0xa3, 0x4d, 0xc7, 0xa6, 0xc3, 0x8c, 0xc6, 0x8e, 0xc7, 0xbd, 0xc3, 0x90, + 0x54, 0xc5, 0x9b, 0xe1, 0x9b, 0x94, 0x37, 0xc3, 0x89, 0x79, 0x49, 0xe1, 0x9b, 0x86, + 0xe1, 0x9b, 0xa2, 0xc6, 0x8b, 0xc8, 0xb6, 0xc3, 0x8b, 0xc7, 0x83, 0xc8, 0xa2, 0xc8, + 0x92, 0xc4, 0x9e, 0xc8, 0xa4, 0xc5, 0x80, 0xc7, 0xa6, 0xc6, 0x99, 0x24, 0xe1, 0x9b, + 0xa2, 0xc6, 0x8c, 0xe1, 0x9a, 0xac, 0x39, 0x21, 0xc2, 0xa9, 0xc7, 0x89, 0xe1, 0x9a, + 0xbe, 0xce, 0x8a, 0xc3, 0x86, 0xe1, 0x9b, 0xa4, 0xc7, 0xb6, 0xc3, 0x90, 0xc3, 0x97, + 0xc5, 0x99, 0xc7, 0x80, 0xc8, 0x93, 0xc2, 0xa5, 0xe1, 0x9b, 0x86, 0xc7, 0xb7, 0xc3, + 0x81, 0xc7, 0x8a, 0xe1, 0x9b, 0x9c, 0xe1, 0x9a, 0xaf, 0xc4, 0x84, 0xc2, 0xb7, 0xc6, + 0x8b, 0xc6, 0xab, 0xc8, 0xb0, 0xc3, 0xa7, 0xcd, 0xb1, 0xe1, 0x9a, 0xa2, 0xc8, 0x83, + 0xc6, 0xa8, 0xc6, 0xaf, 0xe2, 0xb1, 0xa1, 0xc3, 0xa2, 0xc7, 0xb5, 0xc9, 0x87, 0xc7, + 0x9c, 0xe1, 0x9a, 0xb1, 0xc5, 0x93, 0xe1, 0x9b, 0x95, 0xe2, 0xb1, 0xaa, 0xe1, 0x9b, + 0x8c, 0xc7, 0x99, 0xc6, 0xbe, 0x47, 0xc9, 0x83, 0xc5, 0xa5, 0xc5, 0x83, 0xe1, 0x9b, + 0x8b, 0xc8, 0xba, 0xc5, 0xb4, 0xc2, 0xb6, 0xe2, 0xb1, 0xa1, 0xce, 0x88, 0x36, 0x21, + 0xe2, 0xb1, 0xa6, 0xe1, 0x9b, 0x91, 0xc3, 0xa7, ], - asset_id: [ - 0x6e, 0x9c, 0x7f, 0x1a, 0x04, 0x56, 0x32, 0x4e, 0x21, 0x55, 0xab, 0x2b, 0x82, 0xd5, - 0x01, 0x11, 0x4a, 0x02, 0xc2, 0x93, 0x32, 0x96, 0x34, 0x29, 0x8e, 0x73, 0x8a, 0x62, - 0x62, 0x36, 0xb9, 0x9b, + asset_base: [ + 0x3d, 0x73, 0x41, 0xcb, 0xb2, 0xd0, 0x56, 0xd3, 0xfa, 0x50, 0x77, 0x09, 0xd2, 0x62, + 0x75, 0xff, 0xee, 0xff, 0xa1, 0x64, 0xa4, 0xcd, 0xc9, 0x0d, 0x52, 0xf3, 0x56, 0xaa, + 0x67, 0x8e, 0xc6, 0xb6, ], }, TestVector { @@ -933,48 +933,48 @@ pub(crate) fn test_vectors() -> Vec { 0x46, 0xbb, 0x13, 0x3e, ], description: [ - 0xc2, 0xbd, 0x65, 0x3c, 0xe1, 0x9a, 0xb6, 0xe1, 0x9a, 0xa2, 0xc7, 0x9e, 0xe1, 0x9a, - 0xb5, 0x5f, 0xe1, 0x9b, 0x97, 0x65, 0xc2, 0xa4, 0xc8, 0xb9, 0xe1, 0x9a, 0xb8, 0xc7, - 0xbf, 0xc3, 0xb9, 0x52, 0x46, 0xc7, 0x9d, 0xc6, 0x9f, 0xe1, 0x9a, 0xbc, 0xc5, 0x9c, - 0xe2, 0xb1, 0xb1, 0xc6, 0x8b, 0xc2, 0xa3, 0xc4, 0xa8, 0xc8, 0x9e, 0xc6, 0xaa, 0xc3, - 0xa2, 0xc3, 0x84, 0xc3, 0x9d, 0xe1, 0x9b, 0x97, 0xc4, 0x81, 0xe2, 0xb1, 0xb0, 0xc5, - 0xb9, 0x29, 0xc9, 0x89, 0x60, 0xe1, 0x9a, 0xbd, 0x5c, 0xc4, 0xbe, 0xc4, 0xb4, 0xc7, - 0xa1, 0xc4, 0x93, 0xc4, 0x8c, 0xe1, 0x9a, 0xb9, 0xc2, 0xb0, 0xcd, 0xbd, 0xce, 0x8c, - 0xc7, 0x88, 0xc6, 0x8c, 0xc6, 0x93, 0xc5, 0xa8, 0xe2, 0xb1, 0xa4, 0xc6, 0x84, 0x39, - 0xc5, 0x81, 0x53, 0xc4, 0xa9, 0xc2, 0xa7, 0xc4, 0x8f, 0xe1, 0x9a, 0xba, 0xc4, 0xaf, - 0xe1, 0x9b, 0x9d, 0xc6, 0xbb, 0xc2, 0xbc, 0xc7, 0x95, 0xc6, 0xb0, 0xe1, 0x9b, 0x8f, - 0x42, 0xc2, 0xbe, 0xc6, 0xa7, 0xc8, 0xbc, 0xcd, 0xb7, 0xc8, 0xa7, 0xc8, 0x8b, 0xc8, - 0xb7, 0xc6, 0xa1, 0xc4, 0x87, 0xc7, 0xa7, 0xc3, 0xb5, 0xe2, 0xb1, 0xa1, 0xc2, 0xb2, - 0xe1, 0x9b, 0xa5, 0xc5, 0x87, 0xe1, 0x9a, 0xb3, 0xc7, 0xb3, 0x7a, 0xc6, 0x8b, 0xc4, - 0xbe, 0xc4, 0x8e, 0x56, 0x2d, 0xc9, 0x84, 0xc4, 0x84, 0xc7, 0xa3, 0xe2, 0xb1, 0xb6, - 0x5e, 0x46, 0xc3, 0x8f, 0xc7, 0x94, 0xc5, 0xa7, 0xc8, 0xa2, 0xc4, 0xa0, 0xc5, 0xa1, - 0xe1, 0x9b, 0xa4, 0xe1, 0x9b, 0x9f, 0xc3, 0x87, 0xc3, 0xb4, 0xc3, 0x81, 0xc4, 0x86, - 0xc7, 0xb7, 0xc4, 0xb3, 0xc2, 0xb5, 0xc6, 0x8c, 0xc8, 0xa0, 0xc4, 0x9c, 0xc7, 0x9e, - 0x30, 0xcd, 0xb4, 0xc3, 0xb7, 0xe1, 0x9a, 0xb1, 0xe1, 0x9b, 0x86, 0xc5, 0xab, 0xc6, - 0xa3, 0xc3, 0x9c, 0xc7, 0xbe, 0xc3, 0xbf, 0xc2, 0xa1, 0xe1, 0x9b, 0x89, 0xe1, 0x9a, - 0xb8, 0xc6, 0xb7, 0xc6, 0x85, 0xc8, 0x93, 0xc3, 0x9f, 0xc7, 0xbe, 0x2e, 0xce, 0x88, - 0xc9, 0x86, 0xe2, 0xb1, 0xa6, 0xc3, 0x94, 0x58, 0xc5, 0x84, 0xc4, 0xa1, 0x7d, 0xc7, - 0x92, 0xe1, 0x9b, 0x81, 0xc7, 0xbc, 0xe1, 0x9b, 0x9d, 0xc4, 0xb8, 0xe1, 0x9a, 0xa9, - 0xe1, 0x9a, 0xa1, 0xc3, 0x8d, 0xc6, 0xb6, 0x51, 0xc4, 0xbc, 0xc5, 0x91, 0xe1, 0x9a, - 0xb4, 0xc9, 0x8d, 0xe1, 0x9a, 0xaf, 0xc9, 0x84, 0xc7, 0xb7, 0xc6, 0x96, 0x38, 0xc3, - 0x89, 0xc6, 0xa6, 0xe1, 0x9b, 0x98, 0xc3, 0x83, 0xc3, 0x99, 0xc6, 0x99, 0xe2, 0xb1, - 0xa1, 0xcd, 0xbd, 0xc3, 0x8d, 0xc9, 0x8f, 0x3a, 0xc4, 0x81, 0xe1, 0x9a, 0xac, 0x4b, - 0xc6, 0x94, 0xc6, 0x9c, 0xe2, 0xb1, 0xaf, 0xe1, 0x9a, 0xb8, 0xc8, 0xb1, 0x6f, 0x70, - 0xc3, 0xae, 0xe1, 0x9b, 0x8a, 0xc7, 0xab, 0xc5, 0xad, 0x57, 0xc3, 0xb2, 0x55, 0xc6, - 0xb1, 0xc6, 0x84, 0xc3, 0xa4, 0x61, 0xc8, 0x9e, 0xc2, 0xb6, 0xc7, 0x8f, 0xc8, 0x95, - 0x30, 0x29, 0xe1, 0x9a, 0xb8, 0xc6, 0xa5, 0xc8, 0x97, 0xc7, 0xa9, 0xc9, 0x8d, 0xc8, - 0xa3, 0xc8, 0x98, 0xc2, 0xb4, 0xc7, 0x8d, 0xc7, 0x8b, 0xc7, 0xbc, 0xe2, 0xb1, 0xbf, - 0xc2, 0xa1, 0x2b, 0xe1, 0x9a, 0xac, 0xc2, 0xb4, 0xc4, 0xa6, 0xc2, 0xa5, 0x6e, 0xc5, - 0xa5, 0xe1, 0x9b, 0x8f, 0x2d, 0xe1, 0x9a, 0xae, 0x2c, 0x61, 0xe1, 0x9b, 0xb0, 0xc7, - 0x84, 0xc4, 0x8e, 0x44, 0xc7, 0xb0, 0xce, 0x86, 0xc6, 0x97, 0xc4, 0xa6, 0xc3, 0x94, - 0xc6, 0xbb, 0x2e, 0xc5, 0x95, 0xc4, 0x86, 0xc8, 0x8f, 0xc7, 0x94, 0xc9, 0x8b, 0x7b, - 0xc4, 0x9c, 0xc5, 0xb2, 0xc5, 0x8a, 0xc5, 0x8d, 0x4a, 0xe1, 0x9a, 0xbe, 0xc8, 0x90, - 0xc8, 0x9f, 0x70, 0xe1, 0x9b, 0x93, 0xc7, 0xbe, + 0xc5, 0x9b, 0xc3, 0xb8, 0xc4, 0x89, 0xc3, 0xbd, 0xc8, 0xa6, 0xc6, 0x8e, 0xc4, 0xb9, + 0xe1, 0x9a, 0xb9, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0xb0, 0xc3, 0x99, 0x31, 0xe1, 0x9b, + 0x90, 0xc2, 0xb2, 0xc7, 0xa5, 0x7a, 0xe1, 0x9b, 0x88, 0xc8, 0x94, 0x35, 0x5d, 0xc5, + 0x9a, 0xc3, 0x9c, 0x55, 0xc6, 0x82, 0xc3, 0xb8, 0xc6, 0xaf, 0xc3, 0xb8, 0xc4, 0xab, + 0x25, 0xc4, 0x91, 0xc4, 0xb6, 0xce, 0x86, 0xc3, 0x80, 0xc2, 0xba, 0x40, 0xc9, 0x8a, + 0xc4, 0xa2, 0xc7, 0xb4, 0xc4, 0x8f, 0xe1, 0x9b, 0x90, 0xe1, 0x9b, 0xab, 0xc8, 0x83, + 0xc7, 0x97, 0x28, 0xc3, 0x9c, 0xc6, 0x9b, 0xc8, 0xbb, 0xc2, 0xa6, 0xc4, 0x81, 0xc5, + 0xac, 0xe1, 0x9a, 0xa0, 0xc2, 0xaf, 0xc9, 0x8e, 0xc2, 0xa9, 0xc6, 0xa7, 0xc8, 0xaf, + 0xc8, 0x86, 0xc8, 0xae, 0xc4, 0x8d, 0xe1, 0x9b, 0xb0, 0xc6, 0xa7, 0xc4, 0x81, 0xc2, + 0xa8, 0xc9, 0x87, 0xe1, 0x9a, 0xbf, 0xc5, 0xb5, 0xc8, 0xa1, 0xc4, 0x88, 0xc8, 0xb2, + 0xc7, 0x89, 0xc8, 0xb9, 0xc8, 0xa3, 0xe2, 0xb1, 0xb1, 0xc3, 0xb5, 0xc5, 0xaa, 0xc7, + 0x9f, 0xcd, 0xba, 0xc3, 0x8f, 0xc7, 0x9f, 0xcd, 0xb4, 0x42, 0xc7, 0xb2, 0xe1, 0x9a, + 0xa3, 0xc7, 0xbc, 0xe1, 0x9b, 0x93, 0xc8, 0xb9, 0xc7, 0xbd, 0xc2, 0xbb, 0xc5, 0x81, + 0xc5, 0xa7, 0xc6, 0x89, 0x69, 0xe1, 0x9b, 0x87, 0x32, 0xc9, 0x80, 0xcd, 0xba, 0xc5, + 0x9c, 0xe1, 0x9a, 0xbc, 0x2a, 0x57, 0xc7, 0x84, 0xc8, 0x95, 0xc8, 0xa6, 0xe2, 0xb1, + 0xa4, 0xc2, 0xab, 0xc4, 0xad, 0xe2, 0xb1, 0xb6, 0xc2, 0xb3, 0xe1, 0x9b, 0x92, 0xcd, + 0xbe, 0xc4, 0xa5, 0xc7, 0xbc, 0xc5, 0x87, 0xc8, 0xbe, 0xc3, 0xbc, 0xc3, 0xb8, 0xc6, + 0x8e, 0xc6, 0xba, 0x48, 0xe1, 0x9b, 0xa4, 0x57, 0xc4, 0x8f, 0xe2, 0xb1, 0xab, 0xc4, + 0x9d, 0xc7, 0xa0, 0xe1, 0x9a, 0xb2, 0x48, 0xc5, 0xba, 0xce, 0x87, 0xc7, 0x86, 0xc5, + 0xa6, 0xc2, 0xa7, 0xc7, 0x9d, 0xc6, 0x8c, 0xe1, 0x9a, 0xb0, 0x65, 0xc4, 0xb5, 0xc6, + 0xbb, 0xc7, 0x82, 0xc4, 0xb3, 0xc4, 0x98, 0xc3, 0x85, 0x24, 0xe1, 0x9a, 0xa9, 0xc4, + 0x83, 0xc6, 0xba, 0xc3, 0xaa, 0xc5, 0xa0, 0xc4, 0x9e, 0x5f, 0x59, 0xc3, 0x90, 0x59, + 0xc2, 0xb2, 0xc6, 0xa9, 0xcd, 0xb5, 0xe1, 0x9a, 0xa0, 0xc4, 0x83, 0xc6, 0x92, 0xe2, + 0xb1, 0xb4, 0xc3, 0x98, 0xc6, 0xa8, 0xc6, 0x90, 0xe1, 0x9b, 0x8d, 0xc8, 0x93, 0xc4, + 0xac, 0xc8, 0x93, 0xc7, 0xae, 0xe1, 0x9a, 0xa9, 0xc3, 0xa9, 0xc6, 0x8f, 0xc5, 0x93, + 0xc8, 0x84, 0xe1, 0x9b, 0xad, 0xe2, 0xb1, 0xb7, 0xe1, 0x9b, 0x97, 0xc3, 0x87, 0xe1, + 0x9b, 0x89, 0xc3, 0x91, 0x46, 0x4f, 0xc5, 0x9d, 0xc9, 0x8e, 0xc5, 0x99, 0xc6, 0x9b, + 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, 0xa8, 0x51, 0xc6, 0x8d, 0xc3, 0x8b, 0xc2, 0xa7, 0xc3, + 0xb6, 0xc8, 0x82, 0xc7, 0x8b, 0xc8, 0xb2, 0x6b, 0xc5, 0x9e, 0xc9, 0x8b, 0xc6, 0x84, + 0xc6, 0xac, 0xc4, 0xa7, 0xe1, 0x9b, 0xa7, 0xc3, 0xb6, 0xc7, 0xb2, 0xc3, 0x9a, 0xc6, + 0xab, 0xc3, 0x86, 0xc6, 0xa8, 0x52, 0xe1, 0x9a, 0xba, 0x2a, 0xe1, 0x9b, 0x90, 0xc4, + 0xb7, 0xc3, 0x9f, 0xc4, 0x8d, 0xc8, 0xba, 0xc7, 0x86, 0xc8, 0x95, 0xe1, 0x9b, 0x9a, + 0x40, 0xc3, 0xa9, 0xe1, 0x9a, 0xbe, 0xc8, 0xa6, 0xc8, 0xab, 0xc5, 0x90, 0xce, 0x86, + 0xe2, 0xb1, 0xad, 0xc3, 0xa5, 0xe1, 0x9b, 0xa9, 0xc5, 0x84, 0xc4, 0xbf, 0xc3, 0x88, + 0xc7, 0x8b, 0xe1, 0x9a, 0xad, 0xc8, 0x90, 0xc7, 0xbb, 0xe2, 0xb1, 0xa2, 0xc6, 0xaf, + 0xc2, 0xa7, 0xc3, 0xb4, 0xc6, 0x8e, 0x56, 0xc8, 0x80, 0xc6, 0x86, 0xe1, 0x9a, 0xa7, + 0xc6, 0xbc, 0xc2, 0xba, 0xc6, 0xb7, 0xc5, 0x99, ], - asset_id: [ - 0x54, 0xf5, 0xc9, 0x10, 0x86, 0xc5, 0x19, 0xcf, 0x5a, 0xa9, 0xc7, 0x4f, 0x07, 0x7c, - 0x07, 0xbc, 0xf7, 0xd7, 0x24, 0x35, 0x20, 0xe1, 0x4d, 0x2e, 0x27, 0x12, 0x79, 0x7c, - 0x74, 0xd2, 0x0e, 0x22, + asset_base: [ + 0x39, 0xa7, 0x8f, 0x76, 0x63, 0x81, 0xec, 0x69, 0xd9, 0x2e, 0x8c, 0xa6, 0xb6, 0x4e, + 0x92, 0x10, 0xe9, 0x94, 0x28, 0x32, 0x9f, 0xde, 0x85, 0xb2, 0xe1, 0xfb, 0xb7, 0x35, + 0x70, 0x86, 0x7a, 0xb2, ], }, TestVector { @@ -984,48 +984,48 @@ pub(crate) fn test_vectors() -> Vec { 0x59, 0x44, 0x2d, 0x11, ], description: [ - 0xc4, 0xaa, 0xe1, 0x9a, 0xb7, 0xc3, 0x99, 0xc6, 0x90, 0xc6, 0x96, 0xc3, 0x9b, 0x54, - 0xc9, 0x8c, 0xc8, 0x91, 0xc7, 0xba, 0xc2, 0xb9, 0xc7, 0x9b, 0xe2, 0xb1, 0xa8, 0xc3, - 0xa5, 0xc3, 0x87, 0xc9, 0x80, 0xc7, 0xbe, 0xe1, 0x9b, 0x97, 0xc5, 0x92, 0xc7, 0xa5, - 0xc8, 0x8e, 0xc7, 0x97, 0xe2, 0xb1, 0xb9, 0x49, 0xc8, 0xb4, 0xc7, 0xa8, 0x5e, 0xc5, - 0x8d, 0x5d, 0xc8, 0xbb, 0xce, 0x86, 0x29, 0xe2, 0xb1, 0xa3, 0xe1, 0x9b, 0x91, 0xc3, - 0x94, 0x46, 0xc8, 0x9a, 0xce, 0x84, 0xc7, 0x96, 0xe2, 0xb1, 0xb8, 0xc8, 0xa7, 0xc8, - 0xbb, 0xe2, 0xb1, 0xac, 0xe2, 0xb1, 0xbf, 0xc5, 0x80, 0xc2, 0xae, 0xc3, 0x85, 0xc6, - 0xaf, 0xc8, 0xbe, 0xc6, 0xb9, 0xe2, 0xb1, 0xb4, 0x66, 0xe1, 0x9a, 0xa1, 0x36, 0xc5, - 0x95, 0xc3, 0xb5, 0xe2, 0xb1, 0xbe, 0xc7, 0x89, 0xe1, 0x9a, 0xa5, 0xc7, 0xa0, 0x34, - 0xc9, 0x87, 0xe2, 0xb1, 0xac, 0xe2, 0xb1, 0xa9, 0xc7, 0x99, 0xc3, 0xa4, 0xe1, 0x9b, - 0x89, 0xc3, 0x9e, 0xc9, 0x89, 0xc3, 0xa5, 0xc3, 0xb1, 0xc3, 0x9e, 0xe2, 0xb1, 0xb4, - 0xc8, 0x87, 0x69, 0xc8, 0x81, 0xc3, 0x81, 0xc8, 0x9c, 0xc7, 0x80, 0xe1, 0x9b, 0x9a, - 0xe1, 0x9b, 0xa4, 0x49, 0xc7, 0x97, 0x6e, 0x6f, 0xe1, 0x9b, 0x80, 0xc7, 0xa5, 0x5d, - 0x3d, 0xc3, 0xab, 0xc5, 0x88, 0xc3, 0x8c, 0xe2, 0xb1, 0xb5, 0xc4, 0xa2, 0xe2, 0xb1, - 0xa7, 0xe1, 0x9b, 0xad, 0xc6, 0xb0, 0xe1, 0x9b, 0x8f, 0xc6, 0x97, 0xe2, 0xb1, 0xb8, - 0xc2, 0xa9, 0xc7, 0xb0, 0xe2, 0xb1, 0xbd, 0x65, 0xc3, 0xb3, 0xe2, 0xb1, 0xaa, 0xc6, - 0xb3, 0xc5, 0x96, 0xc5, 0xbd, 0xe2, 0xb1, 0xb6, 0xe2, 0xb1, 0xb5, 0xe1, 0x9a, 0xb2, - 0xc5, 0xb5, 0x61, 0x28, 0x58, 0xc5, 0x80, 0x74, 0x5b, 0xc8, 0xa8, 0xe2, 0xb1, 0xb7, - 0x30, 0x6a, 0xc3, 0xaa, 0xe1, 0x9b, 0x9e, 0xc8, 0x9b, 0x33, 0x54, 0xc6, 0xad, 0xc6, - 0x99, 0xc4, 0x9b, 0xc7, 0x87, 0xe1, 0x9b, 0xb0, 0xc7, 0x9a, 0xc7, 0x99, 0xc6, 0xa4, - 0xc6, 0xb8, 0xe2, 0xb1, 0xb7, 0xc7, 0x93, 0x60, 0xe1, 0x9b, 0x9e, 0xc7, 0x98, 0xc8, - 0xa8, 0xce, 0x86, 0xe1, 0x9a, 0xb2, 0xc6, 0xaf, 0xc3, 0xb7, 0xc3, 0x81, 0xc7, 0x89, - 0xc7, 0x93, 0x25, 0xc7, 0xaf, 0xc4, 0x9c, 0xe2, 0xb1, 0xba, 0xe1, 0x9b, 0x90, 0xe1, - 0x9b, 0xa8, 0xc7, 0xbe, 0xc3, 0xb9, 0xc7, 0xb4, 0xc5, 0xb1, 0xe2, 0xb1, 0xa3, 0xcd, - 0xb6, 0xc5, 0x8d, 0x76, 0xc5, 0xb9, 0xe2, 0xb1, 0xae, 0x4e, 0x36, 0xc8, 0xa1, 0x50, - 0xc6, 0x95, 0xc4, 0x84, 0xc8, 0x94, 0xe1, 0x9b, 0x9f, 0xc8, 0x9e, 0xc7, 0x85, 0xcd, - 0xb0, 0xc4, 0xb3, 0x58, 0xc6, 0x98, 0xc4, 0xb0, 0xc8, 0x99, 0xe2, 0xb1, 0xb6, 0xc5, - 0xa4, 0xc6, 0x84, 0xc6, 0xbd, 0xc6, 0x96, 0xe2, 0xb1, 0xb7, 0xc5, 0xb7, 0xc6, 0xaa, - 0xc8, 0x85, 0x70, 0xc7, 0xbe, 0xc4, 0xb4, 0xe1, 0x9a, 0xba, 0x30, 0xc8, 0xae, 0xe2, - 0xb1, 0xb3, 0x32, 0xc3, 0x89, 0xe2, 0xb1, 0xa1, 0xc3, 0x90, 0xc5, 0xba, 0xe1, 0x9b, - 0xa2, 0xc3, 0xb3, 0xe1, 0x9b, 0xa8, 0xce, 0x86, 0xc6, 0xb2, 0x29, 0x5e, 0xc8, 0xb7, - 0xc5, 0x8a, 0xc3, 0xa1, 0xc7, 0xac, 0xc5, 0x96, 0xc3, 0x8c, 0xc2, 0xaa, 0xc6, 0xb0, - 0xc8, 0x84, 0x5d, 0xc8, 0x8a, 0xc2, 0xaf, 0xc5, 0x90, 0x51, 0xe1, 0x9b, 0xa3, 0xc7, - 0x92, 0xc3, 0x9a, 0xc8, 0x81, 0xc8, 0xa5, 0x61, 0xc8, 0x95, 0xc7, 0x96, 0xe2, 0xb1, - 0xa3, 0xc8, 0xb5, 0xe1, 0x9a, 0xa6, 0xc4, 0xb1, 0xe1, 0x9b, 0xac, 0xc7, 0xaf, 0x2b, - 0xe1, 0x9b, 0x8b, 0xc4, 0xa0, 0xc7, 0xa1, 0xc7, 0xb6, 0xc6, 0x81, 0xc3, 0xb5, 0xe2, - 0xb1, 0xb4, 0xc2, 0xa1, 0xe2, 0xb1, 0xb2, 0x5a, + 0xc6, 0xbd, 0xc2, 0xa5, 0x6f, 0xe2, 0xb1, 0xb0, 0x64, 0xc5, 0xb2, 0x39, 0xc8, 0x9d, + 0xcd, 0xb0, 0xc3, 0x8d, 0xc5, 0xa5, 0xc7, 0xb7, 0xe1, 0x9b, 0xa5, 0xcd, 0xb4, 0xcd, + 0xb6, 0xc6, 0x96, 0xc5, 0xa2, 0xe1, 0x9b, 0x87, 0x68, 0xe1, 0x9a, 0xb2, 0xe1, 0x9b, + 0xa0, 0xc4, 0x99, 0xe1, 0x9a, 0xa5, 0xc9, 0x8f, 0x61, 0xe2, 0xb1, 0xa7, 0xc5, 0x8b, + 0xc4, 0xbb, 0xe1, 0x9a, 0xb9, 0xc8, 0xab, 0xc6, 0x99, 0xc7, 0xaa, 0x21, 0xcd, 0xbc, + 0xc4, 0xa6, 0xc2, 0xb4, 0xe1, 0x9b, 0x9b, 0x52, 0x7a, 0xc2, 0xb1, 0xc7, 0x97, 0x5a, + 0xc6, 0xba, 0xc6, 0xb5, 0xc5, 0xbd, 0xc6, 0xb3, 0xc2, 0xb9, 0xc3, 0xac, 0xc8, 0x93, + 0xe1, 0x9a, 0xa7, 0xc6, 0x80, 0xc6, 0x86, 0xce, 0x86, 0xc7, 0x86, 0xc4, 0xa9, 0xc5, + 0x9b, 0x4d, 0x21, 0xc8, 0xa8, 0x2b, 0xc6, 0x9b, 0xc3, 0x9f, 0xe1, 0x9a, 0xbf, 0x60, + 0xe1, 0x9b, 0x86, 0xe2, 0xb1, 0xbc, 0xcd, 0xb1, 0xc5, 0xb1, 0xc4, 0xa3, 0x21, 0xc6, + 0xb2, 0xc4, 0x95, 0xc2, 0xbe, 0xe1, 0x9b, 0x93, 0xc6, 0x88, 0xe1, 0x9a, 0xa9, 0xc7, + 0xbb, 0xc7, 0xb4, 0xc3, 0x84, 0xc9, 0x8e, 0xc7, 0xb3, 0x43, 0xc8, 0x87, 0xce, 0x85, + 0x55, 0xc3, 0xbd, 0xc3, 0x9c, 0xc7, 0x81, 0xc6, 0x9b, 0xc6, 0xa1, 0x6b, 0xc5, 0x9e, + 0xc6, 0xa1, 0xc5, 0xaa, 0x6e, 0xc5, 0xbc, 0xc4, 0xb0, 0xc8, 0x84, 0xc9, 0x80, 0xc7, + 0xb3, 0xc5, 0xb3, 0xc9, 0x88, 0x33, 0xc4, 0x83, 0xe1, 0x9b, 0x8c, 0xc9, 0x86, 0x6d, + 0xc8, 0xa5, 0xc3, 0xaf, 0xe1, 0x9b, 0xa0, 0xc2, 0xb1, 0xe2, 0xb1, 0xba, 0xc5, 0xae, + 0x3e, 0x79, 0xc4, 0xa4, 0xe1, 0x9b, 0xad, 0x33, 0xc7, 0xaa, 0xc4, 0x8c, 0xc8, 0xb6, + 0xe2, 0xb1, 0xa8, 0xe2, 0xb1, 0xb2, 0xe1, 0x9b, 0x94, 0xc8, 0x8e, 0xc5, 0xb2, 0xc4, + 0xb5, 0xc4, 0xad, 0xc8, 0xb5, 0xc7, 0xa5, 0xe2, 0xb1, 0xbd, 0x3b, 0xe1, 0x9b, 0x9f, + 0xc6, 0x8d, 0xc5, 0x84, 0xe1, 0x9b, 0xae, 0xc5, 0x8d, 0x23, 0x6f, 0x6f, 0xc5, 0x83, + 0xc5, 0xa7, 0xc4, 0x84, 0xc8, 0xa4, 0xc4, 0xb2, 0xc5, 0xba, 0xe2, 0xb1, 0xa5, 0xc8, + 0xa2, 0x3f, 0xc8, 0x86, 0xc8, 0x8b, 0xe1, 0x9b, 0x9e, 0xc5, 0x91, 0xe1, 0x9a, 0xaf, + 0xe1, 0x9b, 0x9b, 0xc4, 0xb7, 0xc6, 0x97, 0xc7, 0xbb, 0xe1, 0x9b, 0x9c, 0xc7, 0xa8, + 0xc7, 0x9a, 0xe1, 0x9b, 0xab, 0xc4, 0x93, 0x2f, 0xc6, 0xa3, 0xc6, 0x9d, 0xc6, 0xa6, + 0xc3, 0x86, 0xe1, 0x9b, 0x89, 0xc5, 0x84, 0xc6, 0x92, 0xc7, 0xa9, 0xc7, 0x91, 0xc5, + 0x99, 0xc6, 0x88, 0xc5, 0x98, 0x71, 0xe2, 0xb1, 0xa6, 0xcd, 0xbe, 0x5c, 0xc6, 0x8a, + 0xc3, 0xae, 0xc4, 0x80, 0xe1, 0x9a, 0xa6, 0x2d, 0xc6, 0x83, 0xc6, 0xa0, 0xc8, 0x8c, + 0xc7, 0xa9, 0xc6, 0xb1, 0xe1, 0x9b, 0x81, 0xe2, 0xb1, 0xb5, 0xc7, 0x8b, 0x43, 0xc8, + 0xad, 0xc4, 0xa4, 0xc7, 0x81, 0xc2, 0xbc, 0x4b, 0xc6, 0xb5, 0x67, 0xc2, 0xa2, 0xcd, + 0xba, 0xc6, 0xaa, 0xc2, 0xb8, 0xe1, 0x9b, 0xa5, 0x3c, 0xcd, 0xba, 0xc4, 0x94, 0xe2, + 0xb1, 0xaa, 0xe2, 0xb1, 0xbf, 0x48, 0x45, 0xc7, 0xba, 0xc5, 0xa0, 0xc2, 0xae, 0x2b, + 0xc2, 0xb7, 0xc6, 0xad, 0xc4, 0xa5, 0xc4, 0x93, 0xe1, 0x9a, 0xbd, 0xc3, 0xb2, 0xe1, + 0x9a, 0xa7, 0x66, 0xc7, 0x8b, 0xc2, 0xa7, 0x5c, 0xc7, 0x96, 0xc4, 0xb2, 0xe1, 0x9a, + 0xbc, 0xe2, 0xb1, 0xab, 0x43, 0xc9, 0x8f, 0xc5, 0x8e, 0x58, 0xe1, 0x9a, 0xa9, 0xe1, + 0x9b, 0x96, 0x59, 0xc5, 0x93, 0xe1, 0x9b, 0x89, 0xc7, 0xb1, 0xe1, 0x9a, 0xaf, 0xc9, + 0x82, 0xe2, 0xb1, 0xaf, 0xc7, 0xb4, 0xc4, 0xa5, 0x62, 0xc8, 0x93, 0xc5, 0xae, 0xc4, + 0xae, 0xce, 0x8c, 0xc8, 0xa8, 0xe1, 0x9a, 0xa0, ], - asset_id: [ - 0x9d, 0xf4, 0x24, 0x6f, 0x24, 0x26, 0xa5, 0xd4, 0x87, 0xb1, 0xc9, 0x7d, 0x71, 0x92, - 0xf6, 0x90, 0x79, 0x85, 0x5d, 0x30, 0x08, 0xde, 0x89, 0x7b, 0xf0, 0x57, 0x06, 0xb4, - 0x5b, 0xe3, 0xe3, 0xae, + asset_base: [ + 0xca, 0x81, 0x0e, 0x15, 0xe1, 0x48, 0x19, 0x50, 0xde, 0x77, 0xab, 0x5f, 0x02, 0xa1, + 0xa6, 0x37, 0xf0, 0x5c, 0x3f, 0x12, 0x64, 0xbb, 0x93, 0x65, 0xf5, 0x0a, 0x91, 0x10, + 0x4d, 0x52, 0x2b, 0x9e, ], }, ] diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 35cc1acbf..02c9cfc78 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -17,6 +17,7 @@ pub(crate) struct TestVector { pub(crate) internal_ivk: [u8; 32], pub(crate) internal_ovk: [u8; 32], pub(crate) internal_dk: [u8; 32], + pub(crate) asset: [u8; 32], pub(crate) note_v: u64, pub(crate) note_rho: [u8; 32], pub(crate) note_rseed: [u8; 32], @@ -106,6 +107,11 @@ pub(crate) fn test_vectors() -> Vec { 0xfc, 0x27, 0x59, 0xd4, 0xf4, 0xd6, 0x84, 0xb2, 0xc5, 0x05, 0x6d, 0x5b, 0x17, 0x7a, 0xf0, 0xfa, 0x8a, 0xa9, ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], note_v: 15643327852135767324, note_rho: [ 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, 0x33, 0x36, 0x26, @@ -207,6 +213,11 @@ pub(crate) fn test_vectors() -> Vec { 0x9e, 0xca, 0x3c, 0x00, 0xd3, 0x98, 0xae, 0xde, 0x1f, 0xdc, 0x2a, 0xbf, 0xfc, 0x88, 0x35, 0x38, 0x59, 0xaf, ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], note_v: 4481649511318637270, note_rho: [ 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, @@ -308,6 +319,11 @@ pub(crate) fn test_vectors() -> Vec { 0x68, 0xc6, 0x3c, 0x36, 0xf3, 0x32, 0xe7, 0x45, 0x57, 0xe9, 0x16, 0x05, 0x0f, 0x0b, 0x91, 0x11, 0x17, 0x9b, ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], note_v: 14496603531126387959, note_rho: [ 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, @@ -409,6 +425,11 @@ pub(crate) fn test_vectors() -> Vec { 0xc7, 0x5e, 0xe4, 0x21, 0xb4, 0x20, 0x4b, 0xb6, 0xf3, 0xc5, 0xd0, 0xfc, 0x43, 0x28, 0x49, 0xaa, 0x71, 0x61, ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], note_v: 6792346249443327211, note_rho: [ 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, 0xbc, @@ -510,6 +531,11 @@ pub(crate) fn test_vectors() -> Vec { 0x70, 0xeb, 0xd0, 0x55, 0xe4, 0xc7, 0xfd, 0x91, 0xc0, 0x20, 0xff, 0x43, 0x46, 0x1d, 0x14, 0xe0, 0x2f, 0x29, ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], note_v: 4079549063511228677, note_rho: [ 0x26, 0x70, 0xdc, 0x82, 0xd3, 0x90, 0x26, 0xc6, 0xcb, 0x4c, 0xd4, 0xb0, 0xf7, 0xf5, @@ -611,6 +637,11 @@ pub(crate) fn test_vectors() -> Vec { 0xa2, 0x2c, 0x49, 0x1d, 0xc0, 0x9e, 0x1b, 0x12, 0x0f, 0x66, 0x93, 0xd6, 0x86, 0xec, 0xd4, 0x03, 0x0a, 0x00, ], + asset: [ + 0xaa, 0xce, 0xb5, 0x62, 0x18, 0xc6, 0xbd, 0x30, 0xf8, 0x37, 0x4a, 0xc1, 0x33, 0x86, + 0x79, 0x3f, 0x21, 0xa9, 0xfb, 0x80, 0xad, 0x03, 0xbc, 0x0c, 0xda, 0x4a, 0x44, 0x94, + 0x6c, 0x00, 0xe1, 0xb1, + ], note_v: 5706402952489856202, note_rho: [ 0xa1, 0xdf, 0x0e, 0x5b, 0x87, 0xb5, 0xbe, 0xce, 0x47, 0x7a, 0x70, 0x96, 0x49, 0xe9, @@ -623,14 +654,14 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0x08, 0xcb, 0x05, ], note_cmx: [ - 0x63, 0xce, 0xe3, 0x7e, 0x3c, 0x7b, 0x4e, 0x6c, 0xc9, 0x39, 0xa2, 0xe6, 0x3a, 0xda, - 0x74, 0xf8, 0x5e, 0xa4, 0x8b, 0xa0, 0x7a, 0x4f, 0x92, 0xcc, 0xbd, 0x34, 0xfa, 0xa4, - 0x2d, 0xfd, 0x49, 0x16, + 0x71, 0x99, 0x1e, 0xeb, 0x4b, 0x51, 0x7e, 0xd9, 0xd4, 0x31, 0xdc, 0xa9, 0xa2, 0xbb, + 0xcf, 0x1c, 0xe8, 0x75, 0xe8, 0x55, 0xdf, 0xf4, 0x8c, 0x69, 0xf4, 0xef, 0x51, 0x01, + 0x1e, 0x86, 0x1e, 0x07, ], note_nf: [ - 0x4c, 0x99, 0xbf, 0xa8, 0xc2, 0x0d, 0xba, 0x59, 0xbb, 0x73, 0x47, 0xda, 0x16, 0xc4, - 0x3b, 0x73, 0xc8, 0x87, 0x94, 0xc9, 0xeb, 0xcd, 0x0d, 0xd2, 0xb2, 0x5e, 0xe7, 0xbb, - 0x83, 0x6f, 0x95, 0x20, + 0xdf, 0x79, 0xd4, 0xa4, 0x6e, 0xca, 0xfd, 0x34, 0x50, 0x9d, 0x41, 0xfc, 0xfb, 0x61, + 0x3e, 0x1f, 0xdc, 0xbc, 0x0d, 0x3b, 0xa0, 0xaa, 0x8d, 0xe5, 0x04, 0xd6, 0xf2, 0x54, + 0xcd, 0x55, 0x12, 0x32, ], }, TestVector { @@ -712,329 +743,349 @@ pub(crate) fn test_vectors() -> Vec { 0xe6, 0xb8, 0xf6, 0xd1, 0x0a, 0x74, 0x7f, 0xed, 0x2a, 0x1c, 0x91, 0xcb, 0xe1, 0x42, 0x47, 0x5c, 0x30, 0x82, ], + asset: [ + 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, + 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, 0x86, 0xa2, 0x65, 0x8e, 0x0a, 0x07, 0xa0, 0x5a, + 0xc5, 0xb9, 0x50, 0x05, + ], note_v: 2558469029534639129, note_rho: [ - 0x72, 0x2d, 0xb0, 0x41, 0xa3, 0xef, 0x66, 0xfa, 0x48, 0x3a, 0xfd, 0x3c, 0x2e, 0x19, - 0xe5, 0x94, 0x44, 0xa6, 0x4a, 0xdd, 0x6d, 0xf1, 0xd9, 0x63, 0xf5, 0xdd, 0x5b, 0x50, - 0x10, 0xd3, 0xd0, 0x25, + 0x34, 0x10, 0x80, 0x6e, 0xa6, 0xf2, 0x88, 0xf8, 0x73, 0x6c, 0x23, 0x35, 0x7c, 0x85, + 0xf4, 0x57, 0x91, 0xe1, 0x70, 0x80, 0x29, 0xd9, 0x82, 0x4d, 0x90, 0x70, 0x46, 0x07, + 0xf3, 0x87, 0xa0, 0x3e, ], note_rseed: [ - 0xf0, 0x28, 0x7c, 0x4c, 0xf1, 0x9c, 0x75, 0xf3, 0x3d, 0x51, 0xdd, 0xdd, 0xba, 0x5d, - 0x65, 0x7b, 0x43, 0xee, 0x8d, 0xa6, 0x45, 0x44, 0x38, 0x14, 0xcc, 0x73, 0x29, 0xf3, - 0xe9, 0xb4, 0xe5, 0x4c, + 0x49, 0xbf, 0x98, 0x36, 0x57, 0x44, 0x31, 0x34, 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, + 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, + 0xa0, 0xd4, 0x70, 0x19, ], note_cmx: [ - 0x1e, 0x61, 0x9e, 0x46, 0xbb, 0x62, 0xb6, 0x1d, 0x4e, 0x1c, 0xf3, 0x62, 0x2e, 0xa7, - 0x0a, 0x90, 0x8d, 0xe7, 0xf0, 0x76, 0xec, 0xf8, 0x7f, 0x54, 0x1e, 0x0b, 0x7b, 0x48, - 0xad, 0x4a, 0x26, 0x01, + 0x94, 0x81, 0xcb, 0xac, 0x4e, 0xb0, 0xc0, 0x8d, 0x12, 0x83, 0x47, 0x13, 0xb5, 0x15, + 0xfd, 0x8c, 0x61, 0x0d, 0x44, 0xc1, 0x29, 0x50, 0x97, 0xcc, 0x20, 0x13, 0x4d, 0xe2, + 0x1c, 0x63, 0x6c, 0x29, ], note_nf: [ - 0x3b, 0x94, 0x8d, 0xb2, 0x16, 0x08, 0xe9, 0xac, 0xb2, 0x2a, 0x54, 0x17, 0xb9, 0x8c, - 0x0d, 0xed, 0xd5, 0x27, 0xa9, 0x64, 0x87, 0x81, 0x4e, 0x64, 0x20, 0xcb, 0xff, 0x6e, - 0x4e, 0xee, 0x4e, 0x31, + 0x44, 0xc8, 0x8d, 0x03, 0x10, 0x21, 0x56, 0x11, 0x25, 0x6a, 0xad, 0x07, 0x34, 0x99, + 0x43, 0x08, 0x94, 0x59, 0x73, 0x17, 0x15, 0x75, 0xae, 0x7e, 0x89, 0xf5, 0x8d, 0x44, + 0xde, 0xa2, 0x67, 0x10, ], }, TestVector { sk: [ - 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, - 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, 0x86, 0xa2, 0x65, 0x8e, 0x0a, 0x07, 0xa0, 0x5a, - 0xc5, 0xb9, 0x50, 0x05, + 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, 0x82, 0x84, 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, + 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, 0x0d, 0xc0, 0xb7, 0x16, 0xc4, 0x8f, 0xbd, 0x46, + 0x7f, 0x75, 0xb7, 0x80, ], ask: [ - 0xb4, 0xde, 0xd9, 0x0d, 0x62, 0x11, 0x7f, 0x18, 0xf3, 0xdd, 0x5f, 0xdb, 0x22, 0x23, - 0x8a, 0x35, 0xca, 0x37, 0xc4, 0x0f, 0xee, 0xc8, 0x45, 0xce, 0x5f, 0xc2, 0x7f, 0xe8, - 0xbc, 0xa5, 0xef, 0x0f, + 0x10, 0x10, 0x16, 0x60, 0x30, 0x07, 0x06, 0x52, 0x6a, 0x03, 0xb2, 0x63, 0x24, 0x13, + 0x5b, 0xbd, 0xd2, 0x33, 0xfc, 0xf6, 0x96, 0xca, 0x7f, 0xd2, 0x12, 0xf2, 0x82, 0x55, + 0x9e, 0x78, 0x12, 0x3b, ], ak: [ - 0x4e, 0xfd, 0x5a, 0x2e, 0xf1, 0xff, 0xa9, 0x9a, 0x0f, 0xf6, 0x2b, 0x76, 0x7d, 0x44, - 0xb3, 0x65, 0x1f, 0xfa, 0x1c, 0x69, 0x69, 0x15, 0xac, 0x00, 0xa2, 0x5e, 0xa3, 0xac, - 0x7d, 0xff, 0x99, 0x01, + 0xeb, 0x1e, 0xd7, 0xf9, 0x37, 0x17, 0xd5, 0xdf, 0x15, 0xdd, 0xb6, 0xb2, 0xb2, 0xb0, + 0x17, 0x76, 0xf9, 0xa1, 0x91, 0xfb, 0x08, 0xa6, 0x8a, 0xe1, 0x32, 0x4f, 0x29, 0x13, + 0xe0, 0x6f, 0xa7, 0x10, ], isk: [ - 0x3d, 0xa9, 0x08, 0x88, 0xba, 0x18, 0x24, 0xc8, 0x16, 0x29, 0x2d, 0x7f, 0x17, 0x33, - 0xac, 0x4c, 0xbe, 0x72, 0x2c, 0x6a, 0x12, 0x1c, 0xc7, 0x80, 0x17, 0x06, 0x26, 0xb7, - 0x0a, 0x26, 0x95, 0x28, + 0x90, 0x16, 0x58, 0x59, 0x87, 0x32, 0xd6, 0x5b, 0xea, 0x90, 0x17, 0xdb, 0x74, 0x38, + 0x76, 0xc5, 0x86, 0xbc, 0xa7, 0x45, 0x54, 0xd7, 0x60, 0xf4, 0x9b, 0xa6, 0x59, 0xe4, + 0xe2, 0x1c, 0xbb, 0x14, ], ik: [ - 0x16, 0xa8, 0xff, 0x29, 0xb5, 0x17, 0xb5, 0xa8, 0xf7, 0xd0, 0x9b, 0x4e, 0x5e, 0x71, - 0x3a, 0x9a, 0x78, 0x4c, 0x74, 0x04, 0xd6, 0x1e, 0x3a, 0xf5, 0x30, 0x19, 0xc3, 0x47, - 0x0e, 0x90, 0x95, 0x22, + 0xa1, 0xe5, 0xf8, 0xab, 0x90, 0x24, 0x01, 0x9a, 0x67, 0x10, 0x53, 0x90, 0x86, 0x72, + 0x65, 0xb4, 0xc5, 0x16, 0x40, 0xe6, 0x5d, 0xb3, 0xcb, 0xcd, 0x7d, 0xf0, 0x04, 0x88, + 0xf8, 0x9e, 0x68, 0x35, ], nk: [ - 0x02, 0xab, 0x99, 0x5c, 0xe9, 0x8f, 0x63, 0x02, 0x5f, 0xb6, 0x24, 0x28, 0xa0, 0xfb, - 0xf5, 0x2f, 0x25, 0x22, 0xe6, 0xa2, 0x72, 0x61, 0x07, 0x8a, 0x9f, 0x4d, 0x6a, 0x36, - 0xa1, 0xc0, 0x5d, 0x39, + 0xf6, 0x42, 0x02, 0x4d, 0x49, 0xe8, 0x4b, 0x65, 0x33, 0xed, 0x2c, 0x37, 0x65, 0x06, + 0x06, 0x39, 0xfc, 0x27, 0x82, 0xd3, 0x9f, 0x87, 0x69, 0xdb, 0x80, 0x6b, 0x37, 0xde, + 0xb1, 0xf0, 0x9c, 0x2b, ], rivk: [ - 0xd9, 0x84, 0x0d, 0x0b, 0xd8, 0x95, 0x20, 0xab, 0xbc, 0xa7, 0xf1, 0x0b, 0xe6, 0xeb, - 0xa3, 0x66, 0xf8, 0x6e, 0xc3, 0xb7, 0x8d, 0xbd, 0xf1, 0xeb, 0xfe, 0x20, 0xd9, 0x95, - 0x12, 0xaf, 0x15, 0x15, + 0xe8, 0x2d, 0xad, 0xba, 0x81, 0x82, 0x3b, 0x52, 0xaf, 0x0b, 0xb5, 0xfc, 0x22, 0x79, + 0xaf, 0xfb, 0xff, 0xf8, 0x9c, 0x2d, 0xb2, 0x93, 0xbc, 0x5e, 0x30, 0x78, 0xa1, 0x31, + 0x91, 0x71, 0x66, 0x39, ], ivk: [ - 0x58, 0xf5, 0xbb, 0x5c, 0x32, 0x31, 0x15, 0x25, 0x29, 0x42, 0x3b, 0x67, 0xfa, 0x43, - 0x28, 0x79, 0x11, 0x26, 0x35, 0xcd, 0xa0, 0xda, 0x2e, 0xc2, 0x41, 0x9c, 0x6f, 0xe9, - 0x1e, 0xa4, 0x8d, 0x24, + 0xbd, 0xa0, 0xc1, 0x5b, 0x01, 0x4c, 0x15, 0x59, 0xf3, 0x34, 0x14, 0x97, 0xeb, 0x67, + 0xe7, 0x49, 0x5b, 0x73, 0x87, 0xbb, 0x6c, 0x2c, 0xbe, 0xa5, 0x95, 0x46, 0x9e, 0xc1, + 0xd2, 0xa8, 0x23, 0x3a, ], ovk: [ - 0x78, 0xf5, 0xd3, 0x48, 0x67, 0x2e, 0x8d, 0x20, 0x9c, 0x41, 0xb7, 0x83, 0xf8, 0xca, - 0x14, 0xa7, 0x7b, 0x3e, 0xa3, 0xe6, 0x00, 0x4c, 0xa4, 0xe0, 0xc2, 0x5a, 0xa4, 0x45, - 0x63, 0x98, 0x1d, 0xcb, + 0xd3, 0x8e, 0x31, 0xbd, 0x8a, 0xbd, 0xc5, 0x05, 0xfb, 0x3b, 0x0f, 0x03, 0xa5, 0x8a, + 0x73, 0x4f, 0xce, 0x58, 0x3b, 0x51, 0x4f, 0x32, 0xb3, 0x03, 0xf4, 0x6c, 0x5a, 0x69, + 0x01, 0x85, 0xa9, 0xb0, ], dk: [ - 0x5d, 0x7f, 0xe3, 0x96, 0xbb, 0xfd, 0x22, 0x67, 0xac, 0xa7, 0x11, 0xab, 0x5b, 0x3e, - 0x1f, 0x02, 0x4f, 0x49, 0x11, 0xf3, 0xa1, 0x81, 0x73, 0x2f, 0x13, 0x22, 0xa1, 0x59, - 0x2f, 0x9e, 0x0e, 0xbe, + 0x9a, 0x5b, 0x8c, 0xdc, 0x9f, 0x7b, 0xe7, 0x47, 0x6f, 0x7b, 0x5b, 0x73, 0x70, 0x71, + 0x90, 0xb6, 0x17, 0x20, 0xf8, 0x4b, 0xb4, 0x84, 0x47, 0x5c, 0x84, 0xd1, 0xce, 0xf1, + 0x5c, 0xa8, 0x15, 0x92, ], default_d: [ - 0x2f, 0xbe, 0x4b, 0x4b, 0x1e, 0xdf, 0xf3, 0x31, 0x23, 0xce, 0x65, + 0x46, 0x48, 0x8d, 0x15, 0x40, 0x98, 0x39, 0x66, 0x05, 0xf3, 0xc8, ], default_pk_d: [ - 0xeb, 0x2c, 0x6f, 0xee, 0x34, 0x1e, 0xad, 0xe0, 0x7d, 0x74, 0x87, 0x99, 0x7a, 0xa7, - 0x23, 0x69, 0x7d, 0x05, 0xe6, 0x29, 0x60, 0xdf, 0x37, 0x9c, 0x9e, 0x4a, 0x8d, 0x47, - 0x6d, 0xfa, 0xc5, 0xbf, + 0x28, 0xa3, 0x18, 0xf5, 0x04, 0x30, 0x43, 0x03, 0xee, 0xfd, 0x42, 0x87, 0x9c, 0x9f, + 0xc4, 0xf6, 0x27, 0x51, 0x90, 0xc6, 0x37, 0x63, 0x09, 0xb9, 0x13, 0xcc, 0xab, 0x3a, + 0x56, 0x95, 0x94, 0x28, ], internal_rivk: [ - 0x66, 0x3b, 0x67, 0xd3, 0xac, 0x15, 0x99, 0x27, 0xf0, 0x6e, 0x6c, 0x8d, 0xab, 0x80, - 0xa5, 0x89, 0x67, 0xc5, 0x45, 0xda, 0xac, 0x3d, 0x98, 0x72, 0x9a, 0x0b, 0xcc, 0x41, - 0xfd, 0x53, 0x6d, 0x2b, + 0xdd, 0xa7, 0x37, 0x26, 0xb1, 0x7b, 0xfb, 0x17, 0x82, 0xc5, 0x73, 0xa7, 0x5b, 0x54, + 0xfe, 0x6a, 0x37, 0xff, 0x66, 0x0c, 0x9b, 0x0f, 0x08, 0x64, 0xa5, 0x4f, 0x77, 0xe6, + 0x25, 0x8d, 0x69, 0x39, ], internal_ivk: [ - 0xaa, 0x6a, 0xcc, 0x8a, 0x7a, 0xa9, 0xa8, 0x05, 0x20, 0x04, 0xff, 0x93, 0x83, 0x3f, - 0x4a, 0xbb, 0x15, 0x3b, 0x45, 0x79, 0x7f, 0xd9, 0x07, 0xe3, 0x05, 0xc8, 0x92, 0x7b, - 0xb0, 0x37, 0x82, 0x20, + 0x71, 0x67, 0x63, 0x93, 0xce, 0x07, 0x32, 0xfc, 0x42, 0x42, 0x83, 0x1d, 0x94, 0xe7, + 0xf8, 0xc3, 0xf8, 0xa0, 0x78, 0x4d, 0xee, 0xa2, 0xae, 0xcd, 0x79, 0xdd, 0x54, 0x10, + 0x2a, 0x72, 0x89, 0x13, ], internal_ovk: [ - 0xbf, 0xd1, 0x09, 0x67, 0x27, 0xb6, 0xd5, 0xa2, 0xe1, 0x7a, 0xcb, 0xc5, 0xb2, 0x46, - 0x80, 0xcb, 0x88, 0xdb, 0x34, 0xcf, 0x53, 0xb6, 0xb7, 0x46, 0x6c, 0xef, 0x67, 0x6f, - 0xb3, 0xf7, 0x22, 0x29, + 0x4e, 0x71, 0xe6, 0xc1, 0x84, 0x5a, 0x5a, 0x36, 0xcf, 0x46, 0x03, 0x0f, 0xe6, 0x81, + 0xfd, 0xb0, 0xce, 0x39, 0xf4, 0x61, 0x31, 0x47, 0xbb, 0xcd, 0x10, 0xae, 0x42, 0x9c, + 0x81, 0x94, 0xb2, 0x05, ], internal_dk: [ - 0x47, 0xbd, 0xf9, 0x27, 0x1e, 0xcc, 0x50, 0xe7, 0x05, 0xc5, 0x21, 0xcd, 0x0d, 0xbb, - 0xaf, 0x1c, 0x4e, 0x6a, 0x96, 0x2f, 0xc9, 0x14, 0x13, 0x48, 0xb8, 0xbd, 0x7b, 0x35, - 0xc4, 0x00, 0x1e, 0x62, + 0x06, 0x31, 0xff, 0x9b, 0x81, 0xac, 0xf2, 0x1f, 0xb6, 0xe1, 0xf0, 0x81, 0xb5, 0x50, + 0xa5, 0x4e, 0xa1, 0x54, 0x49, 0x8e, 0x52, 0x98, 0x73, 0xe2, 0x58, 0x82, 0xf0, 0x66, + 0xb7, 0x3b, 0x6b, 0x8c, + ], + asset: [ + 0x0c, 0x05, 0x36, 0xac, 0xdd, 0xf6, 0xf1, 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, + 0x14, 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, + 0x06, 0x77, 0xe3, 0x1b, ], - note_v: 15425828902564319772, + note_v: 17683470315120269844, note_rho: [ - 0x73, 0x6c, 0x23, 0x35, 0x7c, 0x85, 0xf4, 0x57, 0x91, 0xe1, 0x70, 0x80, 0x29, 0xd9, - 0x82, 0x4d, 0x90, 0x70, 0x46, 0x07, 0xf3, 0x87, 0xa0, 0x3e, 0x49, 0xbf, 0x98, 0x36, - 0x57, 0x44, 0x31, 0x34, + 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, + 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, + 0x7b, 0x48, 0x8d, 0x25, ], note_rseed: [ - 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, - 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, 0xa0, 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, - 0x85, 0x7f, 0x82, 0x84, + 0x56, 0xd7, 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, + 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, + 0xe5, 0xe1, 0x71, 0x1c, ], note_cmx: [ - 0xc8, 0x52, 0x8f, 0x72, 0x2c, 0xd3, 0xe4, 0x7d, 0xc9, 0x9e, 0x1e, 0x38, 0x80, 0x56, - 0x37, 0x08, 0x15, 0xa9, 0xd0, 0x37, 0x97, 0x3d, 0x85, 0xca, 0xc7, 0xea, 0x38, 0xb5, - 0xa7, 0x16, 0xfa, 0x3b, + 0xfe, 0x09, 0xf5, 0x89, 0x7c, 0xed, 0xc7, 0x67, 0x7c, 0xf5, 0x80, 0xc5, 0xf0, 0xd1, + 0x83, 0xed, 0x3b, 0xc0, 0x94, 0x5c, 0xb1, 0xc3, 0x85, 0xf3, 0x88, 0xf9, 0x3f, 0x94, + 0x3e, 0xff, 0x2a, 0x2f, ], note_nf: [ - 0xac, 0xc2, 0xed, 0x2c, 0x7e, 0x3b, 0x19, 0x7e, 0x5c, 0xdb, 0x4a, 0x57, 0x63, 0x57, - 0xd5, 0xf1, 0x35, 0x39, 0x16, 0x26, 0xc7, 0xa8, 0x25, 0xd1, 0x0a, 0xa2, 0x60, 0xae, - 0x0b, 0x95, 0x81, 0x28, + 0x80, 0xdf, 0x21, 0xbf, 0xeb, 0x46, 0x06, 0x16, 0x06, 0x29, 0x61, 0x03, 0x86, 0xc7, + 0x99, 0x02, 0xef, 0x49, 0x8b, 0x61, 0xb1, 0x55, 0x0c, 0xbd, 0x10, 0x55, 0xf8, 0x26, + 0x94, 0xfa, 0x5b, 0x03, ], }, TestVector { sk: [ - 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, 0x0d, 0xc0, - 0xb7, 0x16, 0xc4, 0x8f, 0xbd, 0x46, 0x7f, 0x75, 0xb7, 0x80, 0x14, 0x9a, 0xe8, 0x80, - 0x8f, 0x4e, 0x68, 0xf5, + 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, + 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, 0x5d, 0x4b, + 0xec, 0x95, 0x12, 0xbf, ], ask: [ - 0x2d, 0x6e, 0x97, 0x3e, 0x17, 0x54, 0xd4, 0x17, 0x87, 0x93, 0x4c, 0x34, 0x55, 0x8c, - 0xfe, 0x99, 0x38, 0x44, 0x19, 0x99, 0x72, 0xd9, 0xa6, 0x34, 0x8b, 0x7a, 0x3d, 0xad, - 0xfc, 0xb6, 0x77, 0x2a, + 0x6e, 0x61, 0x4e, 0x28, 0x21, 0x35, 0x2a, 0xce, 0xd4, 0x53, 0x3e, 0x86, 0x42, 0x75, + 0x18, 0xc7, 0x42, 0xbf, 0xda, 0x68, 0x79, 0x65, 0x07, 0xa7, 0x01, 0xdd, 0xa3, 0x7d, + 0xaf, 0x20, 0xb3, 0x17, ], ak: [ - 0x76, 0x21, 0x59, 0xa4, 0x14, 0xf5, 0x74, 0xb5, 0x39, 0x75, 0x0f, 0x22, 0xc8, 0x86, - 0x3b, 0x02, 0xd2, 0x5c, 0xc1, 0x0c, 0x90, 0x71, 0xfc, 0x02, 0x19, 0xe9, 0x7f, 0x93, - 0x92, 0xd0, 0x67, 0x0c, + 0xed, 0x6e, 0x79, 0xae, 0xd5, 0x75, 0x2e, 0x64, 0xc6, 0xe4, 0xb7, 0x9c, 0x06, 0xa4, + 0x43, 0xb8, 0xef, 0x32, 0xf7, 0xef, 0xa1, 0xf8, 0xf3, 0x5b, 0x54, 0x12, 0x63, 0xaa, + 0x66, 0xaf, 0xd7, 0x0a, ], isk: [ - 0x01, 0x65, 0x33, 0x68, 0x4f, 0xb9, 0x81, 0x15, 0xa4, 0x05, 0xc9, 0xc7, 0xad, 0x47, - 0x72, 0x76, 0xab, 0x7c, 0x72, 0xfd, 0x67, 0x1a, 0x27, 0xe3, 0x6c, 0x0a, 0x7a, 0xbe, - 0x0a, 0x76, 0x90, 0x09, + 0x91, 0xfe, 0x60, 0x36, 0x9d, 0x03, 0x63, 0x66, 0xc2, 0x45, 0x79, 0xec, 0x10, 0xb5, + 0x38, 0x1e, 0x8f, 0x1e, 0xda, 0x89, 0x5f, 0xe0, 0xb6, 0x76, 0xa2, 0xc8, 0x0b, 0x25, + 0xaf, 0x98, 0x67, 0x11, ], ik: [ - 0xff, 0xd7, 0x5f, 0x6f, 0x9e, 0xf4, 0x27, 0xf3, 0x26, 0xcd, 0xbf, 0x3a, 0x98, 0xbc, - 0xb5, 0x93, 0x63, 0x5a, 0x2c, 0x1a, 0xd7, 0x2b, 0x39, 0x99, 0x12, 0x61, 0xe2, 0x75, - 0xa9, 0xec, 0x6f, 0x10, + 0xfe, 0x7e, 0xfc, 0x8b, 0x60, 0x72, 0x1b, 0x3c, 0x8e, 0x88, 0xdc, 0xc8, 0x86, 0xcb, + 0x04, 0x8f, 0xad, 0x5b, 0x48, 0x07, 0xf2, 0xae, 0xe4, 0xae, 0xc6, 0xe1, 0xc3, 0xfa, + 0x51, 0x44, 0x03, 0x1c, ], nk: [ - 0x25, 0x91, 0xed, 0xf7, 0xef, 0x4c, 0xf2, 0x18, 0x4c, 0x34, 0xbe, 0x93, 0xfc, 0xf6, - 0x12, 0x91, 0x50, 0x42, 0xf1, 0x5a, 0xb5, 0x08, 0x4b, 0x14, 0xe1, 0x66, 0x79, 0x5b, - 0x09, 0xce, 0xa1, 0x33, + 0xb1, 0xe9, 0x25, 0x85, 0x1e, 0x8c, 0xbf, 0x94, 0x28, 0xaf, 0x98, 0xfc, 0x71, 0x4c, + 0xc9, 0xf2, 0x41, 0x30, 0x1a, 0x3d, 0x0f, 0xea, 0x55, 0xe1, 0x29, 0x26, 0xbf, 0x4e, + 0x84, 0x0d, 0x49, 0x16, ], rivk: [ - 0x75, 0x8f, 0xb2, 0x50, 0xdd, 0x29, 0x50, 0xe5, 0xd2, 0xb2, 0xee, 0xd7, 0xff, 0xcf, - 0x94, 0xae, 0x67, 0xcd, 0xe1, 0x25, 0xb9, 0x5b, 0x47, 0x9e, 0x23, 0x77, 0x81, 0x3a, - 0x85, 0xa0, 0x3d, 0x2f, + 0x85, 0x45, 0x0e, 0x25, 0xbf, 0x7d, 0x7a, 0xed, 0x86, 0xc7, 0xab, 0xd3, 0x5e, 0xfb, + 0x8c, 0x62, 0x86, 0x77, 0x96, 0xf3, 0x47, 0x67, 0xd3, 0xd3, 0xfe, 0xf6, 0x49, 0x42, + 0x1c, 0x13, 0x32, 0x2f, ], ivk: [ - 0x6e, 0xa4, 0x36, 0x3c, 0xb2, 0xdf, 0x62, 0xb1, 0x0d, 0xa1, 0x30, 0x8a, 0x0b, 0x96, - 0x79, 0xbd, 0x0f, 0x74, 0x95, 0xff, 0xe7, 0xd4, 0xe2, 0x61, 0x8f, 0x54, 0xdf, 0x9b, - 0x67, 0x0c, 0x33, 0x16, + 0xe5, 0xe7, 0xaf, 0x47, 0xbe, 0x07, 0x6f, 0xf1, 0xc6, 0x5b, 0x2e, 0xd3, 0x2c, 0xcc, + 0xab, 0xad, 0x90, 0xd6, 0x7e, 0xff, 0x93, 0x5c, 0xcc, 0x29, 0xb1, 0x42, 0xe2, 0xd6, + 0x88, 0x01, 0x8e, 0x0c, ], ovk: [ - 0xa6, 0x3c, 0xbc, 0xd3, 0x1b, 0xa1, 0x36, 0xd8, 0x3b, 0x8f, 0x1e, 0x88, 0xef, 0xb6, - 0x00, 0x55, 0xef, 0x6f, 0x98, 0x25, 0x2d, 0xdb, 0xd7, 0x5f, 0x62, 0x5f, 0x44, 0xdc, - 0xb6, 0x63, 0x2c, 0x72, + 0xb4, 0x08, 0x5e, 0xe4, 0xeb, 0xd2, 0xd2, 0x80, 0xd5, 0xbf, 0x29, 0x35, 0xfb, 0xb1, + 0x6c, 0x8c, 0xa1, 0x29, 0x25, 0x4b, 0x92, 0x87, 0x2a, 0x1d, 0x12, 0x4a, 0xbb, 0x85, + 0x34, 0x8b, 0x1a, 0x88, ], dk: [ - 0x02, 0xf0, 0x74, 0x08, 0xf3, 0x3e, 0x87, 0x12, 0xe4, 0xc9, 0xec, 0x42, 0xde, 0x56, - 0x04, 0x20, 0x01, 0x09, 0x86, 0x17, 0x24, 0xd3, 0x3e, 0xb6, 0x36, 0x8b, 0x70, 0xf6, - 0x5e, 0x0a, 0x16, 0x21, + 0xb3, 0xa5, 0x2b, 0xdc, 0x62, 0xaa, 0xfa, 0xda, 0x4c, 0x40, 0xb4, 0xa6, 0xcd, 0x09, + 0x07, 0x09, 0x83, 0x35, 0xfc, 0xb7, 0x9a, 0x6f, 0xd6, 0xd3, 0x10, 0xc7, 0x26, 0xc0, + 0x1b, 0x39, 0xb3, 0x9d, ], default_d: [ - 0x08, 0xdf, 0x1d, 0x4b, 0x45, 0xc6, 0x73, 0xa4, 0x59, 0xff, 0x58, + 0xd8, 0x4c, 0x41, 0xf7, 0xb6, 0xb4, 0x33, 0x93, 0x65, 0xe3, 0x41, ], default_pk_d: [ - 0x26, 0x8c, 0xc2, 0x4b, 0x38, 0xa6, 0x28, 0x80, 0xb6, 0xee, 0x3c, 0xbc, 0xb8, 0x5a, - 0x71, 0x2f, 0xa6, 0x86, 0xcf, 0xfc, 0xa6, 0xdb, 0x2f, 0xee, 0xc5, 0xf3, 0xc3, 0x56, - 0x6f, 0x84, 0x21, 0x8f, + 0x0b, 0x85, 0x8b, 0x0e, 0x24, 0x56, 0x8b, 0x98, 0x4d, 0xa8, 0x96, 0xb3, 0xfb, 0x46, + 0xbe, 0xe7, 0x32, 0xac, 0x8c, 0x3d, 0xde, 0x34, 0xe7, 0x6b, 0xe7, 0x59, 0x90, 0xc8, + 0xd7, 0xc9, 0xc5, 0x04, ], internal_rivk: [ - 0x00, 0x57, 0x37, 0x74, 0x61, 0xf2, 0x19, 0x1a, 0x7e, 0xca, 0x2b, 0x02, 0xed, 0xfd, - 0x9c, 0x9b, 0x44, 0x84, 0x5d, 0x2f, 0xdb, 0x8a, 0x99, 0xc7, 0x61, 0x20, 0x52, 0x7e, - 0x53, 0xdd, 0x09, 0x17, + 0xad, 0x13, 0x65, 0x45, 0x09, 0xf3, 0x0a, 0x80, 0xa3, 0x2f, 0xcd, 0xb9, 0x78, 0x93, + 0xaa, 0x32, 0x7c, 0x3e, 0x56, 0x7f, 0x67, 0xb4, 0x40, 0x45, 0x5f, 0x0d, 0xeb, 0x68, + 0xc3, 0x24, 0xb6, 0x39, ], internal_ivk: [ - 0x81, 0x62, 0x97, 0x35, 0x09, 0x47, 0x0c, 0x44, 0x24, 0x19, 0x11, 0xc0, 0x6d, 0x04, - 0x02, 0x9f, 0x5f, 0x1f, 0x0e, 0x98, 0x51, 0xe3, 0x2b, 0xa6, 0x9b, 0x18, 0xe5, 0x81, - 0x05, 0xdd, 0x4e, 0x2b, + 0xfa, 0xb6, 0xa5, 0x05, 0xa6, 0xee, 0x92, 0x55, 0x0d, 0xf5, 0xd5, 0xce, 0xbc, 0x37, + 0x9c, 0xd6, 0x24, 0x6c, 0xd2, 0xcc, 0x17, 0x43, 0xa8, 0x1f, 0xb5, 0xf9, 0x8a, 0xa0, + 0xf5, 0xea, 0x8f, 0x0d, ], internal_ovk: [ - 0x69, 0x47, 0x91, 0x0e, 0xa3, 0xe7, 0x33, 0x1d, 0x15, 0xa7, 0x1a, 0x64, 0xb2, 0xa8, - 0xc1, 0x6a, 0x6d, 0xa0, 0x8e, 0x6f, 0x34, 0x29, 0xdb, 0x26, 0xf9, 0x37, 0xab, 0x9d, - 0xd1, 0x33, 0xb5, 0xfd, + 0x8d, 0x08, 0x28, 0xa8, 0x3a, 0xc9, 0x94, 0x33, 0x8a, 0x87, 0xe9, 0x72, 0x68, 0xd4, + 0xaf, 0x0a, 0x87, 0x3b, 0x7c, 0x5b, 0x68, 0xec, 0x60, 0x13, 0x38, 0x51, 0x51, 0xf0, + 0x2d, 0xb1, 0x06, 0x1b, ], internal_dk: [ - 0x32, 0x7f, 0x76, 0xcc, 0x42, 0x44, 0xce, 0x0a, 0x91, 0x48, 0xa3, 0x5a, 0x7e, 0xa6, - 0x22, 0x8d, 0x44, 0x1c, 0x4c, 0x7b, 0x05, 0xbd, 0x02, 0x65, 0x7c, 0xea, 0xab, 0xb6, - 0x09, 0xbc, 0x3c, 0x52, + 0x31, 0xe2, 0x98, 0x37, 0xcc, 0x3d, 0xdd, 0x80, 0xdd, 0x80, 0x97, 0x19, 0x7b, 0xfa, + 0x66, 0x46, 0x67, 0x96, 0x2b, 0x09, 0x05, 0x5e, 0x50, 0x7f, 0x39, 0x7d, 0x94, 0xae, + 0xad, 0x84, 0xd8, 0x48, ], - note_v: 12606128263924155660, + asset: [ + 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, + 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, + 0x78, 0xa2, 0x69, 0x16, + ], + note_v: 12104108071547302835, note_rho: [ - 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, - 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, - 0x43, 0x6a, 0x10, 0x2f, + 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, 0x28, 0x48, 0xcc, 0xbd, + 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, 0xff, 0xa0, 0x05, 0xc3, + 0x12, 0x24, 0x1c, 0x2d, ], note_rseed: [ - 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, - 0x0d, 0x02, 0xe0, 0xf0, 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, - 0x29, 0x6e, 0xfa, 0xa7, + 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, + 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, + 0xcd, 0xdb, 0x41, 0x87, ], note_cmx: [ - 0x6a, 0x11, 0x95, 0xaa, 0x05, 0x36, 0xf6, 0x0e, 0xcf, 0xae, 0xcb, 0xdf, 0x53, 0x74, - 0xe4, 0x94, 0xea, 0x07, 0x2a, 0x2b, 0x86, 0x7b, 0x5f, 0x69, 0x43, 0x40, 0xc9, 0x6f, - 0xc3, 0x70, 0xa9, 0x10, + 0x5e, 0x54, 0xfe, 0x7e, 0x59, 0x52, 0xa6, 0xea, 0x26, 0xba, 0xbc, 0x32, 0xcf, 0xed, + 0xf5, 0xe6, 0x0b, 0x56, 0x82, 0x58, 0x98, 0x0d, 0x92, 0xc1, 0xe5, 0xdd, 0x3f, 0xdf, + 0x3e, 0x48, 0x7e, 0x1d, ], note_nf: [ - 0xb0, 0xf1, 0x60, 0x2a, 0x2b, 0x1a, 0xf2, 0xfc, 0x55, 0xf1, 0x59, 0x50, 0xa6, 0x83, - 0x83, 0x85, 0xe5, 0xe3, 0x9f, 0xec, 0xfd, 0x05, 0xcc, 0xec, 0x79, 0x9b, 0x75, 0xc6, - 0x5c, 0x8d, 0xa2, 0x35, + 0x45, 0x5f, 0xd0, 0xe5, 0x2e, 0x59, 0x33, 0x62, 0x57, 0x2d, 0x12, 0xdb, 0x44, 0xbb, + 0xf0, 0xe0, 0x95, 0x8a, 0xf9, 0xd5, 0x8f, 0xbd, 0xf9, 0x7b, 0x85, 0x22, 0x8e, 0xca, + 0xd0, 0xde, 0x7f, 0x05, ], }, TestVector { sk: [ - 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, - 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, - 0x84, 0x1e, 0x75, 0x17, + 0x2c, 0xfc, 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, + 0xf9, 0x30, 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, + 0x33, 0x92, 0xde, 0xb8, ], ask: [ - 0x28, 0xdc, 0x45, 0xf1, 0x15, 0x44, 0x42, 0x5c, 0x1b, 0xef, 0x86, 0x61, 0xda, 0x11, - 0x15, 0x5f, 0xdb, 0xb7, 0xe3, 0xbc, 0xfc, 0x0f, 0x0d, 0x49, 0xe6, 0xf1, 0x31, 0xe7, - 0xc0, 0x9d, 0x35, 0x2f, + 0x33, 0x4c, 0x49, 0x70, 0x7d, 0x93, 0x52, 0x5e, 0x70, 0x45, 0x5d, 0xd2, 0xc0, 0xdd, + 0xb4, 0x2d, 0x49, 0xc9, 0x39, 0x9f, 0x96, 0x14, 0x7f, 0xc0, 0x5e, 0x79, 0xec, 0x49, + 0x1b, 0xd9, 0xad, 0x07, ], ak: [ - 0x0d, 0x21, 0x1a, 0x90, 0x60, 0xfb, 0xaa, 0x66, 0x4e, 0x41, 0xa7, 0x34, 0xad, 0x1d, - 0x8d, 0x4b, 0x02, 0x5f, 0x8c, 0xc1, 0x60, 0xe1, 0xf4, 0xe9, 0x5f, 0x0a, 0x85, 0x3e, - 0xbc, 0x41, 0x6a, 0x2b, + 0xd3, 0xc0, 0xa4, 0xdc, 0x7e, 0x33, 0x47, 0xa5, 0x0b, 0xf0, 0x58, 0x44, 0xe0, 0xcb, + 0xfc, 0xd4, 0x41, 0x4a, 0x80, 0x9c, 0x0c, 0x30, 0xb1, 0x43, 0xbc, 0xe4, 0xa7, 0xc6, + 0x5c, 0xf0, 0x7f, 0x36, ], isk: [ - 0x76, 0x08, 0x32, 0x9d, 0xfa, 0x77, 0xc4, 0x2c, 0x4f, 0xc7, 0x6a, 0xc2, 0x95, 0x94, - 0xa2, 0x72, 0x83, 0x93, 0x4f, 0x5a, 0x93, 0x40, 0x71, 0xb9, 0xf8, 0xcd, 0x34, 0x4e, - 0x1f, 0x98, 0x45, 0x0e, + 0xb3, 0x72, 0x5b, 0x89, 0x31, 0xc4, 0x93, 0xdb, 0x21, 0x97, 0xe2, 0x87, 0x8e, 0xd3, + 0x62, 0x67, 0x0a, 0x18, 0xb9, 0x29, 0x31, 0x2e, 0xdd, 0x64, 0x4d, 0x74, 0xf9, 0xf3, + 0x23, 0xc6, 0x5e, 0x14, ], ik: [ - 0x72, 0xa0, 0xac, 0x97, 0x8a, 0x2d, 0xa1, 0x61, 0xf4, 0x1f, 0x5b, 0x7a, 0x40, 0xbd, - 0x83, 0xc0, 0x58, 0x41, 0xf8, 0x1b, 0xc5, 0x11, 0x40, 0x67, 0xb8, 0x85, 0x98, 0x7f, - 0x48, 0xca, 0x52, 0x2d, + 0xc5, 0x12, 0x36, 0x0c, 0x13, 0x59, 0xa6, 0x4f, 0x2a, 0xbb, 0x9e, 0xb3, 0xab, 0x43, + 0xe4, 0x99, 0x8e, 0xd6, 0xd5, 0x1d, 0x17, 0xbd, 0x9d, 0x70, 0x64, 0xa3, 0x91, 0x67, + 0x41, 0x98, 0xea, 0x1a, ], nk: [ - 0x3e, 0x88, 0xf2, 0x07, 0x1f, 0xd9, 0xa2, 0xbb, 0x26, 0xcd, 0xa2, 0xea, 0x85, 0x6a, - 0xa0, 0xfb, 0x3a, 0x80, 0xa8, 0x7d, 0x2f, 0xb6, 0x13, 0x6f, 0xab, 0x85, 0xe3, 0x6c, - 0x5b, 0x38, 0xd8, 0x24, + 0xc6, 0xb5, 0xe9, 0x28, 0x83, 0x73, 0x52, 0x14, 0x90, 0x20, 0xcc, 0x1f, 0x68, 0xf0, + 0xfb, 0xf8, 0x6a, 0x79, 0x89, 0xcb, 0x4e, 0x09, 0xb3, 0xb5, 0x44, 0x87, 0xb5, 0xcf, + 0x59, 0x00, 0x7c, 0x38, ], rivk: [ - 0x2c, 0x37, 0x38, 0x82, 0xc4, 0x08, 0xcd, 0x5f, 0xd4, 0x82, 0xa0, 0xc9, 0x81, 0x6f, - 0xc3, 0x22, 0x03, 0xa1, 0x0f, 0xbf, 0xce, 0x0e, 0x20, 0x0c, 0xcf, 0xd9, 0xee, 0x30, - 0x7c, 0x5e, 0x12, 0x24, + 0xe9, 0x38, 0xcf, 0x40, 0xc9, 0x83, 0x1a, 0x1a, 0x28, 0x48, 0xbc, 0x80, 0x22, 0x03, + 0x10, 0x81, 0x0b, 0x8f, 0x6a, 0xfd, 0xe1, 0x6c, 0xdd, 0x1e, 0xa1, 0x29, 0x98, 0xd3, + 0x74, 0xd1, 0xbb, 0x08, ], ivk: [ - 0xbb, 0x9e, 0x20, 0xb2, 0x99, 0x1c, 0x99, 0x6d, 0xa2, 0x1e, 0x3e, 0xcd, 0x39, 0xfb, - 0x7b, 0x3a, 0xa2, 0xba, 0xbc, 0x6b, 0xde, 0x18, 0x6f, 0x7d, 0xd8, 0xa8, 0x75, 0xd1, - 0x0c, 0x51, 0xa4, 0x30, + 0x80, 0x78, 0xd4, 0x95, 0x71, 0x1d, 0xc8, 0xc9, 0xba, 0xea, 0xdf, 0x84, 0xee, 0xfa, + 0x78, 0x26, 0xe5, 0x74, 0x3c, 0x5f, 0x92, 0x26, 0x99, 0xf3, 0xfa, 0x56, 0xeb, 0xa3, + 0xe0, 0xe0, 0x77, 0x3c, ], ovk: [ - 0x93, 0x21, 0x83, 0x8a, 0x2d, 0xb7, 0xf1, 0x68, 0xf0, 0xce, 0x77, 0xc4, 0x5b, 0x21, - 0x1f, 0xfb, 0xb9, 0xb3, 0x65, 0xe8, 0x5e, 0x67, 0x31, 0xd9, 0x09, 0x70, 0x05, 0x53, - 0xde, 0x49, 0x2b, 0x28, + 0x6c, 0xc7, 0xf9, 0xdc, 0xb8, 0x16, 0x9c, 0x38, 0x90, 0x97, 0x2f, 0xd3, 0x51, 0x04, + 0x13, 0x60, 0x4d, 0x0d, 0xdf, 0x82, 0xff, 0xfa, 0x0d, 0xc4, 0x58, 0xef, 0x5c, 0xd6, + 0xbb, 0x2f, 0x0d, 0x89, ], dk: [ - 0x3d, 0xf5, 0x83, 0x36, 0x1b, 0x33, 0x38, 0xbb, 0x68, 0x15, 0xf8, 0x58, 0x72, 0xe3, - 0x9f, 0x04, 0xdf, 0x50, 0x08, 0x52, 0x48, 0x84, 0xaf, 0x0f, 0x8c, 0x55, 0x97, 0x16, - 0xfc, 0xb1, 0x49, 0x58, + 0xf8, 0xa0, 0x79, 0x29, 0x1e, 0x32, 0xce, 0x94, 0x4f, 0x0f, 0xfe, 0x65, 0x8e, 0xd8, + 0xfb, 0xdb, 0xfd, 0xb9, 0xa2, 0xd6, 0x96, 0x86, 0xe7, 0x44, 0xa5, 0xf7, 0xb5, 0x96, + 0xf1, 0x22, 0x57, 0xee, ], default_d: [ - 0x4c, 0x40, 0x64, 0xc4, 0x7a, 0x5c, 0xa6, 0xe7, 0x5d, 0x46, 0x44, + 0x5c, 0x1b, 0x2f, 0x77, 0x6e, 0x19, 0x81, 0x35, 0xd0, 0xfd, 0x1f, ], default_pk_d: [ - 0xf5, 0x17, 0x17, 0x4b, 0xe2, 0x58, 0x92, 0x32, 0x78, 0xcf, 0x45, 0x89, 0x08, 0xc0, - 0x73, 0x56, 0x49, 0xf1, 0x89, 0x9d, 0xb9, 0x9c, 0x3b, 0xa9, 0x00, 0x3f, 0x4b, 0xa3, - 0x0a, 0xb0, 0xd2, 0x10, + 0x2a, 0x91, 0x7a, 0xe2, 0x42, 0x40, 0xb1, 0xa6, 0xaa, 0x67, 0x5b, 0x83, 0xa3, 0x78, + 0x25, 0x03, 0xeb, 0x71, 0x26, 0xd9, 0x99, 0x04, 0x9f, 0xb5, 0x7c, 0x70, 0x5e, 0xbc, + 0x01, 0x4e, 0x6b, 0x8f, ], internal_rivk: [ - 0xd8, 0x09, 0xa2, 0xa3, 0xd3, 0x6e, 0xf9, 0x6d, 0xc5, 0x63, 0xf8, 0xa7, 0xb4, 0x13, - 0x90, 0x8b, 0xfd, 0xff, 0xc0, 0x6d, 0x51, 0x06, 0x48, 0x49, 0xef, 0x88, 0x6b, 0x6a, - 0x1d, 0x1d, 0x7c, 0x3f, + 0xcd, 0x1d, 0xd3, 0x5e, 0xb9, 0xfa, 0xd9, 0x42, 0xb8, 0x69, 0xc8, 0x6f, 0xa1, 0x31, + 0x09, 0x83, 0x04, 0x78, 0x59, 0xfa, 0xe9, 0x09, 0xae, 0x97, 0x69, 0x7d, 0xa7, 0x0f, + 0xd5, 0x72, 0xa3, 0x16, ], internal_ivk: [ - 0xae, 0x18, 0xa9, 0xa4, 0x25, 0x12, 0x38, 0x7f, 0x92, 0xee, 0xc1, 0x34, 0xbd, 0xe5, - 0x28, 0xb6, 0x2b, 0x61, 0xe9, 0x95, 0x6f, 0x9f, 0xb3, 0xc7, 0xd6, 0x5e, 0x19, 0x45, - 0xda, 0x34, 0xf3, 0x09, + 0xa3, 0x36, 0xaa, 0x7a, 0xe3, 0xf6, 0xb5, 0x98, 0x3d, 0xad, 0xf0, 0x54, 0x93, 0xd5, + 0x76, 0xbe, 0x17, 0x31, 0x89, 0x7d, 0x36, 0x44, 0x83, 0x2b, 0x91, 0x81, 0xdd, 0xa1, + 0xbf, 0x7e, 0x1d, 0x17, ], internal_ovk: [ - 0x67, 0xa6, 0xd8, 0x4a, 0x81, 0x66, 0x32, 0x6c, 0xf3, 0x4c, 0xed, 0xff, 0xd4, 0x29, - 0x8a, 0x13, 0xb8, 0x01, 0xcb, 0x12, 0x2d, 0x5f, 0x33, 0x29, 0xa1, 0x59, 0x9f, 0x31, - 0xea, 0xdf, 0x5b, 0x17, + 0x9f, 0xa3, 0xc3, 0xb0, 0x3a, 0xf8, 0xc3, 0xf7, 0x87, 0x44, 0x1a, 0x8c, 0x34, 0x07, + 0x8f, 0x6f, 0x36, 0xbb, 0xdc, 0xfc, 0x9b, 0x11, 0x0d, 0x3e, 0x27, 0x59, 0x57, 0xc4, + 0x43, 0x9a, 0x25, 0x48, ], internal_dk: [ - 0xa0, 0x07, 0x3a, 0xdd, 0xfb, 0x89, 0xc9, 0xcc, 0x34, 0x9e, 0xad, 0x5a, 0x92, 0xb7, - 0xd4, 0x17, 0xfe, 0x0e, 0x61, 0xf4, 0xa7, 0xe5, 0x66, 0x69, 0xc9, 0x07, 0xd4, 0x17, - 0x46, 0xc0, 0x72, 0xb9, + 0x0c, 0xac, 0x83, 0xbf, 0x12, 0xf9, 0xc0, 0x56, 0x68, 0xa8, 0x3d, 0x27, 0x3d, 0x44, + 0x13, 0x85, 0x30, 0xd7, 0xa7, 0xf8, 0x76, 0x60, 0x21, 0xc5, 0x5b, 0x65, 0x03, 0xb1, + 0xda, 0xcc, 0xe5, 0x92, + ], + asset: [ + 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, + 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, 0x40, 0x50, 0xaf, 0xd8, 0xfe, 0x94, + 0xe9, 0x7d, 0x2e, 0x9e, ], - note_v: 625536973899669523, + note_v: 17139625070743016316, note_rho: [ - 0x03, 0xfd, 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, - 0x92, 0xee, 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, - 0x64, 0x0a, 0x69, 0x30, + 0x6c, 0x0b, 0x38, 0x99, 0xd4, 0x12, 0x22, 0xba, 0xce, 0x76, 0x0e, 0xe9, 0xc8, 0x81, + 0x8d, 0xed, 0x59, 0x9e, 0x34, 0xc5, 0x6d, 0x73, 0x72, 0xaf, 0x1e, 0xb8, 0x68, 0x52, + 0xf2, 0xa7, 0x32, 0x10, ], note_rseed: [ - 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, 0x16, 0x71, - 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, 0x15, 0x81, - 0xa1, 0x55, 0xfa, 0x3a, + 0x4b, 0xdb, 0x75, 0x07, 0x39, 0xde, 0x6c, 0x2c, 0x6e, 0x0f, 0x9e, 0xb7, 0xcb, 0x17, + 0xf1, 0x94, 0x2b, 0xfc, 0x9f, 0x4f, 0xd6, 0xeb, 0xb6, 0xb4, 0xcd, 0xd4, 0xda, 0x2b, + 0xca, 0x26, 0xfa, 0xc4, ], note_cmx: [ - 0xf7, 0x0e, 0xbf, 0x0f, 0x5e, 0xe5, 0xda, 0x6c, 0x6c, 0xde, 0xff, 0x8f, 0xec, 0x2f, - 0x8e, 0xed, 0x65, 0xc8, 0x8e, 0x67, 0x55, 0xda, 0xf1, 0x14, 0xd5, 0x54, 0xaf, 0x19, - 0x67, 0xa7, 0xf4, 0x0a, + 0xdf, 0x1e, 0x28, 0x2c, 0x9b, 0xf3, 0x09, 0x72, 0xb2, 0x8c, 0x46, 0xed, 0x8a, 0x54, + 0x42, 0x6d, 0xae, 0xc1, 0xae, 0x38, 0x1a, 0x38, 0x5d, 0xf2, 0x5f, 0xff, 0xfa, 0x66, + 0x79, 0x53, 0xd3, 0x33, ], note_nf: [ - 0x95, 0x64, 0x97, 0x28, 0x46, 0x5e, 0x68, 0x2a, 0xc0, 0x57, 0xad, 0x87, 0x62, 0x94, - 0xd7, 0x00, 0xc2, 0x7f, 0xeb, 0xa2, 0xf7, 0x50, 0x92, 0x2f, 0x95, 0x51, 0x85, 0x70, - 0x62, 0x61, 0xc3, 0x0c, + 0x97, 0x0a, 0xff, 0xd7, 0xf1, 0x0d, 0x5b, 0x71, 0x23, 0x27, 0xe8, 0x39, 0x7e, 0x51, + 0x45, 0x3f, 0x85, 0xf4, 0xc2, 0x0f, 0x80, 0x1e, 0x97, 0xe5, 0xe6, 0x40, 0x0e, 0xb0, + 0xed, 0xc4, 0xbb, 0x03, ], }, ] From 563b4e5502f0498675ae7a0f8a889eb0b5257e35 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Fri, 21 Apr 2023 14:34:50 +0200 Subject: [PATCH 23/67] Circuit: Update value_commit_orchard to take into account asset (#50) In the circuit, we update value_commit_orchard to take into account asset. Previously, value_commit_orchard returns cv_net = [v_net] ValueCommitV + [rcv] ValueCommitR.. Now, value_commit_orchard returns cv_net = [v_net] asset + [rcv] ValueCommitR. ValueCommitV and ValueCommitR are constants v_net is equal to sign * magnitude where sign is in {-1, 1} and magnitude is an unsigned integer on 64 bits. To evaluate [v_net] asset where v_net = sign * magnitude, we perform the following steps 1. verify that magnitude is on 64 bits 2. evaluate commitment=[magnitude]asset with the variable-base long-scalar multiplication 3. evaluate result=[sign]commitment with the new mul_sign gate --- Cargo.toml | 6 +- src/circuit.rs | 124 +- src/circuit/gadget.rs | 46 +- src/circuit/value_commit_orchard.rs | 341 ++ src/circuit_description | 4928 ++++++++++----------------- src/circuit_proof_test_case.bin | Bin 5154 -> 5186 bytes 6 files changed, 2251 insertions(+), 3194 deletions(-) create mode 100644 src/circuit/value_commit_orchard.rs diff --git a/Cargo.toml b/Cargo.toml index 5a09720a7..e482b0f76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,8 @@ blake2b_simd = "1" ff = "0.12" fpe = "0.5" group = { version = "0.12.1", features = ["wnaf-memuse"] } -halo2_gadgets = "0.2" -halo2_proofs = "0.2" +halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } +halo2_proofs = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } hex = "0.4" lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } @@ -52,7 +52,7 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] criterion = "0.3" -halo2_gadgets = { version = "0.2", features = ["test-dependencies"] } +halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" , features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" zcash_note_encryption = { version = "0.2", features = ["pre-zip-212"] } diff --git a/src/circuit.rs b/src/circuit.rs index 7ac075eea..c5bfc0444 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -46,7 +46,7 @@ use crate::{ use halo2_gadgets::{ ecc::{ chip::{EccChip, EccConfig}, - FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarFixedShort, ScalarVar, + FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarVar, }, poseidon::{primitives as poseidon, Pow5Chip as PoseidonChip, Pow5Config as PoseidonConfig}, sinsemilla::{ @@ -62,6 +62,7 @@ use halo2_gadgets::{ mod commit_ivk; pub mod gadget; mod note_commit; +mod value_commit_orchard; /// Size of the Orchard circuit. const K: u32 = 11; @@ -109,7 +110,6 @@ pub struct Circuit { pub(crate) psi_old: Value, pub(crate) rcm_old: Value, pub(crate) cm_old: Value, - pub(crate) asset_old: Value, pub(crate) alpha: Value, pub(crate) ak: Value, pub(crate) nk: Value, @@ -119,8 +119,8 @@ pub struct Circuit { pub(crate) v_new: Value, pub(crate) psi_new: Value, pub(crate) rcm_new: Value, - pub(crate) asset_new: Value, pub(crate) rcv: Value, + pub(crate) asset: Value, pub(crate) split_flag: Value, } @@ -175,7 +175,6 @@ impl Circuit { psi_old: Value::known(psi_old), rcm_old: Value::known(rcm_old), cm_old: Value::known(spend.note.commitment()), - asset_old: Value::known(spend.note.asset()), alpha: Value::known(alpha), ak: Value::known(spend.fvk.clone().into()), nk: Value::known(*spend.fvk.nk()), @@ -185,8 +184,8 @@ impl Circuit { v_new: Value::known(output_note.value()), psi_new: Value::known(psi_new), rcm_new: Value::known(rcm_new), - asset_new: Value::known(output_note.asset()), rcv: Value::known(rcv), + asset: Value::known(spend.note.asset()), split_flag: Value::known(spend.split_flag), } } @@ -475,23 +474,6 @@ impl plonk::Circuit for Circuit { (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) }; - // Verify that asset_old and asset_new are equals - { - let asset_old = NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness asset_old"), - self.asset_old - .map(|asset_old| asset_old.cv_base().to_affine()), - )?; - let asset_new = NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "asset equality"), - self.asset_new - .map(|asset_new| asset_new.cv_base().to_affine()), - )?; - asset_old.constrain_equal(layouter.namespace(|| "asset equality"), &asset_new)?; - } - // Merkle path validity check (https://p.z.cash/ZKS:action-merkle-path-validity?partial). let root = { let path = self @@ -549,22 +531,25 @@ impl plonk::Circuit for Circuit { (magnitude, sign) }; - let v_net = ScalarFixedShort::new( - ecc_chip.clone(), - layouter.namespace(|| "v_net"), - v_net_magnitude_sign.clone(), - )?; let rcv = ScalarFixed::new( ecc_chip.clone(), layouter.namespace(|| "rcv"), self.rcv.as_ref().map(|rcv| rcv.inner()), )?; + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + let cv_net = gadget::value_commit_orchard( - layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net)"), + layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net_magnitude_sign)"), + config.sinsemilla_chip_1(), ecc_chip.clone(), - v_net, + v_net_magnitude_sign.clone(), rcv, + asset, )?; // Constrain cv_net to equal public input @@ -1033,7 +1018,6 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; - use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; use crate::note::AssetBase; use crate::{ keys::SpendValidatingKey, @@ -1074,7 +1058,6 @@ mod tests { psi_old: Value::known(spent_note.rseed().psi(&spent_note.rho())), rcm_old: Value::known(spent_note.rseed().rcm(&spent_note.rho())), cm_old: Value::known(spent_note.commitment()), - asset_old: Value::known(spent_note.asset()), alpha: Value::known(alpha), ak: Value::known(ak), nk: Value::known(nk), @@ -1084,8 +1067,8 @@ mod tests { v_new: Value::known(output_note.value()), psi_new: Value::known(output_note.rseed().psi(&output_note.rho())), rcm_new: Value::known(output_note.rseed().rcm(&output_note.rho())), - asset_new: Value::known(output_note.asset()), rcv: Value::known(rcv), + asset: Value::known(spent_note.asset()), split_flag: Value::known(false), }, Instance { @@ -1128,8 +1111,8 @@ mod tests { K as usize, &circuits[0], ); - assert_eq!(usize::from(circuit_cost.proof_size(1)), 4992); - assert_eq!(usize::from(circuit_cost.proof_size(2)), 7264); + assert_eq!(usize::from(circuit_cost.proof_size(1)), 5024); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7296); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1156,74 +1139,6 @@ mod tests { assert_eq!(proof.0.len(), expected_proof_size); } - #[test] - fn test_not_equal_asset_ids() { - use halo2_proofs::dev::{ - metadata::Column, metadata::Region, FailureLocation, VerifyFailure, - }; - use halo2_proofs::plonk::Any::Advice; - - let mut rng = OsRng; - - let (mut circuit, instance) = generate_circuit_instance(&mut rng); - - // We would like to test that if the asset of the spent note (called asset_old) and the - // asset of the output note (called asset_new) are not equal, the proof is not verified. - // To do that, we attribute a random value to asset_new. - let random_asset_id = { - let sk = SpendingKey::random(&mut rng); - let isk = IssuanceAuthorizingKey::from(&sk); - let ik = IssuanceValidatingKey::from(&isk); - let asset_descr = "zsa_asset"; - AssetBase::derive(&ik, asset_descr) - }; - circuit.asset_new = Value::known(random_asset_id); - - assert_eq!( - MockProver::run( - K, - &circuit, - instance - .to_halo2_instance() - .iter() - .map(|p| p.to_vec()) - .collect() - ) - .unwrap() - .verify(), - Err(vec![ - VerifyFailure::Permutation { - column: Column::from((Advice, 0)), - location: FailureLocation::InRegion { - region: Region::from((9, "witness non-identity point".to_string())), - offset: 0 - } - }, - VerifyFailure::Permutation { - column: Column::from((Advice, 0)), - location: FailureLocation::InRegion { - region: Region::from((10, "witness non-identity point".to_string())), - offset: 0 - } - }, - VerifyFailure::Permutation { - column: Column::from((Advice, 1)), - location: FailureLocation::InRegion { - region: Region::from((9, "witness non-identity point".to_string())), - offset: 0 - } - }, - VerifyFailure::Permutation { - column: Column::from((Advice, 1)), - location: FailureLocation::InRegion { - region: Region::from((10, "witness non-identity point".to_string())), - offset: 0 - } - } - ]) - ); - } - #[test] fn serialized_proof_test_case() { use std::io::{Read, Write}; @@ -1305,7 +1220,7 @@ mod tests { let test_case_bytes = include_bytes!("circuit_proof_test_case.bin"); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 4992); + assert_eq!(proof.0.len(), 5024); assert!(proof.verify(&vk, &[instance]).is_ok()); } @@ -1331,7 +1246,6 @@ mod tests { psi_old: Value::unknown(), rcm_old: Value::unknown(), cm_old: Value::unknown(), - asset_old: Value::unknown(), alpha: Value::unknown(), ak: Value::unknown(), nk: Value::unknown(), @@ -1341,8 +1255,8 @@ mod tests { v_new: Value::unknown(), psi_new: Value::unknown(), rcm_new: Value::unknown(), - asset_new: Value::unknown(), rcv: Value::unknown(), + asset: Value::unknown(), split_flag: Value::unknown(), }; halo2_proofs::dev::CircuitLayout::default() diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 21d24333f..9864d65b0 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -4,15 +4,9 @@ use ff::Field; use pasta_curves::pallas; use super::{commit_ivk::CommitIvkChip, note_commit::NoteCommitChip}; -use crate::constants::{ - NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, - ValueCommitV, -}; +use crate::constants::{NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}; use halo2_gadgets::{ - ecc::{ - chip::EccChip, EccInstructions, FixedPoint, FixedPointBaseField, FixedPointShort, Point, - ScalarFixed, ScalarFixedShort, X, - }, + ecc::{chip::EccChip, EccInstructions, FixedPointBaseField, Point, X}, poseidon::{ primitives::{self as poseidon, ConstantLength}, Hash as PoseidonHash, PoseidonSpongeInstructions, Pow5Chip as PoseidonChip, @@ -107,41 +101,6 @@ where ) } -/// `ValueCommit^Orchard` from [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]. -/// -/// [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]: https://zips.z.cash/protocol/protocol.pdf#concretehomomorphiccommit -pub(in crate::circuit) fn value_commit_orchard< - EccChip: EccInstructions< - pallas::Affine, - FixedPoints = OrchardFixedBases, - Var = AssignedCell, - >, ->( - mut layouter: impl Layouter, - ecc_chip: EccChip, - v: ScalarFixedShort, - rcv: ScalarFixed, -) -> Result, plonk::Error> { - // commitment = [v] ValueCommitV - let (commitment, _) = { - let value_commit_v = ValueCommitV; - let value_commit_v = FixedPointShort::from_inner(ecc_chip.clone(), value_commit_v); - value_commit_v.mul(layouter.namespace(|| "[v] ValueCommitV"), v)? - }; - - // blind = [rcv] ValueCommitR - let (blind, _rcv) = { - let value_commit_r = OrchardFixedBasesFull::ValueCommitR; - let value_commit_r = FixedPoint::from_inner(ecc_chip, value_commit_r); - - // [rcv] ValueCommitR - value_commit_r.mul(layouter.namespace(|| "[rcv] ValueCommitR"), rcv)? - }; - - // [v] ValueCommitV + [rcv] ValueCommitR - commitment.add(layouter.namespace(|| "cv"), &blind) -} - /// `DeriveNullifier` from [Section 4.16: Note Commitments and Nullifiers]. /// /// [Section 4.16: Note Commitments and Nullifiers]: https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers @@ -202,3 +161,4 @@ pub(in crate::circuit) fn derive_nullifier< pub(in crate::circuit) use crate::circuit::commit_ivk::gadgets::commit_ivk; pub(in crate::circuit) use crate::circuit::note_commit::gadgets::note_commit; +pub(in crate::circuit) use crate::circuit::value_commit_orchard::gadgets::value_commit_orchard; diff --git a/src/circuit/value_commit_orchard.rs b/src/circuit/value_commit_orchard.rs new file mode 100644 index 000000000..078e9378f --- /dev/null +++ b/src/circuit/value_commit_orchard.rs @@ -0,0 +1,341 @@ +pub(in crate::circuit) mod gadgets { + use pasta_curves::pallas; + + use crate::constants::{ + OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, + }; + use halo2_gadgets::{ + ecc::{chip::EccChip, FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarVar}, + sinsemilla::{self, chip::SinsemillaChip}, + }; + use halo2_proofs::{ + circuit::{AssignedCell, Chip, Layouter}, + plonk, + }; + + /// `ValueCommit^Orchard` from [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]. + /// + /// [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]: https://zips.z.cash/protocol/protocol.pdf#concretehomomorphiccommit + pub(in crate::circuit) fn value_commit_orchard( + mut layouter: impl Layouter, + sinsemilla_chip: SinsemillaChip< + OrchardHashDomains, + OrchardCommitDomains, + OrchardFixedBases, + >, + ecc_chip: EccChip, + v_net_magnitude_sign: ( + AssignedCell, + AssignedCell, + ), + rcv: ScalarFixed>, + asset: NonIdentityPoint>, + ) -> Result>, plonk::Error> { + // Check that magnitude is 64 bits. + { + let lookup_config = sinsemilla_chip.config().lookup_config(); + let (magnitude_words, magnitude_extra_bits) = (6, 4); + assert_eq!( + magnitude_words * sinsemilla::primitives::K + magnitude_extra_bits, + 64 + ); + let magnitude_zs = lookup_config.copy_check( + layouter.namespace(|| "magnitude lowest 60 bits"), + v_net_magnitude_sign.0.clone(), + magnitude_words, // 6 windows of 10 bits. + false, // Do not constrain the result here. + )?; + assert_eq!(magnitude_zs.len(), magnitude_words + 1); + lookup_config.copy_short_check( + layouter.namespace(|| "magnitude highest 4 bits"), + magnitude_zs[magnitude_words].clone(), + magnitude_extra_bits, // The 7th window must be a 4 bits value. + )?; + } + + // Multiply asset by magnitude, using the long scalar mul. + // TODO: implement a new variable base multiplication which is optimized for 64-bit scalar + // (the long scalar mul is optimized for pallas::Base scalar (~255-bits)) + // + // commitment = [magnitude] asset + let commitment = { + let magnitude_scalar = ScalarVar::from_base( + ecc_chip.clone(), + layouter.namespace(|| "magnitude"), + &v_net_magnitude_sign.0, + )?; + let (commitment, _) = + asset.mul(layouter.namespace(|| "[magnitude] asset"), magnitude_scalar)?; + commitment + }; + + // signed_commitment = [sign] commitment = [v_net_magnitude_sign] asset + let signed_commitment = commitment.mul_sign( + layouter.namespace(|| "[sign] commitment"), + &v_net_magnitude_sign.1, + )?; + + // blind = [rcv] ValueCommitR + let (blind, _rcv) = { + let value_commit_r = OrchardFixedBasesFull::ValueCommitR; + let value_commit_r = FixedPoint::from_inner(ecc_chip, value_commit_r); + + // [rcv] ValueCommitR + value_commit_r.mul(layouter.namespace(|| "[rcv] ValueCommitR"), rcv)? + }; + + // [v] ValueCommitV + [rcv] ValueCommitR + signed_commitment.add(layouter.namespace(|| "cv"), &blind) + } +} + +#[cfg(test)] +mod tests { + use crate::{ + circuit::gadget::{assign_free_advice, value_commit_orchard}, + circuit::K, + constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}, + keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}, + note::AssetBase, + value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, + }; + use halo2_gadgets::{ + ecc::{ + chip::{EccChip, EccConfig}, + NonIdentityPoint, ScalarFixed, + }, + sinsemilla::chip::{SinsemillaChip, SinsemillaConfig}, + utilities::lookup_range_check::LookupRangeCheckConfig, + }; + + use group::Curve; + use halo2_proofs::{ + circuit::{Layouter, SimpleFloorPlanner, Value}, + dev::MockProver, + plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance}, + }; + use pasta_curves::pallas; + + use rand::{rngs::OsRng, RngCore}; + + #[test] + fn test_value_commit_orchard() { + #[derive(Clone, Debug)] + pub struct MyConfig { + primary: Column, + advices: [Column; 10], + ecc_config: EccConfig, + // Sinsemilla config is only used to initialize the table_idx lookup table in the same + // way as in the Orchard circuit + sinsemilla_config: + SinsemillaConfig, + } + #[derive(Default)] + struct MyCircuit { + v_old: Value, + v_new: Value, + rcv: Value, + asset: Value, + split_flag: Value, + } + + impl Circuit for MyCircuit { + type Config = MyConfig; + type FloorPlanner = SimpleFloorPlanner; + + fn without_witnesses(&self) -> Self { + Self::default() + } + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let advices = [ + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + ]; + + for advice in advices.iter() { + meta.enable_equality(*advice); + } + + // Instance column used for public inputs + let primary = meta.instance_column(); + meta.enable_equality(primary); + + let table_idx = meta.lookup_table_column(); + let lookup = ( + table_idx, + meta.lookup_table_column(), + meta.lookup_table_column(), + ); + + let lagrange_coeffs = [ + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + ]; + meta.enable_constant(lagrange_coeffs[0]); + + let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + + let sinsemilla_config = SinsemillaChip::configure( + meta, + advices[..5].try_into().unwrap(), + advices[6], + lagrange_coeffs[0], + lookup, + range_check, + ); + + MyConfig { + primary, + advices, + ecc_config: EccChip::::configure( + meta, + advices, + lagrange_coeffs, + range_check, + ), + sinsemilla_config, + } + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl Layouter, + ) -> Result<(), Error> { + // Load the Sinsemilla generator lookup table. + SinsemillaChip::load(config.sinsemilla_config.clone(), &mut layouter)?; + + // Construct an ECC chip + let ecc_chip = EccChip::construct(config.ecc_config); + + let sinsemilla_chip = SinsemillaChip::construct(config.sinsemilla_config.clone()); + + // Witness the magnitude and sign of v_net = v_old - v_new + let v_net_magnitude_sign = { + // v_net is equal to + // (-v_new) if split_flag = true + // v_old - v_new if split_flag = false + let v_net = self.split_flag.and_then(|split_flag| { + if split_flag { + Value::known(crate::value::NoteValue::zero()) - self.v_new + } else { + self.v_old - self.v_new + } + }); + + let magnitude_sign = v_net.map(|v_net| { + let (magnitude, sign) = v_net.magnitude_sign(); + ( + // magnitude is guaranteed to be an unsigned 64-bit value. + // Therefore, we can move it into the base field. + pallas::Base::from(magnitude), + match sign { + crate::value::Sign::Positive => pallas::Base::one(), + crate::value::Sign::Negative => -pallas::Base::one(), + }, + ) + }); + + let magnitude = assign_free_advice( + layouter.namespace(|| "v_net magnitude"), + config.advices[9], + magnitude_sign.map(|m_s| m_s.0), + )?; + let sign = assign_free_advice( + layouter.namespace(|| "v_net sign"), + config.advices[9], + magnitude_sign.map(|m_s| m_s.1), + )?; + (magnitude, sign) + }; + + // Witness rcv + let rcv = ScalarFixed::new( + ecc_chip.clone(), + layouter.namespace(|| "rcv"), + self.rcv.as_ref().map(|rcv| rcv.inner()), + )?; + + // Witness asset + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + // Evaluate cv_net with value_commit_orchard + let cv_net = value_commit_orchard( + layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net)"), + sinsemilla_chip, + ecc_chip, + v_net_magnitude_sign, + rcv, + asset, + )?; + + // Constrain cv_net to equal public input + layouter.constrain_instance(cv_net.inner().x().cell(), config.primary, 0)?; + layouter.constrain_instance(cv_net.inner().y().cell(), config.primary, 1) + } + } + + // Test different circuits + let mut rng = OsRng; + let mut circuits = vec![]; + let mut instances = vec![]; + let native_asset = AssetBase::native(); + let random_asset = { + let sk = SpendingKey::random(&mut rng); + let isk = IssuanceAuthorizingKey::from(&sk); + let ik = IssuanceValidatingKey::from(&isk); + let asset_descr = "zsa_asset"; + AssetBase::derive(&ik, asset_descr) + }; + for split_flag in [false, true] { + for asset in [native_asset, random_asset] { + let v_old = NoteValue::from_raw(rng.next_u64()); + let v_new = NoteValue::from_raw(rng.next_u64()); + let rcv = ValueCommitTrapdoor::random(&mut rng); + let v_net = if split_flag { + NoteValue::zero() - v_new + } else { + v_old - v_new + }; + circuits.push(MyCircuit { + v_old: Value::known(v_old), + v_new: Value::known(v_new), + rcv: Value::known(rcv), + asset: Value::known(asset), + split_flag: Value::known(split_flag), + }); + let expected_cv_net = ValueCommitment::derive(v_net, rcv, asset); + instances.push([[expected_cv_net.x(), expected_cv_net.y()]]); + } + } + + for (circuit, instance) in circuits.iter().zip(instances.iter()) { + let prover = MockProver::::run( + K, + circuit, + instance.iter().map(|p| p.to_vec()).collect(), + ) + .unwrap(); + assert_eq!(prover.verify(), Ok(())); + } + } +} diff --git a/src/circuit_description b/src/circuit_description index 66bdfeadc..212da733f 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -7,7 +7,7 @@ PinnedVerificationKey { omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, }, cs: PinnedConstraintSystem { - num_fixed_columns: 29, + num_fixed_columns: 30, num_advice_columns: 10, num_instance_columns: 1, num_selectors: 56, @@ -17,32 +17,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -57,7 +41,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -72,7 +56,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -87,7 +71,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -129,32 +113,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -169,7 +137,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -184,7 +152,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -199,7 +167,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -272,32 +240,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -312,7 +264,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -327,7 +279,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -342,7 +294,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -388,32 +340,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -428,7 +364,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -443,7 +379,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -458,7 +394,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -500,32 +436,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -540,7 +460,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -555,7 +475,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -570,7 +490,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -612,32 +532,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -652,7 +556,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -667,7 +571,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -682,7 +586,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -735,32 +639,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -775,7 +663,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -790,7 +678,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -805,7 +693,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -851,32 +739,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -891,7 +763,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -906,7 +778,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -921,7 +793,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -970,21 +842,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -998,8 +886,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1009,12 +897,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1088,21 +976,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1116,8 +1020,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1127,12 +1031,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1214,7 +1118,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -1338,7 +1242,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -1502,7 +1406,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -1652,7 +1556,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -1778,7 +1682,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -1917,7 +1821,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2061,7 +1965,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2205,7 +2109,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2347,7 +2251,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2489,7 +2393,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2589,7 +2493,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2689,7 +2593,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2789,7 +2693,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -2889,7 +2793,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -3018,7 +2922,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -3109,32 +3013,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -3149,7 +3037,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -3164,7 +3052,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -3179,7 +3067,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -3278,53 +3166,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3334,12 +3190,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3349,12 +3205,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3385,53 +3241,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3441,12 +3265,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3456,12 +3280,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3492,53 +3316,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3548,12 +3340,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3563,12 +3355,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3632,53 +3424,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3688,12 +3448,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3703,12 +3463,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3864,53 +3624,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3920,12 +3648,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3935,12 +3663,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4033,53 +3761,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4089,12 +3785,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4104,12 +3800,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4298,37 +3994,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4342,8 +4022,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4357,8 +4037,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4372,8 +4052,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4438,37 +4118,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4482,8 +4146,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4497,8 +4161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4512,8 +4176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4670,37 +4334,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4714,8 +4362,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4729,8 +4377,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4744,8 +4392,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4839,37 +4487,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4883,8 +4515,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4898,8 +4530,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4913,8 +4545,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5049,7 +4681,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -5195,20 +4827,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5222,8 +4854,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5237,8 +4869,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5252,8 +4884,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5286,20 +4918,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5313,8 +4945,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5328,8 +4960,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5343,8 +4975,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5377,20 +5009,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5404,8 +5036,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5419,8 +5051,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5434,8 +5066,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5501,20 +5133,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5528,8 +5160,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5543,8 +5175,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5558,8 +5190,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5717,20 +5349,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5744,8 +5376,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5759,8 +5391,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5774,8 +5406,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5870,20 +5502,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5897,8 +5529,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5912,8 +5544,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5927,8 +5559,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7602,16 +7234,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7626,7 +7274,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7641,7 +7289,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -7710,16 +7358,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7734,7 +7398,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7749,7 +7413,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -7847,16 +7511,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7871,7 +7551,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7886,7 +7566,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9732,16 +9412,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -9756,7 +9452,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9771,7 +9467,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9812,16 +9508,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -9836,7 +9548,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9851,7 +9563,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9892,16 +9604,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -9916,7 +9644,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9931,7 +9659,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9985,16 +9713,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10009,7 +9753,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -10024,7 +9768,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10069,16 +9813,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10093,7 +9853,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10108,7 +9868,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10142,16 +9902,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10166,7 +9942,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10181,7 +9957,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10231,16 +10007,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10255,7 +10047,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10270,7 +10062,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10348,16 +10140,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10372,7 +10180,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10387,7 +10195,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10421,16 +10229,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10445,7 +10269,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10460,7 +10284,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10533,16 +10357,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10557,7 +10397,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10572,7 +10412,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10613,16 +10453,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10637,7 +10493,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10652,7 +10508,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10700,16 +10556,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -10724,7 +10596,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10739,7 +10611,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10802,20 +10674,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10825,12 +10697,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10840,12 +10712,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11147,20 +11019,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11170,12 +11042,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11185,12 +11057,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11492,20 +11364,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11515,12 +11387,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11530,12 +11402,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11845,7 +11717,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12001,7 +11873,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12409,7 +12281,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12565,7 +12437,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12712,21 +12584,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12740,8 +12628,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12755,8 +12643,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12796,21 +12684,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12824,8 +12728,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12839,8 +12743,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12880,21 +12784,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12908,8 +12828,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12923,8 +12843,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12955,21 +12875,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -12979,12 +12931,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -12994,12 +12946,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -13468,7 +13420,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13577,7 +13529,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13686,7 +13638,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13727,53 +13679,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13783,12 +13703,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13798,12 +13718,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13848,53 +13768,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13904,12 +13792,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13919,12 +13807,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13993,53 +13881,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14049,12 +13905,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14064,12 +13920,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14112,53 +13968,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14168,12 +13992,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14183,12 +14007,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -14234,20 +14058,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14261,8 +14085,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14276,8 +14100,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14291,8 +14115,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14306,8 +14130,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14739,37 +14563,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14779,12 +14587,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14794,12 +14602,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14809,12 +14617,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14824,12 +14632,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14896,37 +14704,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14936,12 +14728,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14951,12 +14743,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14966,12 +14758,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14981,12 +14773,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15053,37 +14845,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15093,12 +14869,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15108,12 +14884,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15123,12 +14899,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15138,12 +14914,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15181,37 +14957,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15221,12 +14981,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15236,12 +14996,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15251,12 +15011,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15266,12 +15026,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15318,37 +15078,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15358,12 +15102,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15373,12 +15117,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15388,12 +15132,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15403,12 +15147,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15479,37 +15223,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15519,12 +15247,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15534,12 +15262,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15549,12 +15277,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15564,12 +15292,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15614,37 +15342,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15654,12 +15366,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15669,12 +15381,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15684,12 +15396,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15699,12 +15411,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15788,7 +15500,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15900,7 +15612,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16012,7 +15724,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16143,7 +15855,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16262,7 +15974,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16393,7 +16105,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16536,7 +16248,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16641,7 +16353,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16746,7 +16458,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16865,7 +16577,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16970,7 +16682,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17075,7 +16787,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17180,7 +16892,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17311,7 +17023,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17431,7 +17143,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17543,7 +17255,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17655,7 +17367,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17813,7 +17525,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17925,7 +17637,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18037,7 +17749,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18112,8 +17824,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18124,8 +17836,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18135,12 +17847,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18150,12 +17862,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18165,12 +17877,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18180,12 +17892,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -18230,32 +17942,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18270,7 +17966,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18285,7 +17981,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18300,7 +17996,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18315,7 +18011,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18358,32 +18054,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18398,7 +18078,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18413,7 +18093,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18428,7 +18108,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18443,7 +18123,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18505,32 +18185,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18545,7 +18209,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18560,7 +18224,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18575,7 +18239,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18590,7 +18254,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18633,32 +18297,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18673,7 +18321,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18688,7 +18336,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18703,7 +18351,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18718,7 +18366,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18768,32 +18416,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18808,7 +18440,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18823,7 +18455,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18838,7 +18470,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18853,7 +18485,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18915,32 +18547,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18955,7 +18571,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18970,7 +18586,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18985,7 +18601,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19000,7 +18616,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19050,32 +18666,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19090,7 +18690,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19105,7 +18705,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19120,7 +18720,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19135,7 +18735,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19171,32 +18771,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19211,7 +18795,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19226,7 +18810,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19241,7 +18825,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19256,7 +18840,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19292,32 +18876,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19332,7 +18900,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19347,7 +18915,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19362,7 +18930,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19377,7 +18945,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19413,32 +18981,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19453,7 +19005,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19468,7 +19020,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19483,7 +19035,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19498,7 +19050,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19560,32 +19112,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19600,7 +19136,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19615,7 +19151,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19630,7 +19166,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19645,7 +19181,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19707,32 +19243,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19747,7 +19267,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19762,7 +19282,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19777,7 +19297,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19792,7 +19312,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19828,32 +19348,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19868,7 +19372,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19883,7 +19387,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19898,7 +19402,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19913,7 +19417,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19951,20 +19455,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19974,12 +19478,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19989,12 +19493,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -20004,12 +19508,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -20019,12 +19523,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -20034,12 +19538,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -20106,7 +19610,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20253,7 +19757,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20400,7 +19904,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20521,7 +20025,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20657,7 +20161,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20816,7 +20320,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20963,7 +20467,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21084,7 +20588,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21205,7 +20709,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21341,7 +20845,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21469,7 +20973,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21616,7 +21120,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21763,7 +21267,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21898,7 +21402,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -22019,7 +21523,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -22140,7 +21644,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -22276,7 +21780,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22404,7 +21908,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22532,7 +22036,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22706,7 +22210,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22834,7 +22338,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22962,7 +22466,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -23136,7 +22640,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23188,20 +22692,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23211,12 +22715,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23226,12 +22730,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23241,12 +22745,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23256,12 +22760,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23271,12 +22775,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23316,20 +22820,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23339,12 +22843,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23354,12 +22858,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23369,12 +22873,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23384,12 +22888,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23399,12 +22903,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23471,7 +22975,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23599,7 +23103,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23749,7 +23253,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23896,7 +23400,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24031,7 +23535,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24152,7 +23656,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24273,7 +23777,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24409,7 +23913,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24556,7 +24060,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24703,7 +24207,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24824,7 +24328,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24960,7 +24464,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -25039,974 +24543,11 @@ PinnedVerificationKey { Advice { query_index: 6, column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, - ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, - ), - }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0200000000000000000000000000000000000000000000000000000000000000, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, - ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -26113,21 +24654,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, ), - }, + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -26234,21 +24801,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Sum( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Constant( + 0x0000000000000000000000000000100000000000000000000000000000000000, + ), ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), - }, + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -26342,7 +24935,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26356,6 +24949,13 @@ PinnedVerificationKey { ), ), Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, Advice { query_index: 9, column_index: 9, @@ -26363,20 +24963,6 @@ PinnedVerificationKey { 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - ), ), ), Product( @@ -26470,7 +25056,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26483,47 +25069,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 16, - column_index: 5, + query_index: 18, + column_index: 7, rotation: Rotation( 1, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 11, + column_index: 9, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -26631,21 +25191,14 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( Sum( Advice { - query_index: 16, - column_index: 5, + query_index: 7, + column_index: 7, rotation: Rotation( - 1, + 0, ), }, Scaled( @@ -26656,20 +25209,39 @@ PinnedVerificationKey { 0, ), }, - 0x0400000000000000000000000000000000000000000000000000000000000000, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), Scaled( Advice { - query_index: 9, - column_index: 9, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + 0x0200000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -26780,13 +25352,25 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 16, - column_index: 5, - rotation: Rotation( - 1, + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), - }, + ), Constant( 0x0000000000000000000000000000000400000000000000000000000000000000, ), @@ -26914,17 +25498,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, Advice { - query_index: 8, - column_index: 8, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, ), @@ -27035,17 +25619,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, Advice { - query_index: 18, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -27154,6 +25738,254 @@ PinnedVerificationKey { ), ), ), + Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 11, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 16, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Advice { + query_index: 16, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0400000000000000000000000000000000000000000000000000000000000000, + ), + ), + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Sum( + Sum( + Advice { + query_index: 16, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), + ), + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, Product( Advice { query_index: 9, @@ -27672,6 +26504,15 @@ PinnedVerificationKey { 0, ), ), + ( + Column { + index: 29, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), ], permutation: Argument { columns: [ @@ -28342,47 +27183,48 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x0ba01714529dc85dd2460cdbf014b71e7638d18a35eacf06868020c27c28232d, 0x2dcbb2c3191f582b6882cc9c5e6cac1a0361d0534f8f4c814e33a272b8e8da8d), - (0x0f8fb02c096c0957230639133087e8ae516d04d1678ace6ab0495a8e8576c0db, 0x2842b28258744140b09e0d27559d84e1d8f1d55350b0af37237879d14f8eb2a1), - (0x36f2f0410d5ab00d5296bf101cbd91008551d4afe2b5ac45fc437aa157c731aa, 0x19e8c688f0c92a3db3e74b66075d2e0771d5c744e77090c487ffca245a7f7f96), - (0x09ce7fd65bf8af2b554230465003160d3d0b7bfc495f6d33f5f0704cb57d6320, 0x38d3478df8841a4f7a74a3c1fe7788e6e1cbb1076d5f7358be729fa2572c9530), - (0x2abaec8c54bde721f7f2aea685764c80b0b935447c00173ff34209ac8d96b633, 0x36957cf784345bfbdb97f0fad0b74d3e5d683fcc80ee407d6a6bedfe097c0011), - (0x3f1845e758196892c66d920980dc29cc2e1844fa03575668bf84349071094207, 0x1873355bc49aeed1faee56e6d21907a5277fcd0283a3f51fface877e1c59f046), - (0x04e5834f610cf806911a2e9c14519132a49ac55f40095c3156e3b20d09a2f250, 0x2ea666b99d148e1090b42fd2f67fd34c7e94ca505447c1431485eca09ed1fe0b), - (0x35de09079a5b05d25f756479ea044c654c97043bc4a79b34f860faa9b049337a, 0x06c4cc500093cfdc9bd284f3c44a2a8856cfc8ce70786dd65787397292e4fe53), - (0x235b63a940346f07c5a669831067ba59acb3b9936db7d66c4a4cf6746af5f97e, 0x0d838f859fb1386034263d43ace744961a310f548f7274586f133aa4ddc779a9), - (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), - (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), - (0x1e5ddb2d4ee82f8d1982eb0333d98528efeb71f4d413fea2f1eed9e2c4d19dc3, 0x3e092c6d429d9f7d5b5a729af533e7b9e943752835b540060a2e0e31aa25958e), - (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), - (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), - (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x088ced578c98f9634cd7aba72b2ff3c6a43109aca67cd1cdc0717a70da32aebf, 0x1a17c29333cc59a199472807282d2b8364baf57ac00e8c29f51dcde32f0b6549), - (0x0525a1d721b05a02ee6e9580254e13213ada10c168213fbfebc7c1c71de072d2, 0x2edc5a41f195c2cc25cefce1405af856721c23dadb1728b2ff3335f08118c4c6), - (0x02e4214937491f7c86b1e37516f7ad0d030beeeab0149ef9062a7ec77604890e, 0x3d1763bcb3f7b989fccb1376b291dfbaef0e139ce4e3f43854fe507bbaad59d5), - (0x3f9542a72fadf26c1931411e1d690e89fef20b05a20f9706f1231e23adb00082, 0x0676af65a2925d168339df2b8dcee0139cbbfaec9470ed902ad600362602737d), - (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), - (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), - (0x18909046614ff6e61f755dbbb92989aac36dfa3d92fb8b54a37600ccb8cfba82, 0x053ec2a2bdc4e2771bfd6bc883c02db47d38d199bdab01adea7b1a272f223b7c), - (0x23a3dcd68c8a837c9eb84436ab2a184973d6fd3a1ba05d92d6fd747d23c799b0, 0x3f3802f0cfeaaae7f5f766bd3231299654bfd0a5d27b7f1d2ea93bee3d95b4b8), - (0x2331a44c6cf195b1afed0198fbe5a39da809e9815252a0aaa71a45803c81fb3b, 0x3223527d36e068b4821c95d09de240340564a5884bd6363ffd0c2f1961871651), - (0x2aa6286d3aba61beb097804a736279e5d0df5be592d21bdf04b1c418a2a20c69, 0x2d48db2dceacb16afe698d7a8314a2870939101a5cac866a70a946f3c46c3e73), - (0x1a81a317cb5b7169c17c6568fb7641cbe98969f8bee26164544c8cf3b8b4ac3b, 0x003012d4d94fc0502d0c8fd0322de8d1317a30fd8282a07f3eed945c678faf3e), + (0x212ebe88f06142f838a0c5c4496fa768ae3ca10f1ce9022c562b26bfbdc498c3, 0x2b6528f6317e63892bed284c67f112218631e191be7d5fdc5cdf7b9e92c72e05), + (0x034445b7457e04150c75a6c82e6f83ce2e1adf0e54aae2cfef0531b24dde111f, 0x30a7f9ce9bd574162a4729f71d8c7f0c61a4b7de6aa0181eefad3693aeb09c10), + (0x2a119980555858bc332f02295311e188f6125be71b5e591fff068a5024571aee, 0x23803ce939432804d484b29078c9c161015408e5e383a8cfc8c13a30502c9400), + (0x085620965e456f2f2b98a365768c7be2e43577bd0ef92a50cc278d521e983e9f, 0x3f1f003651d27a02d609eb61fbba5e74bb61c63b5afcce2c683948c5caa22791), + (0x3dc695372b0d52f554c7ab1cee168937f45f3abdd2e8fdf65f3b523ec85a499a, 0x33ef73e550024b2285b082816eb8818e80255973d9560fd437387cdb870190f1), + (0x1028b99218dd2642e60b90b28ae9cecd4be814de17a429314530f9a8695ce1c8, 0x2592dc76f783462d5b3bed02626ef2514deb59b7a6a8438ff64fdf6aafa00d4f), + (0x10fea717c33f17c73458742a1431679d61a436da080918e030b1760627a9538b, 0x0faf9983733b318f75d91c0c1131cfe7c67ef5474657d36c5ecd566b9629b6cf), + (0x3c242ccdb145d93f2cf312fbaab513b66b4cacd30de01fe193984aec912dd1a0, 0x1fa195c07847db8e31bdf7993ea787c9656a9d86babdeeddb76817d3c546348c), + (0x3229e787cb7ce31299dedd67d2631c480399a333098f84e7577132aac163ec8d, 0x3822eb1cc8eb19179373ea6b66b25b26ac8c915f0c9382800dd45a5a408fd1fc), + (0x10f84d5a9fad7c64be8a3529d1dd98c0961df4bb677b6a60714ddb053792998e, 0x0f032b93492b60aed3339d5646e15d2a9a46557cb01621b8d3d1392207ed0021), + (0x1d5193db32232d750432a8ec23f74307ad8194a0a4ad273c9b761b4e0f365d0b, 0x0b73549978b1c24dcbb39570d9fab795337f6030f2fffb9452b5edba0dcd2906), + (0x12967b9d3412c47744d16acede02d8214db2def9bfa643cc3da724f3f4edecaf, 0x3744e1519dcf0ae6bdc813ef1a123fd7978c073232164050a9a24fcd57d9a0a2), + (0x02602bfa02be45cec73e24099a3ff88e66386fc8a55f60af328afe5a68007233, 0x3db6b250fdd9abcc16f17275cc83ac66c9a2d91954dce867f23497a3ad85a85e), + (0x274c6a300449842b07918941f243beac24a66bd9870bf0b1c59b0b6056200a73, 0x1a19946639473486c5aebb6f2c7f0ed9bfa6a072a37857b9cbd801174b6a152a), + (0x2280ada329e3a43f320cdd86e0cfbea20620a02c772fccb8f34091832b9c4e1c, 0x0f47924c100e3c314835e8e1112a21a9aa54122548b5a2fbf1ddca681f64d148), + (0x2cde628fe6b43f6d0a2406f020530790a1c03642bec15a27e4883830f1906f75, 0x269f42895d8fb9cdc21fe307bf0cf994bc8d4f57f5c9757d7e7f491f67218f41), + (0x385b8c0d2d99558538cb3a9f9032a5aa40e73909f80c72d4b56dabbd35da1edf, 0x3926c421e68c459e921bc92c452b6d471810358c9c9941d0e15255f07e81f52a), + (0x365be6624d5ddbced07b7759377bd70f42ef5c0727849dcf4295e2be882a1229, 0x2379fbecf58b756b83626b73e0a4fe3043b6f6f7d3cca1c35ae298993be00b55), + (0x3992f02cfe9f649c235efb0b12057bf4a6a23de1e9186ecd4755cde6af9f18a1, 0x3defc298ff6d6e34e250f303089cc3ff36f9960f3c37dbff959ec4d722c21354), + (0x0b89c282c8f2d54e66c7a11e6b4338a2f06a7c9430f7d3376328f12fa001cac5, 0x098b5c8ee6548183ccb4e60cdfee10b509db34ed136daf3530a426e8f200e89d), + (0x2f7f85b86b6adcf714d0df7878f4604d33fd319f39bd00fd5c34378247a155b5, 0x3a2f025447b83b65d148e99c93fe8bb991a81ef6d2f827f010680467361c47fc), + (0x1c2d777a98c9dbcf31b45d5a7584b154daed974f3263b6a93831d53bf593e6c2, 0x234766a4b905ed9627f6a200a7b0b50315203613a5b211494a94cf21fb4c386b), + (0x2ebbe4228a40b24bc3f05a07484c2d470ca997d5fd030a26c3c475fd24c5f71b, 0x00f27b013a7a80f1221a9fcf44332b3842ac2af0af4a7108e966f765d8ccebab), + (0x1484b5ee3bd870af246676953341b0825bac76cbe5a753c014bbd04c499c3946, 0x09860840096085811328952d906cdf7bdb748db7e08157d96b3252f909cbc6a9), + (0x13c4224160178c41c828d952f78a8a0d58321a7894cee8f2884c5d1d9e3246ac, 0x3699ad2eb29f2cd4825c0e7cbde86eb19889a00f4afd8cbe40d2eed7c7efd565), + (0x3e6b0d18402a8533aa2c9a681ef0c9c3636154feb1a95b6a50c522833f6e2cb1, 0x20336e540af50c99ef3208ff5dc2f4f0deb2c8beb8f1b3da046eebb05e39deee), + (0x16e89e0cf09f1d68ce3f16728839b4973604d9cad2a6ae3114ce75ce5cb7edeb, 0x1db108cbdb6e1af19ca087d3649ac673d59ced15e6780957d26a83aa8865f116), ], permutation: VerifyingKey { commitments: [ - (0x39c3094020a1b893afa09240d88a468f5803f8c67efd9bb4b1c0bfb94dab6271, 0x0416775ce28cc7214bd6573f9c5e3f2972abb9f4468c1acf8dd5005dcfc3841f), - (0x1eee618d6829a4cbe8bcaad592b532e181af07bdc5074bcfed31b08ade1e27a8, 0x1bcec4c593b72804ac2e9eaa9706b38aae13ad1898cfc11c547741c73e63c3c6), - (0x37be1e93e1e474611af94327cb85b27f652a1b1bbfd952bf3ee45be138918fe0, 0x250bffe2eacca2244b2ae88dccc8c0678f8d3b0ba4d1e4f663dcd95eff0be5cf), - (0x2d95cfb99fce4d1ce1ab680674b4344cb0689c82bb667953a88d25f73a07a3a6, 0x30b015209e497612526ce2b940f38b73608a791bf1b9081ec6592aa4a3b3d6e2), - (0x20384319aa772450c3f144ad974a5ba707e863419e0d035d8c60debaaeff9283, 0x3909e58668259a03f10d849f032963686cf15e49ff5c993bbbf4b913c1e57d6b), - (0x1240cf41a87879f67dab54f4580882aea1d1b5154b821c0c40b15b9635d0487e, 0x1792251c1ac4a5e689b6d75696d7cfd3d157561e5dd5c48508add90da16d7a51), - (0x0546256e9b7ed28e1bd03fba20aab2f954f477856c7cd26e81c11e31065a0820, 0x1ff390755b1b4a2568762672a7a62e147f12a1cbe8a898dd4b078f5b7bf47253), - (0x322ad473ba02ff5d65ef29f0593b823a974cee815177a9f946bd1dd09f5d8fd3, 0x3dc0527f997c8c0948b32dbaf41e1d8c5cd057152fe54a6c8ea9f7d20285c111), - (0x2ab170c47a1311a82abf11d9f34b6fb47f4955740987f6a2afee3c9a7544dfb3, 0x0513f4a2c077a7c6ed881afe96c90e8e13d31c22b5f53a4203f75c7011bc72f5), - (0x085e66ccf3a3667cdbb2d5abaa37d339b594c079e3a06bf2cda8345a2fffcd88, 0x36da573fe8112eec770349dbcae747acb8a513b0504606285970d653bf25c2e2), - (0x2aa7abe46cd3f3786469fd351047535d2596525d93573a6af9044a223e1fc170, 0x246a8655cc204e81045bdc047627c364f7e501ac24a89372a1dbcb8a515d6016), - (0x1ad163c8b2e5840d94fe2925b62824788b50bd130c6deb3dc01f2f77d246c6eb, 0x2f3657736db088a93fba26e49be620728061d989717ba60899d22e22dfd7ec6f), + (0x12dbf09e55d044102f1ae361e8d266b69e1718e1d624b96e77b3cfa1feceb732, 0x31caaac60ce9718af01c87d262fec2c754c77550d8bb35e63f8b07fa9c89fc66), + (0x22da488fb2f178bb8139f14a2aec59c91799533c774af776e94c104f7687c421, 0x2af740c09b699a113bfc6e74b029298d54af6bfb0b92da9c1b0bded28625f450), + (0x2b48b45f4a5a2b4d3605d823a561d7cf0e0ba56c0cbc5d40b58b1b8ea7e36ae5, 0x1035a22259f1b163d3aeb91785cbda566f1501d75011335fa62a0f904c1cb318), + (0x16940bc043dab8afc2a1459edac40382bd790dee8c14db086c4619dc53ebb2e9, 0x1ad505a146f27451d13f90c75b8651eb10a3f67cc6609ea75ca71eee7c1c157d), + (0x3a3ed02c9cbf7b5d099b4c7e3f12f46f3fd898e07f8e7a4f707b1df7f5de3ac3, 0x1d90e34b6d292a48989e3fd47d0eee2ecdffe086ce57e43e1c98dd63ced3fcda), + (0x1f622082868867262854bb7e8cf99d8414bbb244abffde123330b8aed84bd92d, 0x244be4573a4986eaff1e2a6beaa0aecdcdb361540f0b8cf4db289242c6eaefc2), + (0x2d8cbc3dc5fada2ddb980b66a31f57cb02af14982712cb1a12c0d11945811a0e, 0x330cc47c866342bdcd769f9c4ac214a022894aaa4f706182ac5b9e7abac7b2ee), + (0x0367c84844db2532b1fe3833504c46fb366ed8a6b91053a64bb820b5407ba0f1, 0x17fab750fb792623f23d091a07bbc30ce0a669d7270ea36ca38b934bb3caa135), + (0x088b09cd2e59ab2d95dd62077692f366604d9dbda58f7915e5b7c4874cb7ac17, 0x3ce41c4b67191c663c5c5e2413b5359bf55f2d59b65f91b086a2aadfaf4816a2), + (0x230701deaa69a778874d4fa8682366c61954107150807386f5d335157eb93395, 0x000d66512afd16ccc26d6d086a116dfd6f246ec5e4817a71832244218ac6fd9b), + (0x3b7b47bca87fc15cd5565b546ce7624078f7cbf71d4ef78360740cecc16a6415, 0x20ab204faaa0df261b922ee76d97057b4bfa1fb7f2e50015b2aae29d4dbb820c), + (0x07ff65506877a9a21905ddfa323607a02794f495d6448484fda71859af8d51db, 0x0fb1605d3e8d4a77121e70e1339b819825cf04c10edf28b4bf5238a836608c74), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index fe636afae568d1de011e6fded98e266980089870..5dd1fc5e7183999c1b9ac0de02fe9397a2e426e6 100644 GIT binary patch literal 5186 zcmV-I6us+AkN=mk0lNZDxzLX2@2D)A+VkFK>(TB{q7qvd+X6a=5RvhG4uftyeQqGM z?%q5OGxoeyJQ1&KH=B4kWSXCZu5FgR%TM9cM^C;CI_VwMk-&yWpUW5XbWiEQlEe$Q zh+t8ONXh6C0PR0oTZM+p3Ke{_mH*xwV#yD_jW(l;0*jZ}|J3j%CV9wCCA&^@ibH0) zBw+Euk#KDYT^%6-0e6@V&s^GWM3-oMO35J){VtqmR7Ws&Gje$?jsjy<9CIFnqgHb) z=2dOHs~5J8@w0%VVDs2F;k>wvBeH=$2>PGBJCulUZc*|m?l<38z)%>en&u3-zf|r@ zi%iyVncBYz&q!_6m(M^VBa9($u*u;R?dk@;e@TM;7n=esi$;DHQrj~6wtqx{jDK8@ zk!2ywQmTNzxb9|4rskGMCg}{Z<~dNGzH+M=x_)~-vf>(2Cl9SRy0Cv~UraQNDHuB^ z&x^~KZFi|REs-2FY!D$~U&}U*eT7SEK}H0a7xy!*<{2>3NXL$dwv--jZ{!Cu4(eLt zO`~}L1COAql*F*aMHI=x2!DpHn|dW8+%7?cx}<_5n(0~>**SapKOL}+w7noH@e9K~ zS>#2>x!HtP>oLUa#!K7PO!l1k4|X$vgr=Z)@-#T|gC3tYk644|d=bbm@PMy;WMP*k zwZQ*Esj1PkL=jEp_EwW+j~c3K&F*~!rQuasS@MvNl(YqL9Rj=p)vy776Z4#6LkP6B zzD&gO`z*f;EbN&w5S9FhYF3dssrSY(=}h1}=rLwsE4QzU;cm_nqn8cMKir_YZCiwL z0ooWx;Sx~-=13(wutU(h;{`L~{r112n`2bUAzBxymTKc9$!F7?Ko^)*egN{WCGHv? z4Nxos6yB$K#q0<>u@M^pm0KB2?gF0G<=f~oL6Wt}2JE%CeuYw`$%=?ZTZ%Nef zq}*s|N2*)Cx`)JM)x;u(KG3Q4g00y7ktL0zVjwCQOtg4mls@tE96cG18Sn=vq$0kK%OIace;v7YL(E`LFMpilXp^~FS{Qk7rA zrj~1E6}{UWRlB;Ao7_8(Ogl*saUgwf4-{L0DBl)Nvg(vYV9nQVq&&Mr#}jeaLh)$I zvcB%Bg5H2rA;%A?v`JUayUmSLJy&DaEXf$ir{A(c)&k?Qr0=>T$G@Ju45~?ikSro< z@lHR{r0ssLUI0!0q16^PFOC^3 zTvZus0~`!3bUUY;fS^x;v1=jY;BaxpUhJr&N(juNkoz?DD#Q%eu-kRb#(&<+Sk7X0P9DS=KosmRPaafzAf^Z>y%&=nc}K9E0zsmu$8RsX)lrzs z<^0(J%*etTt`IGM+2mMk2-wn+F!3ZBAR;^radg*chqOI1S=3ij9^xp?jPsX}@gC5V zEw}|QE8Y0AL!SnhM1~~NH@W}|_T|<~eyn|{Ywc_CFiqrNJ8E44H9N=kxFj6%kl2s~ zxD6OaXVu)CX-0V10YEl}&XouScT7&0CKf-=7kS0p9jJTHLZ= z71O+)Rd(ywqtZK%F6A-n_sO}*n1(OuKS;#mn8f9j;2oi;7XQ{}c^`oS_+}zY=Pl!1 z)H(d0FRymDB~mah`Ac{Yd53=^kp)3EV&rJ&?azDn%*o`v6sx4LWn32&=wY`CyJ6YC zF*ocOmf72_ejfyC7wsSE4?4vTEmYGrsTe~?>HAuy z_4zVIRvC0iuV?yBWx%`K{E8a>0j%M{voeD&wJpbsV?B)AF&vY>HdjGrhx;Q1f!yIF z3{3S2g>JKPp!iL&&NDS=^;;|k<&*4HEBXf3E4JO9IL5KXBEbtOSHgx7j`*SwmDbeg zS$kyu`EC5JNBn&d9D9fR3aT1lL3!@G2(+;;uyeAMPiYe5o*uWt*fPuD09j<^TRnuT zMleRyUwaM~vNZ5tXu9(Y@-w=4%0SgD!>k^ndw2)T39l&F@}ebYq1i6ZR_+ZO=OHHCvR!I z8d!KI+v<~qp^SJU4aw&r^+pK&X@(EeGbYA>B!G*c(PMU-UYC!TiHa5-g8OG2{zLie ziq&l}Lr0Uw1SeAO{U6?^ef9X5b>_AG+GbDS^B5A6{U|9ON}YmhEQ=+8maH!2?8h$S zdv;|+edM0dIJ;0A4_VBt&RYHt9~m>|;>wa~RrvnAagIjNslN<9vrTb~Xnd*er9%U_ z0IPybJWp-?(Br$HSI>FRK&t8hG+!HgF`}-geU!aM8MZxc;M47p=~d(v3*ttu|wYJG?qUww5HZLwpY4#E@i z=hHcaIT6i}Vtx25kY?kODH%=h3x7s|9p5aRZdMe-BGEC81phm2=I)qeo_`U4ccnT? z!gFfx!o2}ACD|%5E-S}|5CaXW?khn4V_l;7T6&^eB{__C3L)RDQ#o!*nu`Pz0^+@# ziSL;^Os`V$s$q>WsBY>If7gfYttA&cj}@u7BAE#ZJ122+e_(T*A0#zErd$mjdY5dO z2X17aOA=#FE}A!c#im8P%D|7%km#_RU$Qlq;l&7RaC)xnwq*&jIb~`fS9LH?VJMPv zmz&`Qj7@}5HhAijdi1vbS$GR5G5pWwc&A9Ik6iX3voiPT3?d{&`G@fvUu-trg2oz! zGT^>(6Fltwiig0sr~tG0D;;jRYWqpq^v8O6ut;LvIgN&Jy>;1qQeSeL(< z>@4H(_({TR!VRWOESl}Gt>NWX#2Agq-p_SRsfWd{?_0_x$o?Bo1;xnk3KZQ*ZZ8>G zfVa{I16o7O!>KA>$A2v48M+9OdaSa$HhStD+&ajb?r{?d#JX>7Um$YO;qmcgD{_KV zu|WPr2WitmiF1$ID+tfPf?Cog@^l>ha)b*C_VnC_@j@FfAw;7HL$As9Q98oUcFsk< ziR3GNVkpnx@0Hw#kB*9BA89s6JFRDrpq1T){#tHNwP1*8Qj|PRO*_wdn$OFCA3;cB z?ja8hx)FrhmoG6FC4Ww8_xhHeu=71%iwkS@4<9f0jhLb;fYVl13hwO)gcN`c*>z_H zVpVE5?#&3=0D(7_rlLOwqPo(7>-AwE_C^qKR(2l(T_=h>Y#rjC8{;3op%_IPuhm}=n)@X5QO(p>G&WbB>D#I+5aO~)`Vul2H8E$w^*ameX z2KNXNFceRF(5_#y3Q6%ZF!h5Uhk3{Z5l~8&2QmF`z%;dboGCRDc?@&0Db#|w{zCo_ zP{$)2$hU?!E>4+w9A9FNHD|gO>}PJO8sTm6z5>|_mSYWPI=Y#@n$&gr>=M$Zz2+}V zg9agkJU;?Y2YU`jWGD#YlPs7pXWpwv&if4u*F6J}6#S{@7O-e-jFgPfDAPxgte^`Ox$ z=i?8#K49O@DYi=jtb_&yaWo6d>~ zAh7k>V*;~%tFO)~Yb#SqpUHKOEP2r3ZDuR#4f0Opf}#vieNfWs;3O4)C2Gs5UD#)2II2UX-4Ev?E|Dq)ZpX7k&c(VTVWvLu8H zEl4H(AMV$3vT?b48I$w9@xeP7potG9z6yu3MRHtRFq70Qv*hNBtB{MZD_S%tdCrW_ zW!$cAfu-E+%11SAF-*JQU~UDiYHjnmoisQPFb@}~|B1Ks+ecfhWCbc9P zIGqqngA8=b&N~X27FFCeWv^L`~#8|&_+<n~F!zQKZixNZn7UK%wp-!a!~>Z<2gAB-ZH7y{-urX_Bdu?i0E>od z7wjd(mWYoW!_!(wAb2vsHN~o8x|J^F2l@`L*rN`Xfo30a!wA*4Md)X8F?iuJsVMl)e)2GWoePzi>NjZ#8&!m#9j60d9^e!v+V>GeIL+7_&q-rvS4E9*@nzUXooNcuqp_@n*Bmp?2+|Moh+N5#ShUYaaV|F_7bN_+-9@%m-+o zg5j#BH4n9d0534knQ0;lM35W%mAI+;WkC7C>i9Brm%|Kw+5m`N?0JW(mT*VBn)C$K z9ey=YDd(;(W-v6b6y*q%QgU zU11ULWf@DrB(6CRE24(h%Xm;#lB^66L8Q@^iXTbWuRf6T)0|t34<9y60RpKoj9zMs z3C|~u+ZXIZ4~ZA*$(H*Ewtz`7S!r|$3*>{4Ij_3~4)7@1h95A(!0S=vU6KKk#w>=F zHp!`;9o4?=-{D$IyLRU}X4sF}r$MyUYtU&3_W{6=f1&Zk-&OkuAh&Q7)VK zqp625O*`=uZ025T)o!TErZ`efR*6W8SnFTVvGL9RB2n*0^b06T<=9_7Mg@zrv3VrU zzD+mDV`ogqH*#T<(C*r01L-G=dfMOb?!YrMIX|*)pG0g;>HOp!Kz+6(J!qqx;D3p` zh@EE`HkZpIJy>>%@l5Fv9lP#L@oAgb_Qq`$sqt(%WWsFKY(zY`xWd~*i4)<|?B51S zx9A+Vomtc`0Zxxx(qq)Fv=XgwsW)WERm~SFK1QzDkz0r!oWmU0<&)6bbcpiuZ-teH z24ZdrA(p(=TUrP1Y8HQX9Q3`kHoD}R0f$cZdNQSR5O#gz;XjBNI)Enhj-^`sZm4R< z2jmVfmKVNqvUyz#x#vw@D4{oZi=dVxU#+uCI*=h2#t+kh<~$m`Y)#9z57}u7?FuXj z-oK4`BUj6WNJ!=tais7l&oyv~E>raUAjqOT9K*D!UPWp_&|NBd`2eXc|?iGL6vrkQN_*W&l zQ?O~k^Cf@P$&f1?`!FG1FEx2PoH?PEf~8_J7T}IS)jWyM;bsrNB8*N9-Z$Po zAckPn#ExguIG99tJ{kNFFD*lv^9haZ_l);&_0I_-z~wcCbKpwvHU(-ze>Yd^K{N% zvB?66TzmBN(KPqOMZ3c~NL~cL504Ip!49uIBMOY8;mzDGWYya`F!r z0J+aArFyvl;xz5vfaghxZQDXH}Ma1bAwgB8;_4dFlxb=S!D2Wo#CA&!HV z!&?OSeSvy-iOm%O0U-{~FadjYxF&FSV@HB+fUnfj&_5Jx zu#T%zxqn*>(e_*?XAYs>652){deNngtzXiL*7R4e8}@WYxsI@aDch{0zjQDDV43aZ z1%NuIh~h1LZasE*ysOKvAtZvRoRMbjX^pfZlx^^Ts^^i3u%Jk)ktEtUb*<0x*CjR? zsfxD}wt~#X82?d18grnhCF=&P_fuRIAH<49b$`9hY82OfN@omV?rLR-D;#;HB}fD| zLEbIIMi%f%22ZC5sR_HKxMJI9vVFpnCsCMW8N;WbAHO&G%=80LH8eHS-A+D@y($Vg zAkQx_qvq$Hpi*vLaRZKk)yy+rPoWYv=Hbw1Jl0VTa#}5(X>cvMv|1a_H?3<5c3Kp? z?x&g1iPZ!?z?4zWskhu3_vzOUjUI*3W0r@&_+rMXhql-4MeD-0WG1t%HLjr0`?p*y z3&K3#ElW>qUH2d&r?RsXyYx}yws-*6pb-6eP?gojqO;1;i2Dh8uR$G_JY^_8%Z@6P zF;KF%DVh8UEIWzit>j4)7R6_Gll#obU0kOOl4wpZ%e*7E!ZDBVd7qFFeYi_kS@J%a zZ>)2^wF)GpLG{fDI)nWY8fUe;d_RQbD2+}b8%kn0Mi{!%%=PCi;9084RmzLu4+<{p zC*n0|V*@4D6;;7~eYFIC1=~h;RsV~R6%q5E#txS-bwQ{1OQJC7pNxhQ-e5=f*MxOB z`XQynBSZ$T>rqw}#;QJG5$fV|thk9a`_T*x&@Dvz(vtZh-Fq(m^U|H0{Ck}3Wti#Q=n5+Z0kH5r*|#9%RNbt{m#L{qN`Q^S$V@Sk(X_|u=R?+Xi+7^xvo7DR zv2(`bVSz4-5T;}llpwtFj*H@Z;|ovskY10H*A)&Op{T?z5saJwB7l*wHCATYKR%-) z)@JXQvyh?V6MnHjZMJ)EeHJHv>Ee79d{x`FWOnP-x}s2FqbYoyI)Q|rz27XIscyc| z*zt8WVV4AEH9CV-H( z^&+HejSYHSFyGIbbYBuB&}qAAnAYJ(k}Tp+LP=?SH$VWZkF$7AIi*g{=!G}j194nP z%y+v>0bt24VFF})3d>^&iX_?@7iQo)>mY<(bn5eBGf#l(Wcv)GIF#-$mxtDFBi$eG!4coV$tv4PlhHo0}<&|Em8QO=|bGO)G{nWA`Sq6ngB8f|C%bR!p z4FJrrAl2MOj23)UP1_J?C}7T>Bx{^$0Dv+8FUU@a#2#?#VjDfQ^kFYgFmf;*OX-X! zSFN9@ExolUbaPUS)!s~mOJsuqX7x7&Y3=z4!pA|2>GPH70Luz=R)R@(Qin*oz8nAOT1*C@-c=J62sSC;Iuw!P z&h)f`9=lA`{R+3GbW@+Yg$@%=_UWgBPi}l z3kiwZm0d2TD2LmFjuXs6M<6bU*zJ>4O{6BRuV(vz#1{u6i zVddN2GL4eFpqJWWuzp*coVbWxre@wB zHMCT!2!;~Ef>7Mo=vnJcD^yog+xy@1z2CP)Z>h0JtFKX`JOVkU>sG1J4m5!14caE* z0brsSLfTxD4?Sbw5QQhxCv=Ub171QQ~W~1%enumc`!L6^>IAqADF`f;NIt+vs z#AVICwn{b-Kob(6Yyp&(cR4kwDyK}?Q2dAja15t(a^6hNCD+Tyg}moM zPS|-YA5H(JvUqce6kcOA_M6v{y+xQ@=F3$TOkT~~{zNKi5JkYR&{q(k3hj!YbxKyk zIl{T`8$~!RhXYAS``%xyqkX_?X^4#S3UPaXcpFj`S0}=>Qs&wV@~3ZNw0ivMKl^0c zYh|@mE7Rr%$=}Dx$@NFK7n*O>)W5GIRSIfR0+*Pq*WOb&9Dm`PcOYTVhuM~}GV$7>)ciG6-6VV<=>vJGR-b1=!mmO$K2|Nl+4U zB~_sxw$lBDJZ3ZXnkAbyVdBYrgkVv{g13Ovu~m@tVDqMjns68N;yW0-}X$gIIt zzj7;?mRgel82UXJhznCrXo#*y%pFJ#>x>~j15_>ZI@ zJyQ3h{LO<0Z^Q$BvR(#ON;oL(vV1`&Yj5GD!;)YL7KZ$h6Cd3$fk4rBK$k@_?o6Mc z?sS~*zGlht!zPEDJWuzYY}_@qh7NTopsoz@(GsZ!H*V|z!SF>L=S@hgEHl%XWnEmi z4H6SGuN7#4#--*Hu=0^!^u^gBkD!(sG4VpB-rZAnX=H!SoBFl?2kB$li$EBBOJ z^Uug5*}m8OZSD{fapn$ZGiz9zNOZRj%A0PukiKw{CM!}AKg7~A)$FGB_k+}<9vh0+ zaY|z9Nm;6PAL1yjZl@kGpn$?ydj2JVsf$E$6RHS+qb3IBh;tnfrvc#9TygBf7pE8% zID__AOaWXA;@`EF4gBa)ji5!xDil;vU~&t`J! z>m&a3+b(j{TV+9@6Nphi=E2ZoKlVyjpyRo2V&J(xw|b`~Pyf6LIYTS=NLUU-gS1^D zEe>812fYj(ZS{JE?>RKe`hv6f66DDz9m)&L+hF&cF$7kU!@*ZZ?&QrzS2Qw1Uviko z`gqK|RZBOG?hl*r4B~x4)O%3CQ6lYuD1sGy@oWxo%`U=|DuSAggUiKwD0Wb2XcjS3 zpyec{1~iP)Er;+$!U$X(^QF}zD5}5e0%74c1an*o0!NK4K%I>o(Uf2gyfH--$rJAC zY_d{o1KHG_or=a6?#msaP$7=plK~H=U&s!D=SIhO$Kv`NHkuG^-f3v5L85nZwK-Ws z6td2X6?rB+Tt3OaTMmLOGi+4p*W1qx!m;IzZ`0+0{@z#OXfsCm~RC zGO;`L6ZiTIp6YbGgdb$F@Xyzy~ExO>-cv&9GTN zycFb=IKW%-PZ64ExB-~ z$R1gqU(pB|Hz=S#71=nFiHDDaQAaBZ4CNmiu>+n_Z>@?lSm

5z4f$eYFG}{=|M7 zj-)dQb8+2}Tkk)PwcmP3`)=vk1YQJbjZgkM%$|>q`za+&^-#mebwakBfkQ@jHEIbm zH~5W>azj2XZ^8sb=Gf-y{soU4rPxEUAgp$njsWQv7l~zh+u)`Ft`P|_c(RIUtAd6Q z+IK7G8%#_J#Sz|HD&TL}YX649Cot)@nw(zvCR%+_FDZ@F=Oqf~f_=n=3ktx;hmf4{ zTz^scMM563CFYyMTNj5UKVD2M>SNnfNl8;Iuz*X|?R3J^1znLL-N7V0DUImd&8>7;) zu?s{nwQ@$JPsTJdBumCaI6N#lrGD>uqML9_ zF&5dbS(8(`1J><;h)xHA%4$=xG2UEdDw^%L@JI1fn2q zk?2SfbaZraH-U8D2MBB+?qG0DSXSMJQEFtJxv<2L8OJ!W-UT?I=bL&(8({QUfs0)f zVZaI8kO33iY-kO}0(((xnth+;3T60p7ym%1Jbe?e)$vg7NYGzirqNjN<$o6?{{!(z z=~ZWw30A1ynpj6Z2vQZefNP`$1?Mvs>@9x_{2pPf){xW-rme_qtv*>U_u=NThCa32 zn*U&1QRgCxt|u?L4Ji-a?s+Puz((n}RyW@XX!Di8-0 zOA0P6Ss%TUo;_=voo~$)Z)(4Q5BA)>`Kg;iA|}id%GhFE9n4#(uQ?sT|C!nWH?{bE zsE~B78JdD*j5)GS!(9w*c%pNNClG(0>=Em<^xAnrAg1IBnk+RYvw-7qrgj@Fo@c*X zJ#il`N~=6DVdOiWS~o0O;Y&(DdK(?D__sTUzmA_pNy z58u$qw7tUK+yurk38Ws-TLWo1fxn8j>`MaNM;VAgF0ST8C?PW)e{Zo4kNYhV%3F#> zHgX&+nWtrHK=0J#>DAr5C_=f-SFD03Iye0ynbp%oR6}jQN8Yeg`RXwa3z;l-Csds< zLw)i&gj?tzT*%d9yRZ|eY%u0bL|jXZq<5kDBao=c<5YB129eo6w|3J2q&96@o04bf z?vqrI{X>AUQ?Y9%LHnNYnB{xR;AgS1#Thu&{$89!LnW{seU3w{(1qRa!7m*UD&cH_ z`F>uY-Ha!EvI8ZI^x#q}aeI&UVK_IFL}Rcg5$~Ghem%E$rQ+LKLps2lSKd`k!l6eE z2KAzdKDV=A5e(e}JN!892oX#5^@8OBMFJ88aM0jnHD3VGub=nM7LJlvoL((n56p Date: Tue, 25 Apr 2023 14:46:26 +0200 Subject: [PATCH 24/67] Constant-time note commitment for ZEC and ZSA (#54) We would like to have a constant-time evaluation of the note commitment for both ZEC and ZSA. ZEC_note_commitment=Extract_P(SinsemillaHashToPoint(zec_personalization, common_bits) + [rcm]R) ZSA_note_commitment=Extract_P(SinsemillaHashToPoint(zsa_personalization, common_bits || asset) + [rcm]R) R is the same constant for ZEC and ZSA note commitments. --- Cargo.toml | 4 +- src/note/commitment.rs | 96 +++++++--- src/test_vectors/keys.rs | 63 ++++--- src/test_vectors/note_encryption_v3.rs | 240 ++++++++++++------------- 4 files changed, 223 insertions(+), 180 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e482b0f76..17656f550 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ ff = "0.12" fpe = "0.5" group = { version = "0.12.1", features = ["wnaf-memuse"] } halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } -halo2_proofs = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } +halo2_proofs = { git = "https://github.com/QED-it/halo2", branch = "zsa1"} hex = "0.4" lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } @@ -52,7 +52,7 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] criterion = "0.3" -halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" , features = ["test-dependencies"] } +halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" zcash_note_encryption = { version = "0.2", features = ["pre-zip-212"] } diff --git a/src/note/commitment.rs b/src/note/commitment.rs index f95d8be82..18024afe8 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -4,7 +4,7 @@ use bitvec::{array::BitArray, order::Lsb0}; use group::ff::{PrimeField, PrimeFieldBits}; use halo2_gadgets::sinsemilla::primitives as sinsemilla; use pasta_curves::pallas; -use subtle::{ConstantTimeEq, CtOption}; +use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption}; use crate::{ constants::{ @@ -56,35 +56,42 @@ impl NoteCommitment { let rho_bits = rho.to_le_bits(); let psi_bits = psi.to_le_bits(); - let zec_note_bits = iter::empty() + let common_note_bits = iter::empty() .chain(g_d_bits.iter().by_vals()) .chain(pk_d_bits.iter().by_vals()) .chain(v_bits.iter().by_vals()) .chain(rho_bits.iter().by_vals().take(L_ORCHARD_BASE)) - .chain(psi_bits.iter().by_vals().take(L_ORCHARD_BASE)); - - // TODO: make this constant-time. - if asset.is_native().into() { - // Commit to ZEC notes as per the Orchard protocol. - Self::commit(NOTE_COMMITMENT_PERSONALIZATION, zec_note_bits, rcm) - } else { - // Commit to non-ZEC notes as per the ZSA protocol. - // Append the note type to the Orchard note encoding. - let type_bits = BitArray::<_, Lsb0>::new(asset.to_bytes()); - let zsa_note_bits = zec_note_bits.chain(type_bits.iter().by_vals()); - - // Commit in a different domain than Orchard notes. - Self::commit(NOTE_ZSA_COMMITMENT_PERSONALIZATION, zsa_note_bits, rcm) - } - } - - fn commit( - personalization: &str, - bits: impl Iterator, - rcm: NoteCommitTrapdoor, - ) -> CtOption { - let domain = sinsemilla::CommitDomain::new(personalization); - domain.commit(bits, &rcm.0).map(NoteCommitment) + .chain(psi_bits.iter().by_vals().take(L_ORCHARD_BASE)) + .collect::>(); + + let zec_note_bits = common_note_bits.clone().into_iter(); + + let type_bits = BitArray::<_, Lsb0>::new(asset.to_bytes()); + let zsa_note_bits = common_note_bits + .into_iter() + .chain(type_bits.iter().by_vals()); + + let zec_domain = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); + let zsa_domain = sinsemilla::CommitDomain::new_with_personalization( + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + NOTE_COMMITMENT_PERSONALIZATION, + ); + + let zec_hash_point = zec_domain.M.hash_to_point(zec_note_bits); + let zsa_hash_point = zsa_domain.M.hash_to_point(zsa_note_bits); + + // Select the desired hash point in constant-time + let hash_point = zsa_hash_point.and_then(|zsa_hash| { + zec_hash_point.map(|zec_hash| { + pallas::Point::conditional_select(&zsa_hash, &zec_hash, asset.is_native()) + }) + }); + + // To evaluate the commitment from the hash_point, we could use either zec_domain or + // zsa_domain because they have both the same `R` constant. + zec_domain + .commit_from_hash_point(hash_point, &rcm.0) + .map(NoteCommitment) } } @@ -140,3 +147,40 @@ impl PartialEq for ExtractedNoteCommitment { } impl Eq for ExtractedNoteCommitment {} + +#[cfg(test)] +mod tests { + use crate::constants::fixed_bases::{ + NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION, + }; + use crate::note::commitment::NoteCommitTrapdoor; + use ff::Field; + use halo2_gadgets::sinsemilla::primitives as sinsemilla; + use pasta_curves::pallas; + use rand::{rngs::OsRng, Rng}; + + #[test] + fn test_commit_in_several_steps() { + let mut os_rng = OsRng::default(); + let msg: Vec = (0..36).map(|_| os_rng.gen::()).collect(); + + let rcm = NoteCommitTrapdoor(pallas::Scalar::random(&mut os_rng)); + + let domain_zec = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); + let domain_zsa = sinsemilla::CommitDomain::new_with_personalization( + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + NOTE_COMMITMENT_PERSONALIZATION, + ); + + let expected_commit = domain_zsa.commit(msg.clone().into_iter(), &rcm.0); + + // Evaluating the commitment in one step with `commit` or in two steps with `hash_to_point` + // and `commit_from_hash_point` must give the same commitment. + let hash_point = domain_zsa.M.hash_to_point(msg.into_iter()); + let commit_r_zsa = domain_zsa.commit_from_hash_point(hash_point, &rcm.0); + assert_eq!(expected_commit.unwrap(), commit_r_zsa.unwrap()); + + // ZEC and ZSA note commitments must use the same R constant + assert_eq!(domain_zec.R(), domain_zsa.R()); + } +} diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 02c9cfc78..8fa650a37 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -1,4 +1,4 @@ -//! Test vectors for Orchard key components. +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_key_components) pub(crate) struct TestVector { pub(crate) sk: [u8; 32], @@ -26,7 +26,6 @@ pub(crate) struct TestVector { } pub(crate) fn test_vectors() -> Vec { - // From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_key_components.py vec![ TestVector { sk: [ @@ -654,14 +653,14 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0x08, 0xcb, 0x05, ], note_cmx: [ - 0x71, 0x99, 0x1e, 0xeb, 0x4b, 0x51, 0x7e, 0xd9, 0xd4, 0x31, 0xdc, 0xa9, 0xa2, 0xbb, - 0xcf, 0x1c, 0xe8, 0x75, 0xe8, 0x55, 0xdf, 0xf4, 0x8c, 0x69, 0xf4, 0xef, 0x51, 0x01, - 0x1e, 0x86, 0x1e, 0x07, + 0xf1, 0x34, 0x33, 0x5c, 0x60, 0xf3, 0x17, 0xec, 0x48, 0xd6, 0x7b, 0x49, 0x34, 0x58, + 0xde, 0x26, 0xb4, 0x06, 0xfd, 0xd2, 0x10, 0xf8, 0x60, 0xb1, 0x81, 0xaf, 0x7b, 0x82, + 0xcd, 0xe9, 0x4e, 0x37, ], note_nf: [ - 0xdf, 0x79, 0xd4, 0xa4, 0x6e, 0xca, 0xfd, 0x34, 0x50, 0x9d, 0x41, 0xfc, 0xfb, 0x61, - 0x3e, 0x1f, 0xdc, 0xbc, 0x0d, 0x3b, 0xa0, 0xaa, 0x8d, 0xe5, 0x04, 0xd6, 0xf2, 0x54, - 0xcd, 0x55, 0x12, 0x32, + 0x75, 0x6c, 0x1f, 0x4b, 0xfa, 0xae, 0xc5, 0x5b, 0x42, 0x0a, 0x4f, 0x88, 0x12, 0xdb, + 0x6c, 0x43, 0x2e, 0x48, 0x61, 0x6f, 0xb8, 0xd1, 0xbb, 0x2b, 0x1d, 0xd1, 0xe7, 0x2c, + 0x0a, 0xa3, 0xdb, 0x3a, ], }, TestVector { @@ -760,14 +759,14 @@ pub(crate) fn test_vectors() -> Vec { 0xa0, 0xd4, 0x70, 0x19, ], note_cmx: [ - 0x94, 0x81, 0xcb, 0xac, 0x4e, 0xb0, 0xc0, 0x8d, 0x12, 0x83, 0x47, 0x13, 0xb5, 0x15, - 0xfd, 0x8c, 0x61, 0x0d, 0x44, 0xc1, 0x29, 0x50, 0x97, 0xcc, 0x20, 0x13, 0x4d, 0xe2, - 0x1c, 0x63, 0x6c, 0x29, + 0x07, 0x1c, 0x49, 0x8b, 0x02, 0x6b, 0x8b, 0x1a, 0x7a, 0x1e, 0x84, 0x00, 0x13, 0x87, + 0x20, 0x82, 0x3d, 0x80, 0xec, 0xa4, 0x99, 0xac, 0xd2, 0x91, 0xfc, 0x07, 0xfd, 0x2f, + 0x41, 0x6e, 0x83, 0x38, ], note_nf: [ - 0x44, 0xc8, 0x8d, 0x03, 0x10, 0x21, 0x56, 0x11, 0x25, 0x6a, 0xad, 0x07, 0x34, 0x99, - 0x43, 0x08, 0x94, 0x59, 0x73, 0x17, 0x15, 0x75, 0xae, 0x7e, 0x89, 0xf5, 0x8d, 0x44, - 0xde, 0xa2, 0x67, 0x10, + 0x22, 0x55, 0x5e, 0xe7, 0x85, 0x46, 0x8c, 0xc7, 0x70, 0xca, 0xf9, 0x0f, 0x82, 0x61, + 0x1b, 0x80, 0x15, 0xb0, 0x3d, 0xd8, 0x85, 0x6c, 0xc9, 0xa2, 0x7c, 0xbf, 0x7f, 0x5c, + 0x31, 0x3d, 0x96, 0x0e, ], }, TestVector { @@ -866,14 +865,14 @@ pub(crate) fn test_vectors() -> Vec { 0xe5, 0xe1, 0x71, 0x1c, ], note_cmx: [ - 0xfe, 0x09, 0xf5, 0x89, 0x7c, 0xed, 0xc7, 0x67, 0x7c, 0xf5, 0x80, 0xc5, 0xf0, 0xd1, - 0x83, 0xed, 0x3b, 0xc0, 0x94, 0x5c, 0xb1, 0xc3, 0x85, 0xf3, 0x88, 0xf9, 0x3f, 0x94, - 0x3e, 0xff, 0x2a, 0x2f, + 0x7b, 0xc1, 0xdd, 0xba, 0x52, 0x06, 0x14, 0xdd, 0x4e, 0x44, 0x3e, 0xaa, 0xf2, 0x5b, + 0xea, 0xa0, 0x14, 0xc2, 0x78, 0x6d, 0x15, 0x0a, 0x3b, 0x6f, 0xea, 0x97, 0x6a, 0x9b, + 0xdf, 0x27, 0x02, 0x04, ], note_nf: [ - 0x80, 0xdf, 0x21, 0xbf, 0xeb, 0x46, 0x06, 0x16, 0x06, 0x29, 0x61, 0x03, 0x86, 0xc7, - 0x99, 0x02, 0xef, 0x49, 0x8b, 0x61, 0xb1, 0x55, 0x0c, 0xbd, 0x10, 0x55, 0xf8, 0x26, - 0x94, 0xfa, 0x5b, 0x03, + 0x78, 0x31, 0xe9, 0xc5, 0x1c, 0xc1, 0xdc, 0xa6, 0xda, 0x89, 0x1a, 0xde, 0xad, 0x3a, + 0x79, 0x24, 0xff, 0x26, 0x4b, 0xe4, 0x25, 0x0b, 0xec, 0x05, 0xc5, 0x92, 0xd3, 0x14, + 0x52, 0x6b, 0x1a, 0x2f, ], }, TestVector { @@ -972,14 +971,14 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0xdb, 0x41, 0x87, ], note_cmx: [ - 0x5e, 0x54, 0xfe, 0x7e, 0x59, 0x52, 0xa6, 0xea, 0x26, 0xba, 0xbc, 0x32, 0xcf, 0xed, - 0xf5, 0xe6, 0x0b, 0x56, 0x82, 0x58, 0x98, 0x0d, 0x92, 0xc1, 0xe5, 0xdd, 0x3f, 0xdf, - 0x3e, 0x48, 0x7e, 0x1d, + 0xea, 0xf9, 0x49, 0x1c, 0xab, 0xca, 0x20, 0x07, 0xba, 0x91, 0xea, 0xc9, 0xb3, 0xc0, + 0xa1, 0x1c, 0x58, 0xef, 0x5f, 0xe0, 0x71, 0x86, 0x8c, 0x66, 0xf1, 0xc5, 0xf5, 0x9c, + 0x7c, 0x99, 0x25, 0x14, ], note_nf: [ - 0x45, 0x5f, 0xd0, 0xe5, 0x2e, 0x59, 0x33, 0x62, 0x57, 0x2d, 0x12, 0xdb, 0x44, 0xbb, - 0xf0, 0xe0, 0x95, 0x8a, 0xf9, 0xd5, 0x8f, 0xbd, 0xf9, 0x7b, 0x85, 0x22, 0x8e, 0xca, - 0xd0, 0xde, 0x7f, 0x05, + 0x3a, 0xbc, 0x17, 0xad, 0xee, 0x2a, 0xa8, 0x8d, 0xf8, 0x93, 0x99, 0x4f, 0x1a, 0xf2, + 0x71, 0x51, 0xc1, 0x8b, 0xa6, 0xa9, 0x89, 0xc4, 0xbf, 0xfb, 0xb9, 0xa9, 0x18, 0xd5, + 0x50, 0x71, 0x95, 0x02, ], }, TestVector { @@ -1078,14 +1077,14 @@ pub(crate) fn test_vectors() -> Vec { 0xca, 0x26, 0xfa, 0xc4, ], note_cmx: [ - 0xdf, 0x1e, 0x28, 0x2c, 0x9b, 0xf3, 0x09, 0x72, 0xb2, 0x8c, 0x46, 0xed, 0x8a, 0x54, - 0x42, 0x6d, 0xae, 0xc1, 0xae, 0x38, 0x1a, 0x38, 0x5d, 0xf2, 0x5f, 0xff, 0xfa, 0x66, - 0x79, 0x53, 0xd3, 0x33, + 0x22, 0x0c, 0xf6, 0xb7, 0xbd, 0x7d, 0xf1, 0x1a, 0xeb, 0x46, 0xb8, 0xf6, 0x52, 0x19, + 0x71, 0xe4, 0xf5, 0xce, 0xc6, 0x0e, 0x2c, 0x3a, 0xd1, 0x9e, 0x3b, 0x3f, 0x40, 0x7e, + 0x69, 0x4b, 0xe8, 0x01, ], note_nf: [ - 0x97, 0x0a, 0xff, 0xd7, 0xf1, 0x0d, 0x5b, 0x71, 0x23, 0x27, 0xe8, 0x39, 0x7e, 0x51, - 0x45, 0x3f, 0x85, 0xf4, 0xc2, 0x0f, 0x80, 0x1e, 0x97, 0xe5, 0xe6, 0x40, 0x0e, 0xb0, - 0xed, 0xc4, 0xbb, 0x03, + 0x0d, 0x35, 0x9b, 0x02, 0xf6, 0x2d, 0x72, 0x18, 0xc8, 0x93, 0xd0, 0x4e, 0xc0, 0xed, + 0xd4, 0x89, 0xb2, 0x33, 0xa3, 0xc6, 0x60, 0x15, 0xaf, 0x93, 0x93, 0x0b, 0x23, 0x30, + 0x35, 0x82, 0x07, 0x3f, ], }, ] diff --git a/src/test_vectors/note_encryption_v3.rs b/src/test_vectors/note_encryption_v3.rs index 0ea5da482..79b514869 100644 --- a/src/test_vectors/note_encryption_v3.rs +++ b/src/test_vectors/note_encryption_v3.rs @@ -2287,9 +2287,9 @@ pub(crate) fn test_vectors() -> Vec { 0xbc, 0xf8, 0x63, 0x37, ], cmx: [ - 0x85, 0xec, 0x16, 0xe8, 0x78, 0x77, 0x33, 0x37, 0x07, 0x9a, 0xec, 0xf3, 0x2c, 0x45, - 0x5e, 0xbf, 0x16, 0x96, 0x8d, 0xa1, 0xd4, 0x34, 0x51, 0xb7, 0xa3, 0x06, 0x87, 0x6c, - 0xa3, 0x08, 0xea, 0x3c, + 0x20, 0x43, 0xa5, 0x58, 0x39, 0x9e, 0x2e, 0xed, 0x91, 0xd9, 0x5d, 0x32, 0xe6, 0xd6, + 0x7c, 0x93, 0xdb, 0x08, 0xe2, 0x15, 0x15, 0x02, 0x85, 0x8d, 0x8b, 0x77, 0x54, 0x87, + 0x5f, 0x10, 0x89, 0x32, ], esk: [ 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, 0x39, 0x16, 0x0f, 0xe5, @@ -2403,9 +2403,9 @@ pub(crate) fn test_vectors() -> Vec { 0xc3, 0xcf, 0xc9, 0xca, 0xd8, 0xdb, 0x82, 0x3f, 0xbd, 0x74, ], ock: [ - 0xc6, 0x7c, 0x23, 0x33, 0xc3, 0xcf, 0x4a, 0xc4, 0x6e, 0xde, 0x34, 0xe3, 0xe3, 0xe0, - 0xdb, 0xff, 0x1e, 0x96, 0xb7, 0xa7, 0x8f, 0x16, 0xaa, 0xef, 0x1c, 0x74, 0xa3, 0xef, - 0x07, 0xc5, 0x97, 0x16, + 0x9b, 0x8e, 0x79, 0x56, 0x76, 0x38, 0xa2, 0xee, 0x38, 0x72, 0x5a, 0x94, 0x28, 0x99, + 0xa5, 0xa3, 0xbd, 0xd6, 0x88, 0xdb, 0x76, 0x38, 0x99, 0x7c, 0x77, 0x27, 0x6d, 0x27, + 0x0c, 0x87, 0xd2, 0xa3, ], op: [ 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, @@ -2415,12 +2415,12 @@ pub(crate) fn test_vectors() -> Vec { 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, ], c_out: [ - 0xe4, 0xba, 0x0e, 0xa2, 0x92, 0x3b, 0x40, 0x19, 0xac, 0x8a, 0xbc, 0xd1, 0x9b, 0xe6, - 0x1c, 0x90, 0xf1, 0x8e, 0xef, 0xae, 0x87, 0xc4, 0xed, 0x8c, 0x76, 0x70, 0x85, 0xba, - 0xa8, 0x3b, 0x4d, 0x61, 0x0c, 0xf3, 0x63, 0x70, 0xda, 0x07, 0x90, 0x1e, 0xad, 0x6d, - 0x4f, 0x4b, 0x71, 0xdc, 0xae, 0x31, 0x1f, 0xa0, 0x36, 0x40, 0x6d, 0x64, 0x7b, 0x7e, - 0xe1, 0x41, 0x1e, 0xf5, 0xae, 0xe0, 0x34, 0x68, 0xb1, 0x09, 0x13, 0xc9, 0x90, 0xcb, - 0x61, 0x61, 0x22, 0xeb, 0xbe, 0x49, 0xda, 0x67, 0x81, 0xc2, + 0xe6, 0xe7, 0xa3, 0x48, 0xf3, 0x3a, 0xdd, 0x64, 0x22, 0x87, 0xc5, 0xf8, 0xf0, 0x9a, + 0x5a, 0xae, 0xd7, 0x9d, 0xf6, 0x70, 0xcc, 0x29, 0x74, 0x78, 0xc2, 0x27, 0x11, 0xe3, + 0x4e, 0xfa, 0x00, 0x88, 0x1d, 0x34, 0xb8, 0x7c, 0x0f, 0x69, 0xcb, 0x55, 0xd9, 0x1d, + 0x91, 0x1d, 0x2d, 0x84, 0x1e, 0x5e, 0xf6, 0x40, 0x38, 0x24, 0xdc, 0x9d, 0x7c, 0x55, + 0x1c, 0xdb, 0xae, 0xb4, 0xa6, 0xfb, 0x46, 0x8e, 0xc0, 0x39, 0xbc, 0x84, 0x17, 0x79, + 0xa0, 0xd7, 0xbf, 0xc3, 0x1b, 0xe2, 0x0b, 0x34, 0xee, 0x25, ], }, TestVector { @@ -2505,9 +2505,9 @@ pub(crate) fn test_vectors() -> Vec { 0xb6, 0xf6, 0x4c, 0x26, ], cmx: [ - 0x40, 0x8f, 0x59, 0x4f, 0xdd, 0xc5, 0x0c, 0x67, 0xf5, 0x47, 0xe1, 0xeb, 0x3e, 0xa2, - 0x99, 0xa3, 0x1f, 0x69, 0xf5, 0x7f, 0xc9, 0x92, 0x03, 0x01, 0x42, 0x90, 0x35, 0xa6, - 0xc2, 0x49, 0x79, 0x1a, + 0xf0, 0x32, 0x44, 0xf8, 0x87, 0xe7, 0x5e, 0x45, 0x2f, 0xf0, 0x06, 0x89, 0x64, 0x44, + 0x2c, 0x9b, 0xc1, 0x03, 0x48, 0xec, 0xa6, 0xc2, 0xbc, 0x46, 0xcc, 0x85, 0xda, 0x5d, + 0x34, 0x0b, 0x43, 0x35, ], esk: [ 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, 0xef, 0x08, 0xbd, 0xf6, @@ -2621,9 +2621,9 @@ pub(crate) fn test_vectors() -> Vec { 0x83, 0x95, 0xa3, 0x99, 0x63, 0x65, 0xa2, 0x0c, 0x22, 0x9e, ], ock: [ - 0x2f, 0x88, 0x37, 0x27, 0xb5, 0x4d, 0x06, 0x25, 0xcf, 0xdc, 0x19, 0x5a, 0xce, 0x10, - 0xca, 0xc0, 0x26, 0x8a, 0xba, 0x3d, 0xe2, 0x8a, 0xd6, 0x08, 0x88, 0x06, 0x50, 0x6d, - 0x69, 0xc4, 0xdd, 0x8e, + 0xb9, 0x64, 0x28, 0x18, 0x81, 0x8d, 0x69, 0x17, 0x6d, 0x6c, 0xe6, 0x08, 0x88, 0x7d, + 0x75, 0x70, 0x58, 0xc7, 0x35, 0x42, 0x74, 0xac, 0xa2, 0xb8, 0x7b, 0x50, 0xf7, 0xa6, + 0x38, 0x52, 0x51, 0x1b, ], op: [ 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, @@ -2633,12 +2633,12 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, ], c_out: [ - 0x99, 0x96, 0x90, 0xd4, 0xcd, 0xd9, 0xe7, 0x6b, 0x07, 0x2c, 0x3c, 0x4c, 0x41, 0xbf, - 0xc7, 0x9a, 0xaa, 0xc6, 0x7f, 0xdc, 0x0f, 0x41, 0xe8, 0x0e, 0x95, 0x48, 0x80, 0x0e, - 0xef, 0xbc, 0x95, 0x74, 0xf1, 0x5d, 0x64, 0xa6, 0x9e, 0x44, 0x47, 0xc4, 0x5b, 0x07, - 0x0c, 0x6c, 0x9f, 0x50, 0x0a, 0xdd, 0xef, 0x6f, 0x57, 0x14, 0xa5, 0x76, 0x22, 0x1f, - 0x3f, 0xbc, 0x61, 0x22, 0x8d, 0x95, 0xc3, 0xac, 0xe4, 0x21, 0x4b, 0xb6, 0xcf, 0x5b, - 0xd9, 0x69, 0x84, 0xd7, 0x78, 0x96, 0x0d, 0xe9, 0x0c, 0x02, + 0xa2, 0xd6, 0x5e, 0x96, 0x7e, 0x98, 0x89, 0x0e, 0x9c, 0x42, 0xf9, 0xb3, 0x4b, 0xf8, + 0x45, 0xfb, 0x8e, 0xaa, 0xf9, 0x20, 0x45, 0x0b, 0x29, 0xec, 0x06, 0x16, 0xb3, 0xf0, + 0x82, 0xea, 0x90, 0x8c, 0x66, 0x87, 0xf4, 0xf9, 0x74, 0x1a, 0xe8, 0xab, 0x81, 0x30, + 0x15, 0x35, 0xfd, 0x10, 0x30, 0x35, 0x7a, 0x78, 0xb2, 0x07, 0xf1, 0xc4, 0x42, 0x77, + 0xf5, 0x03, 0xdb, 0x42, 0xa2, 0xc4, 0xdd, 0x20, 0x25, 0x33, 0x2f, 0x49, 0x5e, 0x88, + 0x31, 0x1b, 0x4c, 0x2f, 0x66, 0xb6, 0x07, 0x29, 0x04, 0x89, ], }, TestVector { @@ -2723,9 +2723,9 @@ pub(crate) fn test_vectors() -> Vec { 0x1d, 0x40, 0x9b, 0x33, ], cmx: [ - 0x9e, 0x3d, 0x61, 0x35, 0x6b, 0x0d, 0x88, 0x95, 0x9e, 0x3f, 0x0f, 0xcc, 0x4a, 0x93, - 0x2e, 0x93, 0x2e, 0xac, 0xbc, 0x80, 0x1d, 0x48, 0xc0, 0x19, 0x5b, 0x9c, 0x8b, 0xd1, - 0x05, 0x5a, 0x8e, 0x2e, + 0xf5, 0x3a, 0x98, 0x99, 0xcd, 0x37, 0xf6, 0x2c, 0x94, 0x85, 0x84, 0xb9, 0x67, 0x7c, + 0x78, 0x4c, 0x73, 0x48, 0x43, 0x40, 0x1a, 0x3a, 0x61, 0x0a, 0xcb, 0x28, 0x2f, 0x04, + 0x30, 0xfd, 0x18, 0x3c, ], esk: [ 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, 0xa9, 0x19, 0xa2, 0x06, @@ -2839,9 +2839,9 @@ pub(crate) fn test_vectors() -> Vec { 0x1c, 0x60, 0x78, 0xb0, 0x8d, 0x72, 0x2d, 0xc4, 0x4a, 0xb7, ], ock: [ - 0x9c, 0xba, 0xd2, 0xf3, 0x8b, 0xf8, 0x8f, 0x39, 0x47, 0xce, 0xf6, 0x4d, 0xe7, 0xa6, - 0xf4, 0x3e, 0x4c, 0xbb, 0x41, 0xe6, 0xe0, 0x37, 0xf1, 0x42, 0x01, 0xae, 0xe8, 0xab, - 0xfd, 0xf8, 0xa2, 0x35, + 0x67, 0x0e, 0xa5, 0x94, 0x8e, 0x85, 0x29, 0xa9, 0x52, 0xb2, 0x0a, 0xcc, 0x17, 0x70, + 0xe2, 0xa9, 0xc0, 0x67, 0xb0, 0x7b, 0x89, 0xfd, 0xaa, 0xf7, 0x84, 0xdf, 0x83, 0xfd, + 0x53, 0x7b, 0xdd, 0x86, ], op: [ 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, @@ -2851,12 +2851,12 @@ pub(crate) fn test_vectors() -> Vec { 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, ], c_out: [ - 0xf6, 0x25, 0xcd, 0x3d, 0x19, 0x97, 0xb0, 0xd3, 0xf2, 0x29, 0x5a, 0xac, 0xc0, 0x3a, - 0xe0, 0xc9, 0x47, 0x28, 0xb3, 0x3c, 0xc4, 0xf1, 0x6f, 0xd4, 0x28, 0xd6, 0x5f, 0x3c, - 0x78, 0x5e, 0x8c, 0x0b, 0xb4, 0x66, 0xc1, 0x33, 0xd4, 0x83, 0xdf, 0xc5, 0xb1, 0xb3, - 0x15, 0x1d, 0xa2, 0xd5, 0xf2, 0x4a, 0x2b, 0x32, 0x0d, 0x8e, 0x9c, 0xd3, 0x41, 0x5c, - 0x25, 0xb6, 0xf9, 0x76, 0x1f, 0x42, 0x70, 0x04, 0xce, 0xe5, 0x4f, 0x75, 0xf1, 0x25, - 0xbc, 0x50, 0x5e, 0xf6, 0x26, 0xef, 0xc9, 0xdd, 0x63, 0x66, + 0x20, 0xe0, 0x0c, 0xab, 0xc6, 0xc7, 0x06, 0xfa, 0x38, 0x19, 0x16, 0x78, 0x26, 0x44, + 0x90, 0x28, 0x9e, 0x0e, 0xd3, 0x2b, 0x9c, 0x77, 0x6d, 0xa2, 0xab, 0xe0, 0x21, 0x4f, + 0x89, 0x9b, 0xf9, 0x7b, 0x08, 0x3b, 0xe5, 0x8e, 0xdd, 0xbb, 0x57, 0x97, 0x28, 0x22, + 0xbb, 0x10, 0x8e, 0x2c, 0xad, 0xfc, 0x76, 0xab, 0xe6, 0x13, 0x13, 0x9e, 0x94, 0x1c, + 0x2c, 0xa1, 0x59, 0x21, 0x98, 0x91, 0xb1, 0x52, 0x83, 0xd8, 0x5a, 0x0d, 0xc9, 0x4d, + 0x59, 0xf9, 0x7b, 0x6c, 0x3c, 0x53, 0x6f, 0xcf, 0x93, 0x98, ], }, TestVector { @@ -2941,9 +2941,9 @@ pub(crate) fn test_vectors() -> Vec { 0x14, 0x7a, 0x27, 0x10, ], cmx: [ - 0xf2, 0x04, 0x22, 0x51, 0xa0, 0x59, 0xa2, 0xf5, 0x8a, 0xb8, 0xe9, 0x0b, 0x52, 0x64, - 0xd0, 0xa4, 0x3f, 0x96, 0xd7, 0x7e, 0xdd, 0x54, 0xf8, 0x0f, 0xf4, 0x9d, 0x43, 0x86, - 0x81, 0x4d, 0x73, 0x2e, + 0x82, 0x9c, 0x4a, 0x9c, 0x2a, 0x01, 0x66, 0xc9, 0xba, 0x2e, 0x16, 0x9e, 0xdd, 0xda, + 0xe6, 0xdb, 0x59, 0xf0, 0x12, 0xa7, 0x26, 0x29, 0xce, 0x34, 0xf6, 0xc2, 0x88, 0x7e, + 0xfb, 0xe1, 0xd9, 0x3f, ], esk: [ 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, 0x1d, 0xa4, 0xb1, 0x44, @@ -3057,9 +3057,9 @@ pub(crate) fn test_vectors() -> Vec { 0xbc, 0x7a, 0xf6, 0x72, 0xb2, 0x0d, 0x7a, 0x16, 0xec, 0x48, ], ock: [ - 0x97, 0x9b, 0x31, 0x5d, 0x3e, 0x1f, 0x5c, 0xa1, 0x8a, 0x92, 0x86, 0xd9, 0x2c, 0xc8, - 0x8e, 0x63, 0x62, 0x4b, 0x39, 0x9b, 0x29, 0x19, 0xbf, 0x4e, 0x67, 0xda, 0x7c, 0xd3, - 0x94, 0xf4, 0x5c, 0x49, + 0xa8, 0xa5, 0x77, 0x53, 0x40, 0x60, 0x3d, 0xad, 0x7d, 0x52, 0x3c, 0x94, 0x64, 0x4b, + 0x4d, 0x3f, 0x61, 0x92, 0xfb, 0x19, 0x8e, 0x8d, 0xe5, 0x70, 0x61, 0x52, 0xf4, 0x55, + 0x68, 0x24, 0x58, 0x73, ], op: [ 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, @@ -3069,12 +3069,12 @@ pub(crate) fn test_vectors() -> Vec { 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, ], c_out: [ - 0x83, 0xf7, 0xa1, 0xda, 0x72, 0x4d, 0xd1, 0x54, 0xe7, 0xd9, 0x47, 0xc0, 0xfc, 0x83, - 0x42, 0x87, 0xf3, 0x3c, 0xd4, 0xb3, 0x4a, 0xfa, 0xc0, 0xda, 0x55, 0xe4, 0x37, 0xaf, - 0xae, 0x67, 0xa9, 0x9c, 0xbd, 0x89, 0x75, 0xc9, 0x54, 0xcf, 0x41, 0xaa, 0x1e, 0x9a, - 0x8f, 0x99, 0x98, 0x3d, 0x58, 0x6f, 0x5e, 0x35, 0x37, 0xda, 0xb7, 0x2a, 0xe1, 0x82, - 0x7a, 0xa5, 0xdf, 0xc9, 0xdd, 0xad, 0x06, 0x26, 0x78, 0x84, 0x6f, 0xf8, 0x09, 0x3d, - 0xfd, 0x15, 0xf6, 0x3d, 0x47, 0xe5, 0xa3, 0xbb, 0x74, 0x39, + 0xe3, 0x49, 0x59, 0x73, 0x78, 0x12, 0xaf, 0x29, 0xef, 0x95, 0x78, 0x3d, 0xcf, 0xb2, + 0xfd, 0x19, 0xab, 0x10, 0xd2, 0x17, 0xdd, 0x7d, 0x7f, 0xa6, 0x9e, 0x45, 0x21, 0xfe, + 0x8e, 0xce, 0x1a, 0x86, 0xee, 0x5b, 0xaf, 0x9d, 0xe8, 0x51, 0x2f, 0x84, 0xa2, 0xb9, + 0x12, 0xbf, 0xa3, 0x2e, 0x50, 0xc9, 0x1e, 0xfc, 0xfa, 0x14, 0x50, 0xb7, 0xdb, 0x82, + 0xd5, 0xa2, 0xa9, 0x9d, 0x40, 0xf7, 0xbd, 0x6d, 0x66, 0xd5, 0xaa, 0x9a, 0x13, 0xec, + 0xc1, 0x61, 0x05, 0x74, 0x0a, 0x68, 0xdb, 0xd9, 0x5e, 0x0a, ], }, TestVector { @@ -3159,9 +3159,9 @@ pub(crate) fn test_vectors() -> Vec { 0xb9, 0xd0, 0xb7, 0x32, ], cmx: [ - 0xe1, 0xc7, 0x67, 0xf3, 0x30, 0x15, 0xb5, 0xe2, 0x4a, 0x9a, 0xa5, 0x8b, 0x64, 0x7b, - 0x6b, 0x61, 0x32, 0x3c, 0xd3, 0x47, 0xe7, 0x21, 0x4c, 0x29, 0x1d, 0x09, 0x95, 0xc0, - 0xf5, 0xa6, 0x93, 0x2f, + 0xde, 0x71, 0x70, 0xc9, 0xd8, 0x0f, 0x64, 0x00, 0x29, 0x73, 0xc2, 0xc7, 0x58, 0x02, + 0x7b, 0xc4, 0x38, 0xe5, 0x83, 0x68, 0x56, 0xa7, 0x40, 0x03, 0x20, 0xb1, 0xbd, 0xe2, + 0xed, 0xa1, 0x7d, 0x31, ], esk: [ 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, 0x58, 0x93, 0x20, 0x26, @@ -3275,9 +3275,9 @@ pub(crate) fn test_vectors() -> Vec { 0xb7, 0xd7, 0xef, 0xa4, 0xf4, 0xd0, 0x18, 0x2d, 0xa4, 0xc4, ], ock: [ - 0x55, 0x0e, 0xbf, 0x98, 0x83, 0x6c, 0xce, 0x43, 0x52, 0x25, 0xa1, 0x4b, 0xa6, 0x52, - 0xa7, 0xd5, 0x58, 0xcf, 0x5f, 0x3f, 0x7a, 0xfb, 0x00, 0xb0, 0x24, 0x70, 0xe8, 0xe4, - 0xd2, 0x6d, 0xb7, 0x9c, + 0x9d, 0x33, 0x8d, 0x19, 0x91, 0xba, 0x13, 0xfe, 0xe7, 0x37, 0x70, 0x9b, 0x7a, 0xbb, + 0x50, 0x77, 0x8d, 0xe1, 0xd8, 0x2f, 0xdb, 0x6b, 0x34, 0x7f, 0x58, 0xdd, 0xf5, 0x78, + 0xdd, 0x54, 0x42, 0xd7, ], op: [ 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, @@ -3287,12 +3287,12 @@ pub(crate) fn test_vectors() -> Vec { 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, ], c_out: [ - 0x9a, 0x01, 0xb7, 0x5e, 0x27, 0xea, 0x97, 0x51, 0x45, 0x5d, 0x54, 0xf2, 0xa5, 0x2b, - 0x88, 0x4b, 0x45, 0x6a, 0x6f, 0xc3, 0xda, 0xdb, 0xec, 0x79, 0xbf, 0x4d, 0x10, 0xbe, - 0x06, 0x7b, 0xef, 0x3e, 0xa2, 0xa5, 0xc0, 0x59, 0x81, 0xd4, 0x06, 0x05, 0x6a, 0x2f, - 0xf6, 0x4c, 0xb4, 0xc6, 0xfd, 0x46, 0x7d, 0xa8, 0x0b, 0xa1, 0x17, 0x48, 0xe9, 0xe2, - 0xae, 0x07, 0xb7, 0x62, 0xdf, 0x9d, 0x4a, 0x23, 0x58, 0x77, 0xf5, 0x8f, 0x43, 0x24, - 0xd8, 0x00, 0x3c, 0x32, 0x4f, 0xd9, 0xc6, 0x39, 0xbc, 0xa6, + 0x1f, 0x61, 0xfa, 0x64, 0x74, 0xce, 0xd5, 0x5b, 0xcf, 0xc9, 0x40, 0x5f, 0x9b, 0x07, + 0xc6, 0x02, 0xb9, 0x71, 0x4b, 0xf4, 0x02, 0x1d, 0x59, 0x4d, 0x72, 0xcf, 0xc6, 0x46, + 0x13, 0xd9, 0x01, 0x0c, 0x92, 0x4a, 0x7a, 0xc6, 0x74, 0x5d, 0x04, 0x8b, 0x15, 0xcc, + 0x94, 0xc4, 0x86, 0x4d, 0x1e, 0x0b, 0x4b, 0x43, 0x55, 0xac, 0x8e, 0xbb, 0x40, 0xee, + 0x36, 0x14, 0x00, 0x11, 0xf4, 0xc0, 0x1b, 0x3f, 0x53, 0xc0, 0xf6, 0x3a, 0xb5, 0x64, + 0x74, 0x81, 0x27, 0x73, 0x0e, 0x6c, 0x58, 0x4a, 0xf9, 0xb3, ], }, TestVector { @@ -3377,9 +3377,9 @@ pub(crate) fn test_vectors() -> Vec { 0x41, 0x84, 0x28, 0x2a, ], cmx: [ - 0xd7, 0x60, 0xac, 0xdb, 0xca, 0xda, 0xd1, 0x88, 0x08, 0x4f, 0xe4, 0x1a, 0x5c, 0x03, - 0xc2, 0xc8, 0xce, 0x34, 0xe1, 0x5f, 0x9d, 0xf4, 0x7b, 0x86, 0x9c, 0x44, 0xc7, 0x21, - 0x13, 0xa4, 0x0c, 0x3d, + 0x1e, 0xaa, 0x25, 0x97, 0xb0, 0x8f, 0x7c, 0x9c, 0x57, 0x9c, 0xe1, 0x43, 0xb7, 0xfb, + 0x2b, 0x10, 0x33, 0x82, 0xff, 0x63, 0x77, 0xb1, 0xc8, 0xbf, 0xbc, 0xcd, 0x8d, 0xa2, + 0x97, 0xe0, 0xa9, 0x0c, ], esk: [ 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, 0xdf, 0x7c, 0xe2, 0xd2, @@ -3493,9 +3493,9 @@ pub(crate) fn test_vectors() -> Vec { 0x2d, 0xb3, 0x35, 0x6e, 0x11, 0x4d, 0xbc, 0xa3, 0xc5, 0xd8, ], ock: [ - 0x53, 0x29, 0x6e, 0xed, 0x43, 0xb4, 0xeb, 0x30, 0xa4, 0x3d, 0x88, 0x90, 0x2f, 0x74, - 0x04, 0x26, 0x62, 0x1d, 0x85, 0x21, 0x3a, 0x36, 0xc5, 0x20, 0xa1, 0x84, 0xa4, 0x3a, - 0xfb, 0xd4, 0x89, 0x6d, + 0x3c, 0x85, 0x16, 0x2e, 0x48, 0x67, 0xfc, 0x45, 0x89, 0xf6, 0xc6, 0x07, 0x69, 0x3b, + 0x8f, 0x4a, 0x7e, 0x85, 0xe0, 0x19, 0xf2, 0x33, 0x2f, 0xeb, 0xff, 0x08, 0xcb, 0xad, + 0x99, 0x4b, 0x3e, 0x81, ], op: [ 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, @@ -3505,12 +3505,12 @@ pub(crate) fn test_vectors() -> Vec { 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, ], c_out: [ - 0x38, 0xee, 0x14, 0xef, 0xb0, 0x63, 0x94, 0x64, 0x44, 0x6f, 0x5f, 0xb8, 0x79, 0x5d, - 0x23, 0xf8, 0x8c, 0xf5, 0x65, 0x37, 0xe6, 0x4e, 0x1a, 0x46, 0x63, 0x17, 0xb3, 0x6f, - 0x22, 0x2e, 0x00, 0x5b, 0x92, 0x4c, 0xc9, 0x10, 0xd6, 0x29, 0x06, 0x6e, 0x05, 0x07, - 0xcb, 0x91, 0x2b, 0x0b, 0xc1, 0xd3, 0x16, 0xc2, 0x00, 0xb1, 0xa9, 0x56, 0x49, 0xc0, - 0xc5, 0x30, 0xb4, 0xf3, 0xd0, 0x43, 0x06, 0x8e, 0xf6, 0xf4, 0x2d, 0xcb, 0xef, 0xd0, - 0x2a, 0x34, 0x80, 0xe3, 0x2a, 0xa4, 0x5e, 0x33, 0xce, 0x25, + 0x92, 0x05, 0x27, 0xe0, 0x4a, 0xa5, 0x39, 0xdd, 0x95, 0x62, 0x23, 0x36, 0xea, 0x92, + 0xa8, 0xd5, 0x7a, 0x34, 0xd8, 0x7d, 0xac, 0x1c, 0x8d, 0xfd, 0x1b, 0x95, 0x4d, 0xfb, + 0x17, 0x70, 0x72, 0xfc, 0xbd, 0x1b, 0xa0, 0x7c, 0x28, 0x45, 0x1b, 0xa0, 0x99, 0xd6, + 0x3a, 0xb0, 0xb0, 0x51, 0x6d, 0x41, 0xe4, 0xb4, 0x3f, 0x04, 0xc7, 0xe3, 0xb5, 0x3a, + 0xec, 0xd0, 0xa0, 0x48, 0x34, 0x24, 0x48, 0xa8, 0x17, 0x60, 0xa4, 0x1e, 0x6e, 0x85, + 0x48, 0x02, 0x25, 0x43, 0xd6, 0x39, 0xb8, 0x9e, 0xa7, 0x46, ], }, TestVector { @@ -3595,9 +3595,9 @@ pub(crate) fn test_vectors() -> Vec { 0x4e, 0xb3, 0xa2, 0x08, ], cmx: [ - 0x8f, 0x56, 0xd1, 0x3f, 0xd9, 0xc8, 0x3e, 0xb7, 0x1b, 0x95, 0x87, 0x7a, 0x4f, 0x29, - 0x39, 0x64, 0xbf, 0x3f, 0x73, 0x1d, 0x8d, 0xf2, 0x04, 0x32, 0x2c, 0xed, 0xcb, 0x38, - 0x68, 0x21, 0x90, 0x3c, + 0xb5, 0x62, 0x5f, 0xa5, 0xfb, 0xeb, 0xa7, 0xc9, 0xea, 0xff, 0xff, 0x7d, 0xf4, 0x75, + 0xdc, 0x82, 0x33, 0x22, 0xee, 0x88, 0x01, 0x70, 0x56, 0x45, 0xe5, 0x62, 0x7e, 0x4a, + 0xca, 0x36, 0x6c, 0x02, ], esk: [ 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, 0x44, 0xb0, 0xb0, 0x4f, @@ -3711,9 +3711,9 @@ pub(crate) fn test_vectors() -> Vec { 0xb9, 0x5e, 0x7f, 0x63, 0xcb, 0x5c, 0xfa, 0xf5, 0xca, 0xc1, ], ock: [ - 0x2a, 0x2e, 0x0d, 0x99, 0x69, 0xf0, 0x2e, 0xbd, 0xb6, 0xd9, 0xc8, 0xe7, 0xe6, 0xfd, - 0xde, 0x20, 0x85, 0x12, 0x4b, 0x19, 0xad, 0x70, 0x90, 0xcc, 0x26, 0x15, 0x1d, 0x4d, - 0xa4, 0x2a, 0x00, 0x3e, + 0xc3, 0xd1, 0x04, 0x73, 0x14, 0x50, 0x57, 0x52, 0x3a, 0x55, 0xb7, 0x25, 0xcb, 0x2b, + 0x25, 0xd4, 0xe1, 0xe0, 0x5b, 0xc2, 0xfe, 0x4b, 0xbe, 0xbe, 0xb4, 0xd4, 0x2a, 0x61, + 0x8a, 0xbc, 0xd8, 0xbc, ], op: [ 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, @@ -3723,12 +3723,12 @@ pub(crate) fn test_vectors() -> Vec { 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, ], c_out: [ - 0x74, 0x6a, 0xae, 0x9d, 0xa6, 0x1c, 0x02, 0xae, 0xaa, 0x8b, 0xed, 0xbe, 0x2b, 0x6c, - 0x84, 0x1b, 0xc4, 0x36, 0x17, 0x3c, 0x7c, 0x91, 0x13, 0x66, 0x3a, 0x39, 0xc1, 0x74, - 0x69, 0x29, 0x0b, 0xd2, 0x19, 0xea, 0xdc, 0x4a, 0x97, 0x5a, 0xd0, 0x52, 0xd0, 0x5d, - 0xc0, 0xa3, 0x08, 0xf3, 0x63, 0xf9, 0x22, 0x68, 0x2d, 0x75, 0x21, 0x9d, 0xaa, 0x33, - 0x6f, 0x69, 0xb5, 0x9e, 0x86, 0x7c, 0x85, 0xd9, 0x37, 0x34, 0x4c, 0x19, 0xd3, 0x88, - 0x01, 0x63, 0x19, 0xb3, 0xf6, 0x0f, 0x76, 0xd0, 0x28, 0x93, + 0x74, 0xd2, 0x40, 0xe8, 0xbe, 0x49, 0xb2, 0xa1, 0xad, 0x31, 0x8c, 0xfe, 0xf8, 0x43, + 0x5b, 0x79, 0x7f, 0x71, 0xfa, 0x8b, 0xda, 0x90, 0xed, 0x98, 0x4b, 0x15, 0x69, 0x7c, + 0x3e, 0x34, 0x81, 0x8f, 0x48, 0x96, 0x53, 0x79, 0x0f, 0xe7, 0x04, 0xc8, 0x16, 0x62, + 0xd9, 0xfb, 0x70, 0xde, 0x53, 0x63, 0xca, 0x17, 0xf6, 0x26, 0x2b, 0xae, 0xe2, 0x4b, + 0x2f, 0x2a, 0x80, 0x46, 0x8b, 0x03, 0x94, 0x1f, 0x55, 0x6a, 0x93, 0x0c, 0x37, 0x50, + 0xe6, 0x9a, 0xce, 0xcc, 0x79, 0xc0, 0xe4, 0x72, 0x0f, 0xe5, ], }, TestVector { @@ -3813,9 +3813,9 @@ pub(crate) fn test_vectors() -> Vec { 0x4c, 0x3f, 0x8d, 0x26, ], cmx: [ - 0x69, 0x4b, 0x6f, 0x3a, 0xb8, 0x37, 0xa9, 0x26, 0xd6, 0x77, 0x3e, 0xc4, 0xa6, 0x76, - 0x5d, 0xef, 0x82, 0x89, 0x33, 0x74, 0x2d, 0x93, 0x29, 0xfc, 0x88, 0x67, 0x1c, 0xcd, - 0x81, 0x21, 0xa4, 0x23, + 0x4c, 0x6c, 0x39, 0xec, 0xcf, 0xc0, 0xce, 0xe9, 0x0b, 0x46, 0xdb, 0x88, 0x98, 0xe0, + 0xd1, 0x8b, 0x2c, 0x7a, 0x61, 0x63, 0x0a, 0xb2, 0x71, 0x5c, 0x77, 0x07, 0x17, 0x37, + 0xca, 0x2a, 0x18, 0x13, ], esk: [ 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, 0xa5, 0xd8, 0x9a, 0xa8, @@ -3929,9 +3929,9 @@ pub(crate) fn test_vectors() -> Vec { 0xa1, 0x85, 0x5a, 0xf9, 0x90, 0xcd, 0xb6, 0x77, 0xaf, 0x0d, ], ock: [ - 0x67, 0x1c, 0xed, 0xd6, 0xf5, 0x73, 0xa4, 0x6f, 0xf1, 0xea, 0xd0, 0x48, 0x21, 0x98, - 0x56, 0x36, 0xe2, 0x3f, 0xb1, 0x5c, 0x6f, 0x48, 0x05, 0xfd, 0x57, 0x63, 0x12, 0xc2, - 0x07, 0x02, 0xa4, 0x24, + 0x2b, 0x28, 0x4c, 0xea, 0xca, 0x3e, 0xe7, 0x05, 0x2b, 0xb4, 0xad, 0x16, 0x7e, 0xc4, + 0x4f, 0xbf, 0x14, 0x4f, 0x7a, 0xef, 0x67, 0x8a, 0x37, 0xe6, 0x1e, 0x0b, 0x1f, 0x6b, + 0xdc, 0x24, 0xa0, 0x0d, ], op: [ 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, @@ -3941,12 +3941,12 @@ pub(crate) fn test_vectors() -> Vec { 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, ], c_out: [ - 0x59, 0x97, 0x53, 0xe4, 0x0a, 0xda, 0xea, 0xff, 0x6f, 0xaa, 0xf5, 0xa6, 0xf3, 0x0e, - 0x39, 0x13, 0x8f, 0xde, 0x82, 0x0f, 0x7b, 0xec, 0x7c, 0x8d, 0x0f, 0xd8, 0x4b, 0x48, - 0x36, 0x94, 0xe5, 0x0c, 0x4b, 0xdd, 0xee, 0x2f, 0xb1, 0xa4, 0xf9, 0x95, 0xb1, 0xa3, - 0xba, 0x40, 0xf4, 0x66, 0xb4, 0x2e, 0x8b, 0x5d, 0x01, 0x38, 0xfd, 0x30, 0xbf, 0xf6, - 0xae, 0x8c, 0xb1, 0x55, 0xf4, 0x0c, 0xdc, 0x37, 0x39, 0xfa, 0xbf, 0x2f, 0x00, 0xda, - 0x3a, 0xc6, 0xa7, 0x36, 0x3b, 0xc2, 0xf4, 0xaa, 0x10, 0xfe, + 0x4b, 0x9a, 0x5a, 0x4a, 0x4d, 0xda, 0x98, 0xfb, 0x92, 0x9a, 0xe9, 0x7b, 0x11, 0xb2, + 0x09, 0xae, 0x23, 0x42, 0x5e, 0x52, 0x26, 0x9a, 0xad, 0xca, 0x13, 0x23, 0x9c, 0xb9, + 0xb3, 0x8f, 0xbf, 0xfb, 0x85, 0x29, 0x58, 0x41, 0xd0, 0xf3, 0x2b, 0xea, 0xd9, 0x2c, + 0x4d, 0x3c, 0x88, 0xe6, 0xe7, 0x2a, 0x1b, 0xe1, 0xd6, 0x64, 0x9b, 0x1c, 0xee, 0x43, + 0x0e, 0xad, 0x38, 0x44, 0x56, 0x07, 0xc4, 0xa9, 0xb6, 0x02, 0x51, 0x83, 0x56, 0x1e, + 0x6c, 0xff, 0x55, 0x2a, 0xf0, 0x88, 0x98, 0xd4, 0x09, 0xa6, ], }, TestVector { @@ -4031,9 +4031,9 @@ pub(crate) fn test_vectors() -> Vec { 0x4b, 0xc8, 0x45, 0x10, ], cmx: [ - 0x76, 0xf1, 0xbd, 0x50, 0xf9, 0xb9, 0x06, 0xcb, 0x9f, 0xf2, 0xdd, 0x91, 0x8a, 0x36, - 0x7e, 0x5f, 0xb1, 0xa2, 0xef, 0x39, 0xf1, 0x4f, 0x6c, 0xe9, 0x4f, 0xf9, 0xf0, 0x91, - 0x55, 0xf8, 0xc2, 0x11, + 0x06, 0x65, 0x7e, 0xd7, 0x3d, 0x2a, 0x26, 0xfa, 0xfd, 0xe2, 0xb5, 0xb3, 0x73, 0xf4, + 0x60, 0x07, 0x89, 0xf5, 0x23, 0x2b, 0x57, 0x3b, 0x4e, 0xcf, 0xd5, 0x3c, 0x14, 0x03, + 0x9b, 0xeb, 0x15, 0x1c, ], esk: [ 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, 0xa1, 0xe6, 0xfb, 0x57, @@ -4147,9 +4147,9 @@ pub(crate) fn test_vectors() -> Vec { 0x4e, 0x59, 0x80, 0x45, 0x8c, 0x51, 0xfb, 0x1c, 0xd8, 0x46, ], ock: [ - 0x57, 0x97, 0xef, 0x48, 0x70, 0xb0, 0x86, 0x50, 0xfa, 0x99, 0xad, 0xae, 0x58, 0x85, - 0x19, 0x9e, 0x3b, 0x04, 0x4b, 0x2a, 0x0a, 0x8c, 0xe1, 0x61, 0x43, 0x42, 0xb5, 0xdc, - 0xb2, 0x8e, 0x6e, 0x09, + 0x59, 0xb8, 0x10, 0x2e, 0x91, 0x7f, 0xf5, 0xa4, 0x23, 0x60, 0x50, 0x7c, 0xce, 0x30, + 0xcc, 0x5b, 0xda, 0xb7, 0x76, 0x18, 0x61, 0x9f, 0x52, 0xda, 0xfa, 0xbd, 0xf5, 0x5a, + 0x3f, 0x64, 0xc1, 0xee, ], op: [ 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, @@ -4159,12 +4159,12 @@ pub(crate) fn test_vectors() -> Vec { 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, ], c_out: [ - 0xb8, 0xb4, 0x6c, 0x7e, 0xc4, 0xa8, 0x74, 0x2a, 0x22, 0xd3, 0xcd, 0x11, 0x74, 0x1c, - 0x23, 0x04, 0x22, 0x1c, 0xa5, 0x97, 0x29, 0x4e, 0x08, 0xa4, 0xc7, 0x1b, 0x17, 0xc7, - 0x26, 0x5d, 0x4d, 0xa7, 0x7c, 0xfe, 0x84, 0xb8, 0x7e, 0x76, 0xed, 0xaa, 0xec, 0xc2, - 0x24, 0xb8, 0x36, 0xde, 0x22, 0x4c, 0x73, 0x58, 0x13, 0x19, 0xa0, 0xba, 0x27, 0x88, - 0xdb, 0xf8, 0x3b, 0xcf, 0x47, 0xa4, 0x8e, 0xeb, 0x02, 0xb4, 0x3a, 0x18, 0x02, 0x7b, - 0x8f, 0x59, 0x11, 0x65, 0xc2, 0x86, 0xe8, 0xb6, 0x54, 0xec, + 0x7e, 0xaf, 0x92, 0x5e, 0x3e, 0x5c, 0xd2, 0x0c, 0xc9, 0x34, 0x9f, 0x17, 0x4b, 0xdc, + 0x8c, 0x46, 0x45, 0x65, 0xb8, 0x04, 0x68, 0x9d, 0x79, 0x8d, 0x63, 0x2f, 0x58, 0xaa, + 0x26, 0x7a, 0x2f, 0x4e, 0x65, 0xed, 0x07, 0x33, 0xc4, 0x18, 0x67, 0x7b, 0xda, 0x1a, + 0xf5, 0x6e, 0xa9, 0xfd, 0xec, 0xcc, 0xcc, 0xdc, 0x10, 0xa9, 0xb6, 0xda, 0xa4, 0x92, + 0x4b, 0x46, 0x2f, 0x1e, 0x9d, 0x08, 0x65, 0xba, 0xc3, 0xab, 0x71, 0x7a, 0xb8, 0x4f, + 0x54, 0x2c, 0x2f, 0x8d, 0x46, 0xe3, 0x20, 0x5f, 0xb0, 0x33, ], }, TestVector { @@ -4249,9 +4249,9 @@ pub(crate) fn test_vectors() -> Vec { 0x7f, 0x28, 0x4b, 0x2e, ], cmx: [ - 0x89, 0xe6, 0xa2, 0xb9, 0x70, 0x84, 0xe3, 0xd3, 0x34, 0x4f, 0xee, 0xb4, 0x64, 0x65, - 0x05, 0x72, 0x51, 0xb1, 0x9d, 0xa0, 0xce, 0xdf, 0x79, 0x71, 0x94, 0xc5, 0x97, 0xf9, - 0xf7, 0x7e, 0xf2, 0x1f, + 0x7a, 0xd4, 0xd8, 0xf5, 0xd4, 0xe7, 0xa9, 0x79, 0xfa, 0x73, 0x93, 0xed, 0x26, 0xf1, + 0x7d, 0x14, 0x2b, 0x65, 0xf5, 0x3b, 0xb4, 0x6d, 0xa6, 0x0a, 0x50, 0x22, 0x28, 0xc0, + 0x7b, 0x2c, 0xda, 0x27, ], esk: [ 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, 0x02, 0xf5, 0x10, 0xe9, @@ -4365,9 +4365,9 @@ pub(crate) fn test_vectors() -> Vec { 0x8f, 0x2c, 0xc4, 0x5a, 0xeb, 0x43, 0x52, 0x9e, 0x7d, 0x08, ], ock: [ - 0x95, 0x83, 0xf1, 0x0f, 0xed, 0x70, 0xa4, 0x1e, 0x45, 0x8c, 0x65, 0x5c, 0xc0, 0x14, - 0xe2, 0x35, 0x5a, 0x7f, 0x99, 0xae, 0xbc, 0xfe, 0xf7, 0x4a, 0x55, 0x9a, 0xcd, 0x24, - 0x25, 0xfa, 0x21, 0xcf, + 0x89, 0x5c, 0x90, 0x04, 0xec, 0x4c, 0x50, 0xd6, 0xd5, 0xfd, 0x6a, 0x51, 0x71, 0x2a, + 0xcc, 0xa4, 0x77, 0x1e, 0x1c, 0xe0, 0xb9, 0x94, 0x30, 0xf0, 0x45, 0x9d, 0x43, 0xff, + 0x16, 0x6a, 0x93, 0xf8, ], op: [ 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, @@ -4377,12 +4377,12 @@ pub(crate) fn test_vectors() -> Vec { 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, ], c_out: [ - 0xb8, 0x3b, 0x74, 0x5c, 0x9c, 0x0b, 0x04, 0xdd, 0xc7, 0xf1, 0x38, 0x16, 0x94, 0x38, - 0x99, 0x55, 0x3a, 0x30, 0x6a, 0x4a, 0xd0, 0xf2, 0xf5, 0x70, 0x92, 0x2a, 0x89, 0x9b, - 0xab, 0xb9, 0xda, 0xca, 0xd2, 0xbb, 0xc9, 0x5c, 0xf6, 0x5b, 0x73, 0x08, 0x55, 0x0d, - 0xce, 0xdb, 0x64, 0x9e, 0xf1, 0x5e, 0x0b, 0x1a, 0x09, 0x1f, 0xad, 0x5a, 0x93, 0x92, - 0xd0, 0x71, 0xb7, 0x5a, 0xb5, 0x1a, 0x7e, 0x35, 0x06, 0xad, 0x58, 0xd1, 0x71, 0x95, - 0xc9, 0x9f, 0x29, 0x8a, 0xc3, 0x14, 0xec, 0x05, 0xa6, 0x6a, + 0xc7, 0xf4, 0x90, 0x67, 0x45, 0x7f, 0x0c, 0xa0, 0xbf, 0x73, 0x0e, 0x55, 0x17, 0x06, + 0x7d, 0x49, 0x39, 0x9a, 0xce, 0xb7, 0xa6, 0x32, 0x85, 0x34, 0x63, 0x90, 0x76, 0xc1, + 0x44, 0xb2, 0x96, 0xc4, 0xce, 0xd1, 0x5a, 0x49, 0xd3, 0xba, 0xe5, 0x8e, 0xc5, 0xf8, + 0xc0, 0xb5, 0x48, 0x06, 0x33, 0x4e, 0x63, 0xc1, 0x14, 0x1c, 0xb8, 0xd3, 0x04, 0x49, + 0x2a, 0xf5, 0xff, 0x0b, 0x5c, 0x14, 0x75, 0x8d, 0x45, 0x60, 0x30, 0x82, 0x0a, 0xbd, + 0xd6, 0x8f, 0x2e, 0x67, 0xa5, 0x87, 0xb2, 0x60, 0xf0, 0x48, ], }, ] From ea0fd59ec74f13ac99465dbe068ef1e8b64bd94d Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 4 May 2023 15:40:14 +0300 Subject: [PATCH 25/67] Add tracking for supply info inside verify_issue_bundle (#55) 1. Added a new error, `ValueSumOverflow`, that occurs if the sum value overflows when adding new supply amounts. 2. Created a new `supply_info` module containing `SupplyInfo` and `AssetSupply` structures, with `add_supply` function and unit tests for it. 3. Renamed the `are_note_asset_ids_derived_correctly` function to `verify_supply`, changed its behavior to verify and compute asset supply, added unit tests for it. 4. Updated the `verify_issue_bundle` function to use the changes mentioned above, updated its description, and added new unit tests. 5. Renamed errors with `...NoteType` suffix in the name to `...AssetBase`. 6. Added `update_finalization_set` method to `SupplyInfo` and use after the calls of `verify_issue_bundle function` (if needed), instead of mutating the finalization set inside `verify_issue_bundle`. --- src/issuance.rs | 445 ++++++++++++++++++++++++++++++++++----------- src/lib.rs | 1 + src/supply_info.rs | 194 ++++++++++++++++++++ tests/zsa.rs | 2 +- 4 files changed, 536 insertions(+), 106 deletions(-) create mode 100644 src/supply_info.rs diff --git a/src/issuance.rs b/src/issuance.rs index f3da1523b..af243358e 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -7,21 +7,23 @@ use std::fmt; use crate::bundle::commitments::{hash_issue_bundle_auth_data, hash_issue_bundle_txid_data}; use crate::issuance::Error::{ - IssueActionAlreadyFinalized, IssueActionIncorrectNoteType, IssueActionNotFound, - IssueActionPreviouslyFinalizedNoteType, IssueBundleIkMismatchNoteType, - IssueBundleInvalidSignature, WrongAssetDescSize, + IssueActionAlreadyFinalized, IssueActionIncorrectAssetBase, IssueActionNotFound, + IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, + IssueBundleInvalidSignature, ValueSumOverflow, WrongAssetDescSize, }; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use crate::note::asset_base::is_asset_desc_of_valid_size; use crate::note::{AssetBase, Nullifier}; use crate::primitives::redpallas::Signature; -use crate::value::NoteValue; +use crate::value::{NoteValue, ValueSum}; use crate::{ primitives::redpallas::{self, SpendAuth}, Address, Note, }; +use crate::supply_info::{AssetSupply, SupplyInfo}; + /// A bundle of actions to be applied to the ledger. #[derive(Debug, Clone)] pub struct IssueBundle { @@ -83,27 +85,54 @@ impl IssueAction { self.finalize } - /// Return the `AssetBase` if the provided `ik` is used to derive the `asset_id` for **all** internal notes. - fn are_note_asset_ids_derived_correctly( - &self, - ik: &IssuanceValidatingKey, - ) -> Result { - match self - .notes - .iter() - .try_fold(self.notes().head.asset(), |asset, ¬e| { - // Fail if not all note types are equal + /// Verifies and computes the new asset supply for an `IssueAction`. + /// + /// This function calculates the total value (supply) of the asset by summing the values + /// of all its notes and ensures that all note types are equal. It returns the asset and + /// its supply as a tuple (`AssetBase`, `AssetSupply`) or an error if the asset was not + /// properly derived or an overflow occurred during the supply amount calculation. + /// + /// # Arguments + /// + /// * `ik` - A reference to the `IssuanceValidatingKey` used for deriving the asset. + /// + /// # Returns + /// + /// A `Result` containing a tuple with an `AssetBase` and an `AssetSupply`, or an `Error`. + /// + /// # Errors + /// + /// This function may return an error in any of the following cases: + /// + /// * `IssueActionIncorrectAssetBase`: If the asset type of any note in the `IssueAction` is + /// not equal to the asset type of the first note. + /// + /// * `ValueSumOverflow`: If the total amount value of all notes in the `IssueAction` overflows. + /// + /// * `IssueBundleIkMismatchAssetBase`: If the provided `ik` is not used to derive the + /// `AssetBase` for **all** internal notes. + fn verify_supply(&self, ik: &IssuanceValidatingKey) -> Result<(AssetBase, AssetSupply), Error> { + // Calculate the value of the asset as a sum of values of all its notes + // and ensure all note types are equal + let (asset, value_sum) = self.notes.iter().try_fold( + (self.notes().head.asset(), ValueSum::zero()), + |(asset, value_sum), ¬e| { + // All assets should have the same `AssetBase` note.asset() .eq(&asset) - .then(|| asset) - .ok_or(IssueActionIncorrectNoteType) - }) { - Ok(asset) => asset // check that the asset was properly derived. - .eq(&AssetBase::derive(ik, &self.asset_desc)) - .then(|| asset) - .ok_or(IssueBundleIkMismatchNoteType), - Err(e) => Err(e), - } + .then(|| ()) + .ok_or(IssueActionIncorrectAssetBase)?; + + // The total amount should not overflow + Ok((asset, (value_sum + note.value()).ok_or(ValueSumOverflow)?)) + }, + )?; + + // Return the asset and its supply (or an error if the asset was not properly derived) + asset + .eq(&AssetBase::derive(ik, &self.asset_desc)) + .then(|| Ok((asset, AssetSupply::new(value_sum, self.is_finalized())))) + .ok_or(IssueBundleIkMismatchAssetBase)? } } @@ -309,9 +338,8 @@ impl IssueBundle { // Make sure the `expected_ik` matches the `asset` for all notes. self.actions.iter().try_for_each(|action| { - action - .are_note_asset_ids_derived_correctly(&expected_ik) - .map(|_| ()) // Transform Result into Result<(),Error)>. + action.verify_supply(&expected_ik)?; + Ok(()) })?; Ok(IssueBundle { @@ -354,8 +382,7 @@ impl IssueBundle { /// Validation for Orchard IssueBundles /// -/// A set of previously finalized asset types must be provided. -/// In case of success, `finalized` will contain a set of the provided **and** the newly finalized `AssetBase`s +/// A set of previously finalized asset types must be provided in `finalized` argument. /// /// The following checks are performed: /// * For the `IssueBundle`: @@ -365,44 +392,60 @@ impl IssueBundle { /// * `AssetBase` for the `IssueAction` has not been previously finalized. /// * For each `Note` inside an `IssueAction`: /// * All notes have the same, correct `AssetBase`. +/// +// # Returns +/// +/// A Result containing a SupplyInfo struct, which stores supply information in a HashMap. +/// The HashMap uses AssetBase as the key, and an AssetSupply struct as the value. The +/// AssetSupply contains a ValueSum (representing the total value of all notes for the asset) +/// and a bool indicating whether the asset is finalized. +/// +/// # Errors +/// +/// * `IssueBundleInvalidSignature`: This error occurs if the signature verification +/// for the provided `sighash` fails. +/// * `WrongAssetDescSize`: This error is raised if the asset description size for any +/// asset in the bundle is incorrect. +/// * `IssueActionPreviouslyFinalizedAssetBase`: This error occurs if the asset has already been +/// finalized (inserted into the `finalized` collection). +/// * `IssueActionIncorrectAssetBase`: This error occurs if any note has an incorrect note type. +/// * `ValueSumOverflow`: This error occurs if an overflow happens during the calculation of +/// the value sum for the notes in the asset. +/// * `IssueBundleIkMismatchAssetBase`: This error is raised if the `AssetBase` derived from +/// the `ik` (Issuance Validating Key) and the `asset_desc` (Asset Description) does not match +/// the expected `AssetBase`. pub fn verify_issue_bundle( bundle: &IssueBundle, sighash: [u8; 32], - finalized: &mut HashSet, // The finalization set. -) -> Result<(), Error> { - if let Err(e) = bundle.ik.verify(&sighash, &bundle.authorization.signature) { - return Err(IssueBundleInvalidSignature(e)); - }; - - let s = &mut HashSet::::new(); - - let newly_finalized = bundle - .actions() - .iter() - .try_fold(s, |newly_finalized, action| { - if !is_asset_desc_of_valid_size(action.asset_desc()) { - return Err(WrongAssetDescSize); - } + finalized: &HashSet, // The finalization set. +) -> Result { + bundle + .ik + .verify(&sighash, &bundle.authorization.signature) + .map_err(IssueBundleInvalidSignature)?; + + let supply_info = + bundle + .actions() + .iter() + .try_fold(SupplyInfo::new(), |mut supply_info, action| { + if !is_asset_desc_of_valid_size(action.asset_desc()) { + return Err(WrongAssetDescSize); + } - // Fail if any note in the IssueAction has incorrect note type. - let asset = action.are_note_asset_ids_derived_correctly(bundle.ik())?; + let (asset, supply) = action.verify_supply(bundle.ik())?; - // Fail if the asset was previously finalized. - if finalized.contains(&asset) || newly_finalized.contains(&asset) { - return Err(IssueActionPreviouslyFinalizedNoteType(asset)); - } + // Fail if the asset was previously finalized. + if finalized.contains(&asset) { + return Err(IssueActionPreviouslyFinalizedAssetBase(asset)); + } - // Add to the finalization set, if needed. - if action.is_finalized() { - newly_finalized.insert(asset); - } + supply_info.add_supply(asset, supply)?; - // Proceed with the new finalization set. - Ok(newly_finalized) - })?; + Ok(supply_info) + })?; - finalized.extend(newly_finalized.iter()); - Ok(()) + Ok(supply_info) } /// Errors produced during the issuance process @@ -412,18 +455,21 @@ pub enum Error { IssueActionAlreadyFinalized, /// The requested IssueAction not exists in the bundle. IssueActionNotFound, - /// Not all `NoteType`s are the same inside the action. - IssueActionIncorrectNoteType, + /// Not all `AssetBase`s are the same inside the action. + IssueActionIncorrectAssetBase, /// The provided `isk` and the driven `ik` does not match at least one note type. - IssueBundleIkMismatchNoteType, + IssueBundleIkMismatchAssetBase, /// `asset_desc` should be between 1 and 512 bytes. WrongAssetDescSize, /// Verification errors: /// Invalid signature. IssueBundleInvalidSignature(reddsa::Error), - /// The provided `NoteType` has been previously finalized. - IssueActionPreviouslyFinalizedNoteType(AssetBase), + /// The provided `AssetBase` has been previously finalized. + IssueActionPreviouslyFinalizedAssetBase(AssetBase), + + /// Overflow error occurred while calculating the value of the asset + ValueSumOverflow, } impl std::error::Error for Error {} @@ -440,10 +486,10 @@ impl fmt::Display for Error { IssueActionNotFound => { write!(f, "the requested IssueAction not exists in the bundle.") } - IssueActionIncorrectNoteType => { - write!(f, "not all `NoteType`s are the same inside the action") + IssueActionIncorrectAssetBase => { + write!(f, "not all `AssetBase`s are the same inside the action") } - IssueBundleIkMismatchNoteType => { + IssueBundleIkMismatchAssetBase => { write!( f, "the provided `isk` and the driven `ik` does not match at least one note type" @@ -455,8 +501,14 @@ impl fmt::Display for Error { IssueBundleInvalidSignature(_) => { write!(f, "invalid signature") } - IssueActionPreviouslyFinalizedNoteType(_) => { - write!(f, "the provided `NoteType` has been previously finalized") + IssueActionPreviouslyFinalizedAssetBase(_) => { + write!(f, "the provided `AssetBase` has been previously finalized") + } + ValueSumOverflow => { + write!( + f, + "overflow error occurred while calculating the value of the asset" + ) } } } @@ -464,10 +516,10 @@ impl fmt::Display for Error { #[cfg(test)] mod tests { - use super::IssueBundle; + use super::{AssetSupply, IssueBundle}; use crate::issuance::Error::{ - IssueActionAlreadyFinalized, IssueActionIncorrectNoteType, IssueActionNotFound, - IssueActionPreviouslyFinalizedNoteType, IssueBundleIkMismatchNoteType, + IssueActionAlreadyFinalized, IssueActionIncorrectAssetBase, IssueActionNotFound, + IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, IssueBundleInvalidSignature, WrongAssetDescSize, }; use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; @@ -475,7 +527,7 @@ mod tests { FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; use crate::note::{AssetBase, Nullifier}; - use crate::value::NoteValue; + use crate::value::{NoteValue, ValueSum}; use crate::{Address, Note}; use nonempty::NonEmpty; use rand::rngs::OsRng; @@ -492,11 +544,12 @@ mod tests { [u8; 32], ) { let mut rng = OsRng; + let sk = SpendingKey::random(&mut rng); let isk: IssuanceAuthorizingKey = (&sk).into(); let ik: IssuanceValidatingKey = (&isk).into(); - let fvk = FullViewingKey::from(&sk); + let fvk = FullViewingKey::from(&SpendingKey::random(&mut rng)); let recipient = fvk.address_at(0u32, Scope::External); let mut sighash = [0u8; 32]; @@ -505,6 +558,102 @@ mod tests { (rng, isk, ik, recipient, sighash) } + fn setup_verify_supply_test_params( + note1_value: u64, + note2_value: u64, + note1_asset_desc: &str, + note2_asset_desc: Option<&str>, // if None, both notes use the same asset + finalize: bool, + ) -> (IssuanceValidatingKey, AssetBase, IssueAction) { + let (mut rng, _, ik, recipient, _) = setup_params(); + + let asset = AssetBase::derive(&ik, note1_asset_desc); + let note2_asset = note2_asset_desc.map_or(asset, |desc| AssetBase::derive(&ik, desc)); + + let note1 = Note::new( + recipient, + NoteValue::from_raw(note1_value), + asset, + Nullifier::dummy(&mut rng), + &mut rng, + ); + + let note2 = Note::new( + recipient, + NoteValue::from_raw(note2_value), + note2_asset, + Nullifier::dummy(&mut rng), + &mut rng, + ); + + ( + ik, + asset, + IssueAction::from_parts( + note1_asset_desc.into(), + NonEmpty { + head: note1, + tail: vec![note2], + }, + finalize, + ), + ) + } + + #[test] + fn test_verify_supply_valid() { + let (ik, test_asset, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", None, false); + + let result = action.verify_supply(&ik); + + assert!(result.is_ok()); + + let (asset, supply) = result.unwrap(); + + assert_eq!(asset, test_asset); + assert_eq!(supply.amount, ValueSum::from_raw(30)); + assert!(!supply.is_finalized); + } + + #[test] + fn test_verify_supply_finalized() { + let (ik, test_asset, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", None, true); + + let result = action.verify_supply(&ik); + + assert!(result.is_ok()); + + let (asset, supply) = result.unwrap(); + + assert_eq!(asset, test_asset); + assert_eq!(supply.amount, ValueSum::from_raw(30)); + assert!(supply.is_finalized); + } + + #[test] + fn test_verify_supply_incorrect_asset_base() { + let (ik, _, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", Some("Asset 2"), false); + + assert_eq!( + action.verify_supply(&ik), + Err(IssueActionIncorrectAssetBase) + ); + } + + #[test] + fn test_verify_supply_ik_mismatch_asset_base() { + let (_, _, action) = setup_verify_supply_test_params(10, 20, "Asset 1", None, false); + let (_, _, ik, _, _) = setup_params(); + + assert_eq!( + action.verify_supply(&ik), + Err(IssueBundleIkMismatchAssetBase) + ); + } + #[test] fn issue_bundle_basic() { let (rng, _, ik, recipient, _) = setup_params(); @@ -714,7 +863,7 @@ mod tests { .sign(rng, &wrong_isk) .expect_err("should not be able to sign"); - assert_eq!(err, IssueBundleIkMismatchNoteType); + assert_eq!(err, IssueBundleIkMismatchAssetBase); } #[test] @@ -755,7 +904,7 @@ mod tests { .sign(rng, &isk) .expect_err("should not be able to sign"); - assert_eq!(err, IssueActionIncorrectNoteType); + assert_eq!(err, IssueActionIncorrectAssetBase); } #[test] @@ -775,11 +924,12 @@ mod tests { .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let prev_finalized = &mut HashSet::new(); - let res = verify_issue_bundle(&signed, sighash, prev_finalized); - assert!(res.is_ok()); + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + assert!(prev_finalized.is_empty()); } @@ -800,16 +950,97 @@ mod tests { .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let prev_finalized = &mut HashSet::new(); - let res = verify_issue_bundle(&signed, sighash, prev_finalized); - assert!(res.is_ok()); - assert!(prev_finalized.contains(&AssetBase::derive( - &ik, - &String::from("Verify with finalize") - ))); + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + assert_eq!(prev_finalized.len(), 1); + assert!(prev_finalized.contains(&AssetBase::derive(&ik, "Verify with finalize"))); + } + + #[test] + fn issue_bundle_verify_with_supply_info() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let mut bundle = IssueBundle::new(ik.clone()); + + let asset1_desc = "Verify with supply info 1"; + let asset2_desc = "Verify with supply info 2"; + let asset3_desc = "Verify with supply info 3"; + + let asset1_base = AssetBase::derive(&ik, &String::from(asset1_desc)); + let asset2_base = AssetBase::derive(&ik, &String::from(asset2_desc)); + let asset3_base = AssetBase::derive(&ik, &String::from(asset3_desc)); + + bundle + .add_recipient( + String::from(asset1_desc), + recipient, + NoteValue::from_raw(7), + false, + rng, + ) + .unwrap(); + + bundle + .add_recipient( + String::from(asset1_desc), + recipient, + NoteValue::from_raw(8), + true, + rng, + ) + .unwrap(); + + bundle + .add_recipient( + String::from(asset2_desc), + recipient, + NoteValue::from_raw(10), + true, + rng, + ) + .unwrap(); + + bundle + .add_recipient( + String::from(asset3_desc), + recipient, + NoteValue::from_raw(5), + false, + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + + assert_eq!(prev_finalized.len(), 2); + + assert!(prev_finalized.contains(&asset1_base)); + assert!(prev_finalized.contains(&asset2_base)); + assert!(!prev_finalized.contains(&asset3_base)); + + assert_eq!(supply_info.assets.len(), 3); + + assert_eq!( + supply_info.assets.get(&asset1_base), + Some(&AssetSupply::new(ValueSum::from_raw(15), true)) + ); + assert_eq!( + supply_info.assets.get(&asset2_base), + Some(&AssetSupply::new(ValueSum::from_raw(10), true)) + ); + assert_eq!( + supply_info.assets.get(&asset3_base), + Some(&AssetSupply::new(ValueSum::from_raw(5), false)) + ); } #[test] @@ -835,10 +1066,9 @@ mod tests { prev_finalized.insert(final_type); - let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); assert_eq!( - finalized.unwrap_err(), - IssueActionPreviouslyFinalizedNoteType(final_type) + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueActionPreviouslyFinalizedAssetBase(final_type) ); } @@ -873,7 +1103,7 @@ mod tests { signature: wrong_isk.sign(&mut rng, &sighash), }); - let prev_finalized = &mut HashSet::new(); + let prev_finalized = &HashSet::new(); assert_eq!( verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), @@ -898,13 +1128,10 @@ mod tests { let sighash: [u8; 32] = bundle.commitment().into(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let prev_finalized = &mut HashSet::new(); - - // 2. Try empty description - let finalized = verify_issue_bundle(&signed, random_sighash, prev_finalized); + let prev_finalized = &HashSet::new(); assert_eq!( - finalized.unwrap_err(), + verify_issue_bundle(&signed, random_sighash, prev_finalized).unwrap_err(), IssueBundleInvalidSignature(InvalidSignature) ); } @@ -944,10 +1171,12 @@ mod tests { .borrow_mut() .push(note); - let prev_finalized = &mut HashSet::new(); - let err = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(); + let prev_finalized = &HashSet::new(); - assert_eq!(err, IssueActionIncorrectNoteType); + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueActionIncorrectAssetBase + ); } #[test] @@ -985,10 +1214,12 @@ mod tests { signed.actions.first_mut().unwrap().notes = NonEmpty::new(note); - let prev_finalized = &mut HashSet::new(); - let err = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(); + let prev_finalized = &HashSet::new(); - assert_eq!(err, IssueBundleIkMismatchNoteType); + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueBundleIkMismatchAssetBase + ); } #[test] @@ -1015,7 +1246,7 @@ mod tests { .unwrap(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let prev_finalized = &mut HashSet::new(); + let prev_finalized = HashSet::new(); // 1. Try too long description signed @@ -1023,9 +1254,11 @@ mod tests { .first_mut() .unwrap() .modify_descr(String::from_utf8(vec![b'X'; 513]).unwrap()); - let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); - assert_eq!(finalized.unwrap_err(), WrongAssetDescSize); + assert_eq!( + verify_issue_bundle(&signed, sighash, &prev_finalized).unwrap_err(), + WrongAssetDescSize + ); // 2. Try empty description signed @@ -1033,9 +1266,11 @@ mod tests { .first_mut() .unwrap() .modify_descr("".to_string()); - let finalized = verify_issue_bundle(&signed, sighash, prev_finalized); - assert_eq!(finalized.unwrap_err(), WrongAssetDescSize); + assert_eq!( + verify_issue_bundle(&signed, sighash, &prev_finalized).unwrap_err(), + WrongAssetDescSize + ); } } diff --git a/src/lib.rs b/src/lib.rs index 76d9c41c0..417116df2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,7 @@ mod constants; pub mod issuance; pub mod keys; pub mod note; +pub mod supply_info; // pub mod note_encryption; // disabled until backward compatability is implemented. pub mod note_encryption_v3; pub mod primitives; diff --git a/src/supply_info.rs b/src/supply_info.rs new file mode 100644 index 000000000..6bd96df34 --- /dev/null +++ b/src/supply_info.rs @@ -0,0 +1,194 @@ +//! Structs and logic related to supply information management for assets. + +use std::collections::{hash_map, HashMap, HashSet}; + +use crate::{issuance::Error, note::AssetBase, value::ValueSum}; + +/// Represents the amount of an asset and its finalization status. +#[derive(Debug, Clone, Copy)] +#[cfg_attr(test, derive(PartialEq))] +pub struct AssetSupply { + /// The amount of the asset. + pub amount: ValueSum, + /// Whether or not the asset is finalized. + pub is_finalized: bool, +} + +impl AssetSupply { + /// Creates a new AssetSupply instance with the given amount and finalization status. + pub fn new(amount: ValueSum, is_finalized: bool) -> Self { + Self { + amount, + is_finalized, + } + } +} + +/// Contains information about the supply of assets. +#[derive(Debug, Clone)] +pub struct SupplyInfo { + /// A map of asset bases to their respective supply information. + pub assets: HashMap, +} + +impl SupplyInfo { + /// Creates a new, empty `SupplyInfo` instance. + pub fn new() -> Self { + Self { + assets: HashMap::new(), + } + } + + /// Inserts or updates an asset's supply information in the supply info map. + /// If the asset exists, adds the amounts (unconditionally) and updates the finalization status + /// (only if the new supply is finalized). If the asset is not found, inserts the new supply. + pub fn add_supply(&mut self, asset: AssetBase, new_supply: AssetSupply) -> Result<(), Error> { + match self.assets.entry(asset) { + hash_map::Entry::Occupied(entry) => { + let supply = entry.into_mut(); + supply.amount = + (supply.amount + new_supply.amount).ok_or(Error::ValueSumOverflow)?; + supply.is_finalized |= new_supply.is_finalized; + } + hash_map::Entry::Vacant(entry) => { + entry.insert(new_supply); + } + } + + Ok(()) + } + + /// Updates the set of finalized assets based on the supply information stored in + /// the `SupplyInfo` instance. + pub fn update_finalization_set(&self, finalization_set: &mut HashSet) { + finalization_set.extend( + self.assets + .iter() + .filter_map(|(asset, supply)| supply.is_finalized.then(|| asset)), + ); + } +} + +impl Default for SupplyInfo { + fn default() -> Self { + Self::new() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn create_test_asset(asset_desc: &str) -> AssetBase { + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; + + let sk = SpendingKey::from_bytes([0u8; 32]).unwrap(); + let isk: IssuanceAuthorizingKey = (&sk).into(); + + AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc) + } + + fn sum<'a, T: IntoIterator>(supplies: T) -> Option { + supplies + .into_iter() + .map(|supply| supply.amount) + .try_fold(ValueSum::from_raw(0), |sum, value| sum + value) + } + + #[test] + fn test_add_supply_valid() { + let mut supply_info = SupplyInfo::new(); + + let asset1 = create_test_asset("Asset 1"); + let asset2 = create_test_asset("Asset 2"); + + let supply1 = AssetSupply::new(ValueSum::from_raw(20), false); + let supply2 = AssetSupply::new(ValueSum::from_raw(30), true); + let supply3 = AssetSupply::new(ValueSum::from_raw(10), false); + let supply4 = AssetSupply::new(ValueSum::from_raw(10), true); + let supply5 = AssetSupply::new(ValueSum::from_raw(50), false); + + assert_eq!(supply_info.assets.len(), 0); + + // Add supply1 + assert!(supply_info.add_supply(asset1, supply1).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new(sum([&supply1]).unwrap(), false)) + ); + + // Add supply2 + assert!(supply_info.add_supply(asset1, supply2).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new(sum([&supply1, &supply2]).unwrap(), true)) + ); + + // Add supply3 + assert!(supply_info.add_supply(asset1, supply3).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3]).unwrap(), + true + )) + ); + + // Add supply4 + assert!(supply_info.add_supply(asset1, supply4).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3, &supply4]).unwrap(), + true + )) + ); + + // Add supply5 + assert!(supply_info.add_supply(asset2, supply5).is_ok()); + assert_eq!(supply_info.assets.len(), 2); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3, &supply4]).unwrap(), + true + )) + ); + assert_eq!( + supply_info.assets.get(&asset2), + Some(&AssetSupply::new(sum([&supply5]).unwrap(), false)) + ); + } + + #[test] + fn test_update_finalization_set() { + let mut supply_info = SupplyInfo::new(); + + let asset1 = create_test_asset("Asset 1"); + let asset2 = create_test_asset("Asset 2"); + let asset3 = create_test_asset("Asset 3"); + + let supply1 = AssetSupply::new(ValueSum::from_raw(10), false); + let supply2 = AssetSupply::new(ValueSum::from_raw(20), true); + let supply3 = AssetSupply::new(ValueSum::from_raw(40), false); + let supply4 = AssetSupply::new(ValueSum::from_raw(50), true); + + assert!(supply_info.add_supply(asset1, supply1).is_ok()); + assert!(supply_info.add_supply(asset1, supply2).is_ok()); + assert!(supply_info.add_supply(asset2, supply3).is_ok()); + assert!(supply_info.add_supply(asset3, supply4).is_ok()); + + let mut finalization_set = HashSet::new(); + + supply_info.update_finalization_set(&mut finalization_set); + + assert_eq!(finalization_set.len(), 2); + + assert!(finalization_set.contains(&asset1)); + assert!(finalization_set.contains(&asset3)); + } +} diff --git a/tests/zsa.rs b/tests/zsa.rs index 5b1ea4437..e597ff5c5 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -169,7 +169,7 @@ fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { assert!(verify_issue_bundle( &issue_bundle, issue_bundle.commitment().into(), - &mut HashSet::new(), + &HashSet::new(), ) .is_ok()); From 9a35108155bbad1f73c0e8bc7d79f81d8bfe3273 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Wed, 10 May 2023 10:23:48 +0300 Subject: [PATCH 26/67] Add getter method for Bundle.burn field (#58) - Add getter method for Bundle.burn field --- src/bundle.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bundle.rs b/src/bundle.rs index d7a75875b..c702d8655 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -206,6 +206,11 @@ impl Bundle { &self.value_balance } + /// Returns assets intended for burning + pub fn burn(&self) -> &Vec<(AssetBase, V)> { + &self.burn + } + /// Returns the root of the Orchard commitment tree that this bundle commits to. pub fn anchor(&self) -> &Anchor { &self.anchor From aeb993403badb1f21c8c58fb1c01290a43d29a8d Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 23 May 2023 13:03:56 +0200 Subject: [PATCH 27/67] Circuit: Update note_commit to take into account asset (#56) In the circuit, we update note_commit to take into account asset. Previously, note_commit returns cm = hash(Q_ZEC, msg) + [rcm]R. Now, note_commit returns - cm = hash(Q_ZEC, msg) + [rcm]R for ZEC note - cm = hash(Q_ZSA, msg || asset) + [rcm]R for ZSA note We now evaluate note_commit with the following steps 1. evaluate **hash_zec = hash(Q_ZEC, msg)** 2. evaluate **hash_zsa = hash(Q_ZSA, msg || asset)** 3. select **hash = hash_zec if is_native_asset** **= hash_zsa otherwise** 4. evaluate **cm = hash + [rcm]R** 5. check some constraints on msg and asset and their decompositions 6. return **cm** The following modifications are required to update note_commit: - add a is_native_asset witness (and check that it is a boolean and its value is correct according to asset) - add a MUX chip to evaluate a multiplexer on Pallas points Warning: we increased the size of the Orchard circuit ! --- Cargo.toml | 2 +- src/circuit.rs | 165 +- src/circuit/gadget.rs | 28 + src/circuit/gadget/mux_chip.rs | 338 + src/circuit/note_commit.rs | 678 +- src/circuit/value_commit_orchard.rs | 9 +- src/circuit_description | 9448 ++++++++++++++++----------- src/circuit_proof_test_case.bin | Bin 5186 -> 5250 bytes src/constants/sinsemilla.rs | 43 +- src/note/asset_base.rs | 14 +- src/note/commitment.rs | 4 +- tests/zsa.rs | 2 +- 12 files changed, 6648 insertions(+), 4083 deletions(-) create mode 100644 src/circuit/gadget/mux_chip.rs diff --git a/Cargo.toml b/Cargo.toml index 21b273eaa..6d12d29eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,4 +95,4 @@ debug = true [patch.crates-io] zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", rev = "07c377ddedf71ab7c7a266d284b054a2dafc2ed4" } bridgetree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "ea1686e8f8f6c1e41aa97251a7eb4fadfd33df47" } -incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "ea1686e8f8f6c1e41aa97251a7eb4fadfd33df47" } \ No newline at end of file +incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "ea1686e8f8f6c1e41aa97251a7eb4fadfd33df47" } diff --git a/src/circuit.rs b/src/circuit.rs index 24f3d2e86..9b2f9b766 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -2,6 +2,7 @@ use core::fmt; +use ff::Field; use group::{Curve, GroupEncoding}; use halo2_proofs::{ circuit::{floor_planner, Layouter, Value}, @@ -20,12 +21,13 @@ use self::{ commit_ivk::{CommitIvkChip, CommitIvkConfig}, gadget::{ add_chip::{AddChip, AddConfig}, - assign_free_advice, + assign_free_advice, assign_is_native_asset, }, note_commit::{NoteCommitChip, NoteCommitConfig}, }; use crate::{ builder::SpendInfo, + circuit::gadget::mux_chip::{MuxChip, MuxConfig}, constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, MERKLE_DEPTH_ORCHARD, @@ -65,7 +67,7 @@ mod note_commit; mod value_commit_orchard; /// Size of the Orchard circuit. -const K: u32 = 11; +const K: u32 = 12; // Absolute offsets for public inputs. const ANCHOR: usize = 0; @@ -96,6 +98,7 @@ pub struct Config { commit_ivk_config: CommitIvkConfig, old_note_commit_config: NoteCommitConfig, new_note_commit_config: NoteCommitConfig, + mux_config: MuxConfig, } /// The Orchard Action circuit. @@ -220,6 +223,8 @@ impl plonk::Circuit for Circuit { // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). // Constrain split_flag = 1 or nf_old = nf_old_pub + // Constrain is_native_asset to be boolean + // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -239,8 +244,23 @@ impl plonk::Circuit for Circuit { let nf_old = meta.query_advice(advices[9], Rotation::cur()); let nf_old_pub = meta.query_advice(advices[0], Rotation::next()); + let is_native_asset = meta.query_advice(advices[1], Rotation::next()); + let asset_x = meta.query_advice(advices[2], Rotation::next()); + let asset_y = meta.query_advice(advices[3], Rotation::next()); + let diff_asset_x_inv = meta.query_advice(advices[4], Rotation::next()); + let diff_asset_y_inv = meta.query_advice(advices[5], Rotation::next()); + let one = Expression::Constant(pallas::Base::one()); + let native_asset = AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap(); + + let diff_asset_x = asset_x - Expression::Constant(*native_asset.x()); + let diff_asset_y = asset_y - Expression::Constant(*native_asset.y()); + Constraints::with_selector( q_orchard, [ @@ -265,7 +285,30 @@ impl plonk::Circuit for Circuit { ), ( "split_flag = 1 or nf_old = nf_old_pub", - (one - split_flag) * (nf_old - nf_old_pub), + (one.clone() - split_flag) * (nf_old - nf_old_pub), + ), + ( + "bool_check is_native_asset", + bool_check(is_native_asset.clone()), + ), + ( + "(is_native_asset = 1) => (asset_x = native_asset_x)", + is_native_asset.clone() * diff_asset_x.clone(), + ), + ( + "(is_native_asset = 1) => (asset_y = native_asset_y)", + is_native_asset.clone() * diff_asset_y.clone(), + ), + // To prove that `asset` is not equal to `native_asset`, we will prove that at + // least one of `x(asset) - x(native_asset)` or `y(asset) - y(native_asset)` is + // not equal to zero. + // To prove that `x(asset) - x(native_asset)` (resp `y(asset) - y(native_asset)`) + // is not equal to zero, we will prove that it is invertible. + ( + "(is_native_asset = 0) => (asset != native_asset)", + (one.clone() - is_native_asset) + * (diff_asset_x * diff_asset_x_inv - one.clone()) + * (diff_asset_y * diff_asset_y_inv - one), ), ], ) @@ -383,6 +426,8 @@ impl plonk::Circuit for Circuit { let new_note_commit_config = NoteCommitChip::configure(meta, advices, sinsemilla_config_2.clone()); + let mux_config = MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + Config { primary, q_orchard, @@ -397,6 +442,7 @@ impl plonk::Circuit for Circuit { commit_ivk_config, old_note_commit_config, new_note_commit_config, + mux_config, } } @@ -413,7 +459,7 @@ impl plonk::Circuit for Circuit { let ecc_chip = config.ecc_chip(); // Witness private inputs that are used across multiple checks. - let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) = { + let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset) = { // Witness psi_old let psi_old = assign_free_advice( layouter.namespace(|| "witness psi_old"), @@ -471,9 +517,27 @@ impl plonk::Circuit for Circuit { self.v_new, )?; - (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) + // Witness asset + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + ( + psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, + ) }; + // Witness is_native_asset which is equal to + // 1 if asset is equal to native asset, and + // 0 if asset is not equal to native asset. + let is_native_asset = assign_is_native_asset( + layouter.namespace(|| "witness is_native_asset"), + config.advices[0], + self.asset, + )?; + // Merkle path validity check (https://p.z.cash/ZKS:action-merkle-path-validity?partial). let root = { let path = self @@ -537,19 +601,13 @@ impl plonk::Circuit for Circuit { self.rcv.as_ref().map(|rcv| rcv.inner()), )?; - let asset = NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness asset"), - self.asset.map(|asset| asset.cv_base().to_affine()), - )?; - let cv_net = gadget::value_commit_orchard( layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net_magnitude_sign)"), config.sinsemilla_chip_1(), ecc_chip.clone(), v_net_magnitude_sign.clone(), rcv, - asset, + asset.clone(), )?; // Constrain cv_net to equal public input @@ -658,12 +716,15 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_1(), config.ecc_chip(), config.note_commit_chip_old(), + config.mux_chip(), g_d_old.inner(), pk_d_old.inner(), v_old.clone(), rho_old, psi_old, + asset.inner(), rcm_old, + is_native_asset.clone(), )?; // Constrain derived cm_old to equal witnessed cm_old @@ -716,12 +777,15 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_2(), config.ecc_chip(), config.note_commit_chip_new(), + config.mux_chip(), g_d_new.inner(), pk_d_new.inner(), v_new.clone(), rho_new, psi_new, + asset.inner(), rcm_new, + is_native_asset.clone(), )?; let cmx = cm_new.extract_p(); @@ -795,6 +859,72 @@ impl plonk::Circuit for Circuit { 1, )?; + is_native_asset.copy_advice( + || "is_native_asset", + &mut region, + config.advices[1], + 1, + )?; + asset + .inner() + .x() + .copy_advice(|| "asset_x", &mut region, config.advices[2], 1)?; + asset + .inner() + .y() + .copy_advice(|| "asset_y", &mut region, config.advices[3], 1)?; + + // `diff_asset_x_inv` and `diff_asset_y_inv` will be used to prove that + // if is_native_asset = 0, then asset != native_asset. + region.assign_advice( + || "diff_asset_x_inv", + config.advices[4], + 1, + || { + self.asset.map(|asset| { + let asset_x = *asset.cv_base().to_affine().coordinates().unwrap().x(); + let native_asset_x = *AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap() + .x(); + + let diff_asset_x = asset_x - native_asset_x; + + if diff_asset_x == pallas::Base::zero() { + pallas::Base::zero() + } else { + diff_asset_x.invert().unwrap() + } + }) + }, + )?; + region.assign_advice( + || "diff_asset_y_inv", + config.advices[5], + 1, + || { + self.asset.map(|asset| { + let asset_y = *asset.cv_base().to_affine().coordinates().unwrap().y(); + let native_asset_y = *AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap() + .y(); + + let diff_asset_y = asset_y - native_asset_y; + + if diff_asset_y == pallas::Base::zero() { + pallas::Base::zero() + } else { + diff_asset_y.invert().unwrap() + } + }) + }, + )?; + config.q_orchard.enable(&mut region, 0) }, )?; @@ -1111,8 +1241,8 @@ mod tests { K, &circuits[0], ); - assert_eq!(usize::from(circuit_cost.proof_size(1)), 5024); - assert_eq!(usize::from(circuit_cost.proof_size(2)), 7296); + assert_eq!(usize::from(circuit_cost.proof_size(1)), 5088); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7360); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1141,6 +1271,7 @@ mod tests { #[test] fn serialized_proof_test_case() { + use std::fs; use std::io::{Read, Write}; let vk = VerifyingKey::build(); @@ -1209,7 +1340,7 @@ mod tests { let proof = Proof::create(&pk, &[circuit], instances, &mut rng).unwrap(); assert!(proof.verify(&vk, instances).is_ok()); - let file = std::fs::File::create("circuit_proof_test_case.bin")?; + let file = std::fs::File::create("src/circuit_proof_test_case.bin")?; write_test_case(file, &instance, &proof) }; create_proof().expect("should be able to write new proof"); @@ -1217,10 +1348,10 @@ mod tests { // Parse the hardcoded proof test case. let (instance, proof) = { - let test_case_bytes = include_bytes!("circuit_proof_test_case.bin"); + let test_case_bytes = fs::read("src/circuit_proof_test_case.bin").unwrap(); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 5024); + assert_eq!(proof.0.len(), 5088); assert!(proof.verify(&vk, &[instance]).is_ok()); } diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 8c0440aef..646bef288 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -5,6 +5,7 @@ use pasta_curves::pallas; use super::{commit_ivk::CommitIvkChip, note_commit::NoteCommitChip}; use crate::constants::{NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}; +use crate::note::AssetBase; use halo2_gadgets::{ ecc::{chip::EccChip, EccInstructions, FixedPointBaseField, Point, X}, poseidon::{ @@ -19,6 +20,7 @@ use halo2_proofs::{ }; pub(in crate::circuit) mod add_chip; +pub(in crate::circuit) mod mux_chip; impl super::Config { pub(super) fn add_chip(&self) -> add_chip::AddChip { @@ -68,6 +70,10 @@ impl super::Config { pub(super) fn note_commit_chip_old(&self) -> NoteCommitChip { NoteCommitChip::construct(self.old_note_commit_config.clone()) } + + pub(super) fn mux_chip(&self) -> mux_chip::MuxChip { + mux_chip::MuxChip::construct(self.mux_config.clone()) + } } /// An instruction set for adding two circuit words (field elements). @@ -100,6 +106,28 @@ where ) } +/// Witnesses is_native_asset. +pub(in crate::circuit) fn assign_is_native_asset( + layouter: impl Layouter, + column: Column, + asset: Value, +) -> Result, plonk::Error> +where + Assigned: for<'v> From<&'v pasta_curves::Fp>, +{ + assign_free_advice( + layouter, + column, + asset.map(|asset| { + if bool::from(asset.is_native()) { + pallas::Base::one() + } else { + pallas::Base::zero() + } + }), + ) +} + /// `DeriveNullifier` from [Section 4.16: Note Commitments and Nullifiers]. /// /// [Section 4.16: Note Commitments and Nullifiers]: https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs new file mode 100644 index 000000000..dbe54ed40 --- /dev/null +++ b/src/circuit/gadget/mux_chip.rs @@ -0,0 +1,338 @@ +use halo2_gadgets::ecc::chip::EccPoint; +use halo2_proofs::{ + circuit::{AssignedCell, Chip, Layouter, Value}, + plonk::{self, Advice, Column, ConstraintSystem, Constraints, Expression, Selector}, + poly::Rotation, +}; +use pasta_curves::pallas; + +#[derive(Clone, Debug)] +pub(in crate::circuit) struct MuxConfig { + choice: Column, + left: Column, + right: Column, + out: Column, + q_mux: Selector, +} + +/// A chip implementing a multiplexer on a single row. +/// +/// out = if (choice == 0) {left} else {right} +/// +/// `choice` must be constrained to {0, 1} separately. +#[derive(Clone, Debug)] +pub(in crate::circuit) struct MuxChip { + config: MuxConfig, +} + +impl Chip for MuxChip { + type Config = MuxConfig; + type Loaded = (); + + fn config(&self) -> &Self::Config { + &self.config + } + + fn loaded(&self) -> &Self::Loaded { + &() + } +} + +impl MuxChip { + pub(in crate::circuit) fn configure( + meta: &mut ConstraintSystem, + choice: Column, + left: Column, + right: Column, + out: Column, + ) -> MuxConfig { + let q_mux = meta.selector(); + meta.create_gate("Field element multiplexer", |meta| { + let q_mux = meta.query_selector(q_mux); + let choice = meta.query_advice(choice, Rotation::cur()); + let left = meta.query_advice(left, Rotation::cur()); + let right = meta.query_advice(right, Rotation::cur()); + let out = meta.query_advice(out, Rotation::cur()); + + let one = Expression::Constant(pallas::Base::one()); + + let should_be_zero = (one - choice.clone()) * left + choice * right - out; + + Constraints::with_selector(q_mux, Some(should_be_zero)) + }); + + MuxConfig { + choice, + left, + right, + out, + q_mux, + } + } + + pub(in crate::circuit) fn construct(config: MuxConfig) -> Self { + Self { config } + } +} + +/// An instruction set for multiplexing two points. +pub(crate) trait MuxInstructions { + /// Constraints `MUX(choice, left, right)` and returns the selected point. + fn mux( + &self, + layouter: impl Layouter, + choice: &AssignedCell, + left: &EccPoint, + right: &EccPoint, + ) -> Result; +} + +impl MuxInstructions for MuxChip { + fn mux( + &self, + mut layouter: impl Layouter, + choice: &AssignedCell, + left: &EccPoint, + right: &EccPoint, + ) -> Result { + let x_cell = layouter.assign_region( + || "mux x", + |mut region| { + self.config.q_mux.enable(&mut region, 0)?; + + choice.copy_advice(|| "copy choice", &mut region, self.config.choice, 0)?; + left.x() + .copy_advice(|| "copy left_x", &mut region, self.config.left, 0)?; + right + .x() + .copy_advice(|| "copy right_x", &mut region, self.config.right, 0)?; + + let out_val = (Value::known(pallas::Base::one()) - choice.value()) + * left.x().value() + + choice.value() * right.x().value(); + + region.assign_advice(|| "out x", self.config.out, 0, || out_val) + }, + )?; + let y_cell = layouter.assign_region( + || "mux y", + |mut region| { + self.config.q_mux.enable(&mut region, 0)?; + + choice.copy_advice(|| "copy choice", &mut region, self.config.choice, 0)?; + left.y() + .copy_advice(|| "copy left_y", &mut region, self.config.left, 0)?; + right + .y() + .copy_advice(|| "copy right_y", &mut region, self.config.right, 0)?; + + let out_val = (Value::known(pallas::Base::one()) - choice.value()) + * left.y().value() + + choice.value() * right.y().value(); + + region.assign_advice(|| "out y", self.config.out, 0, || out_val) + }, + )?; + + Ok(EccPoint::from_coordinates_unchecked( + x_cell.into(), + y_cell.into(), + )) + } +} + +#[cfg(test)] +mod tests { + use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig, MuxInstructions}; + + use crate::{circuit::gadget::assign_free_advice, circuit::K, constants::OrchardFixedBases}; + use halo2_gadgets::{ + ecc::{ + chip::{EccChip, EccConfig}, + Point, + }, + utilities::lookup_range_check::LookupRangeCheckConfig, + }; + + use group::{cofactor::CofactorCurveAffine, Curve, Group}; + use halo2_proofs::{ + circuit::{Layouter, SimpleFloorPlanner, Value}, + dev::MockProver, + plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance}, + }; + use pasta_curves::arithmetic::CurveAffine; + use pasta_curves::{pallas, EpAffine}; + + use rand::rngs::OsRng; + + #[test] + fn test_mux_chip() { + #[derive(Clone, Debug)] + pub struct MyConfig { + primary: Column, + advice: Column, + mux_config: MuxConfig, + ecc_config: EccConfig, + } + #[derive(Default)] + struct MyCircuit { + left_point: Value, + right_point: Value, + choice: Value, + } + + impl Circuit for MyCircuit { + type Config = MyConfig; + type FloorPlanner = SimpleFloorPlanner; + + fn without_witnesses(&self) -> Self { + Self::default() + } + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let advices = [ + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + ]; + + for advice in advices.iter() { + meta.enable_equality(*advice); + } + + // Instance column used for public inputs + let primary = meta.instance_column(); + meta.enable_equality(primary); + + let mux_config = + MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + + let table_idx = meta.lookup_table_column(); + + let lagrange_coeffs = [ + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + ]; + meta.enable_constant(lagrange_coeffs[0]); + + let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + + let ecc_config = EccChip::::configure( + meta, + advices, + lagrange_coeffs, + range_check, + ); + + MyConfig { + primary, + advice: advices[0], + mux_config, + ecc_config, + } + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl Layouter, + ) -> Result<(), Error> { + // Construct a MUX chip + let mux_chip = MuxChip::construct(config.mux_config); + + // Construct an ECC chip + let ecc_chip = EccChip::construct(config.ecc_config); + + // Assign left point + let left_point = Point::new( + ecc_chip.clone(), + layouter.namespace(|| "left point"), + self.left_point.map(|left_point| left_point), + )?; + + // Assign right point + let right_point = Point::new( + ecc_chip, + layouter.namespace(|| "right point"), + self.right_point.map(|right_point| right_point), + )?; + + // Assign choice + let choice = assign_free_advice( + layouter.namespace(|| "choice"), + config.advice, + self.choice, + )?; + + // Apply mux + let result = mux_chip.mux( + layouter.namespace(|| "MUX"), + &choice, + left_point.inner(), + right_point.inner(), + )?; + + // Check equality with instance + layouter.constrain_instance(result.x().cell(), config.primary, 0)?; + layouter.constrain_instance(result.y().cell(), config.primary, 1) + } + } + + // Test different circuits + let mut circuits = vec![]; + let mut instances = vec![]; + for choice in [false, true] { + let choice_value = if choice { + pallas::Base::one() + } else { + pallas::Base::zero() + }; + for left_point in [ + pallas::Point::identity().to_affine(), + pallas::Point::random(OsRng).to_affine(), + ] { + for right_point in [ + pallas::Point::identity().to_affine(), + pallas::Point::random(OsRng).to_affine(), + ] { + circuits.push(MyCircuit { + left_point: Value::known(left_point), + right_point: Value::known(right_point), + choice: Value::known(choice_value), + }); + let expected_output = if choice { right_point } else { left_point }; + let (expected_x, expected_y) = if bool::from(expected_output.is_identity()) { + (pallas::Base::zero(), pallas::Base::zero()) + } else { + let coords = expected_output.coordinates().unwrap(); + (*coords.x(), *coords.y()) + }; + instances.push([[expected_x, expected_y]]); + } + } + } + + for (circuit, instance) in circuits.iter().zip(instances.iter()) { + let prover = MockProver::::run( + K, + circuit, + instance.iter().map(|p| p.to_vec()).collect(), + ) + .unwrap(); + assert_eq!(prover.verify(), Ok(())); + } + } +} diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 9daa685f2..47e2fda1c 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -9,6 +9,7 @@ use halo2_proofs::{ use pasta_curves::pallas; use crate::{ + circuit::gadget::mux_chip::{MuxChip, MuxInstructions}, constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_P}, value::NoteValue, }; @@ -575,13 +576,16 @@ impl DecomposeG { ) } } - -/// h = h_0 || h_1 || h_2 -/// = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits +/// h_zec = h_0 || h_1 || h_2_zec +/// = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits /// -/// | A_6 | A_7 | A_8 | q_notecommit_h | -/// ------------------------------------ -/// | h | h_0 | h_1 | 1 | +/// h_zsa = h_0 || h_1 || h_2_zsa +/// = (bits 249..=253 of psi) || (bit 254 of psi) || (bits 0..=3 of x(asset)) +/// +/// | A_6 | A_7 | A_8 | q_notecommit_h | +/// -------------------------------------------- +/// | h_zec | h_0 | h_1 | 1 | +/// | h_zsa | h_2_zsa | | 0 | /// /// #[derive(Clone, Debug)] @@ -599,27 +603,38 @@ impl DecomposeH { col_m: Column, col_r: Column, two_pow_5: pallas::Base, + two_pow_6: pallas::Base, ) -> Self { let q_notecommit_h = meta.selector(); meta.create_gate("NoteCommit MessagePiece h", |meta| { let q_notecommit_h = meta.query_selector(q_notecommit_h); - // h has been constrained to 10 bits by the Sinsemilla hash. - let h = meta.query_advice(col_l, Rotation::cur()); + // h_zec has been constrained to 10 bits by the Sinsemilla hash. + let h_zec = meta.query_advice(col_l, Rotation::cur()); // h_0 has been constrained to be 5 bits outside this gate. let h_0 = meta.query_advice(col_m, Rotation::cur()); // This gate constrains h_1 to be boolean. let h_1 = meta.query_advice(col_r, Rotation::cur()); - // h = h_0 + (2^5) h_1 - let decomposition_check = h - (h_0 + h_1.clone() * two_pow_5); + // h_zsa has been constrained to 10 bits by the Sinsemilla hash. + let h_zsa = meta.query_advice(col_l, Rotation::next()); + // h_2_zsa has been constrained to be 4 bits outside this gate. + let h_2_zsa = meta.query_advice(col_m, Rotation::next()); + + // h_zec = h_0 + (2^5) h_1 + let zec_decomposition_check = h_zec - (h_0.clone() + h_1.clone() * two_pow_5); + + // h_zsa = h_0 + (2^5) h_1 + (2^6) h_2_zsa + let zsa_decomposition_check = + h_zsa - (h_0 + h_1.clone() * two_pow_5 + h_2_zsa * two_pow_6); Constraints::with_selector( q_notecommit_h, [ ("bool_check h_1", bool_check(h_1)), - ("decomposition", decomposition_check), + ("zec_decomposition", zec_decomposition_check), + ("zsa_decomposition", zsa_decomposition_check), ], ) }); @@ -638,11 +653,14 @@ impl DecomposeH { chip: SinsemillaChip, layouter: &mut impl Layouter, psi: &AssignedCell, + asset: &NonIdentityEccPoint, ) -> Result< ( + NoteCommitPiece, NoteCommitPiece, RangeConstrained>, RangeConstrained>, + RangeConstrained>, ), Error, > { @@ -657,9 +675,17 @@ impl DecomposeH { // h_1 will be boolean-constrained in the gate. let h_1 = RangeConstrained::bitrange_of(psi.value(), 254..255); - let h = MessagePiece::from_subpieces( - chip, - layouter.namespace(|| "h"), + // Constrain h_2_zsa to be 4 bits. + let h_2_zsa = RangeConstrained::witness_short( + lookup_config, + layouter.namespace(|| "h_2_zsa"), + asset.x().value(), + 0..4, + )?; + + let h_zec = MessagePiece::from_subpieces( + chip.clone(), + layouter.namespace(|| "h_zec"), [ h_0.value(), h_1, @@ -667,34 +693,164 @@ impl DecomposeH { ], )?; - Ok((h, h_0, h_1)) + let h_zsa = MessagePiece::from_subpieces( + chip, + layouter.namespace(|| "h_zsa"), + [h_0.value(), h_1, h_2_zsa.value()], + )?; + + Ok((h_zec, h_zsa, h_0, h_1, h_2_zsa)) } fn assign( &self, layouter: &mut impl Layouter, - h: NoteCommitPiece, + h_zec: NoteCommitPiece, + h_zsa: NoteCommitPiece, h_0: RangeConstrained>, h_1: RangeConstrained>, + h_2_zsa: RangeConstrained>, ) -> Result, Error> { layouter.assign_region( || "NoteCommit MessagePiece h", |mut region| { self.q_notecommit_h.enable(&mut region, 0)?; - h.inner() + h_zec + .inner() .cell_value() - .copy_advice(|| "h", &mut region, self.col_l, 0)?; + .copy_advice(|| "h_zec", &mut region, self.col_l, 0)?; h_0.inner() .copy_advice(|| "h_0", &mut region, self.col_m, 0)?; let h_1 = region.assign_advice(|| "h_1", self.col_r, 0, || *h_1.inner())?; + h_zsa + .inner() + .cell_value() + .copy_advice(|| "h_zsa", &mut region, self.col_l, 1)?; + + h_2_zsa + .inner() + .copy_advice(|| "h_2_zsa", &mut region, self.col_m, 1)?; + Ok(h_1) }, ) } } +/// j = j_0 || j_1 +/// = (bit 254 of x(asset)) || (ỹ bit of asset) +/// +/// | A_6 | A_7 | A_8 | q_notecommit_j | +/// ------------------------------------ +/// | j | j_0 | j_1 | 1 | +/// +/// https://p.z.cash/orchard-0.1:note-commit-decomposition-j?partial +#[derive(Clone, Debug)] +struct DecomposeJ { + q_notecommit_j: Selector, + col_l: Column, + col_m: Column, + col_r: Column, +} + +impl DecomposeJ { + fn configure( + meta: &mut ConstraintSystem, + col_l: Column, + col_m: Column, + col_r: Column, + two: pallas::Base, + ) -> Self { + let q_notecommit_j = meta.selector(); + + meta.create_gate("NoteCommit MessagePiece j", |meta| { + let q_notecommit_j = meta.query_selector(q_notecommit_j); + + // j has been constrained to 10 bits by the Sinsemilla hash. + let j = meta.query_advice(col_l, Rotation::cur()); + // This gate constrains j_0 to be boolean. + let j_0 = meta.query_advice(col_m, Rotation::cur()); + // This gate constrains j_1 to be boolean. + let j_1 = meta.query_advice(col_r, Rotation::cur()); + + // j = j_0 + (2) j_1 + let decomposition_check = j - (j_0.clone() + j_1.clone() * two); + + Constraints::with_selector( + q_notecommit_j, + [ + ("bool_check j_0", bool_check(j_0)), + ("bool_check j_1", bool_check(j_1)), + ("decomposition", decomposition_check), + ], + ) + }); + + Self { + q_notecommit_j, + col_l, + col_m, + col_r, + } + } + + #[allow(clippy::type_complexity)] + fn decompose( + chip: SinsemillaChip, + layouter: &mut impl Layouter, + asset: &NonIdentityEccPoint, + ) -> Result< + ( + NoteCommitPiece, + RangeConstrained>, + RangeConstrained>, + ), + Error, + > { + // j_0, j_1 will be boolean-constrained in the gate. + let j_0 = RangeConstrained::bitrange_of(asset.x().value(), 254..255); + let j_1 = RangeConstrained::bitrange_of(asset.y().value(), 0..1); + + let j = MessagePiece::from_subpieces( + chip, + layouter.namespace(|| "j"), + [ + j_0, + j_1, + RangeConstrained::bitrange_of(Value::known(&pallas::Base::zero()), 0..8), + ], + )?; + + Ok((j, j_0, j_1)) + } + + fn assign( + &self, + layouter: &mut impl Layouter, + j: NoteCommitPiece, + j_0: RangeConstrained>, + j_1: RangeConstrained>, + ) -> Result, Error> { + layouter.assign_region( + || "NoteCommit MessagePiece j", + |mut region| { + self.q_notecommit_j.enable(&mut region, 0)?; + + j.inner() + .cell_value() + .copy_advice(|| "j", &mut region, self.col_l, 0)?; + let j_0 = region.assign_advice(|| "j_0", self.col_m, 0, || *j_0.inner())?; + j_1.inner() + .copy_advice(|| "j_1", &mut region, self.col_r, 0)?; + + Ok(j_0) + }, + ) + } +} + /// | A_6 | A_7 | A_8 | A_9 | q_notecommit_g_d | /// ----------------------------------------------------------- /// | x(g_d) | b_0 | a | z13_a | 1 | @@ -811,23 +967,29 @@ impl GdCanonicity { ) } } - -/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d | -/// ------------------------------------------------------------------- -/// | x(pk_d) | b_3 | c | z13_c | 1 | -/// | | d_0 | b3_c_prime | z14_b3_c_prime | 0 | +/// For pk_d +/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d_asset | +/// ------------------------------------------------------------------------- +/// | x(pk_d) | b_3 | c | z13_c | 1 | +/// | | d_0 | b3_c_prime | z14_b3_c_prime | 0 | +/// +/// For asset +/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d_asset | +/// ------------------------------------------------------------------------------ +/// | x(asset) | h_2_zsa | i | z13_i | 1 | +/// | | j_0 | h2_i_prime | z14_h2_i_prime | 0 | /// /// #[derive(Clone, Debug)] -struct PkdCanonicity { - q_notecommit_pk_d: Selector, +struct PkdAssetCanonicity { + q_notecommit_pk_d_asset: Selector, col_l: Column, col_m: Column, col_r: Column, col_z: Column, } -impl PkdCanonicity { +impl PkdAssetCanonicity { #[allow(clippy::too_many_arguments)] fn configure( meta: &mut ConstraintSystem, @@ -840,10 +1002,13 @@ impl PkdCanonicity { two_pow_254: pallas::Base, t_p: Expression, ) -> Self { - let q_notecommit_pk_d = meta.selector(); + let q_notecommit_pk_d_asset = meta.selector(); - meta.create_gate("NoteCommit input pk_d", |meta| { - let q_notecommit_pk_d = meta.query_selector(q_notecommit_pk_d); + meta.create_gate("NoteCommit input pk_d or asset", |meta| { + // The comments and variable names are for `pk_d` + // This gate is also used with `asset`. + // We have just to replace `pk_d`, `b_3`, `c`, `d_0` by `asset`, `h_2_zsa`, `i`, `j_0` + let q_notecommit_pk_d_asset = meta.query_selector(q_notecommit_pk_d_asset); let pkd_x = meta.query_advice(col_l, Rotation::cur()); @@ -876,7 +1041,7 @@ impl PkdCanonicity { .map(move |(name, poly)| (name, d_0.clone() * poly)); Constraints::with_selector( - q_notecommit_pk_d, + q_notecommit_pk_d_asset, iter::empty() .chain(Some(("decomposition", decomposition_check))) .chain(Some(("b3_c_prime_check", b3_c_prime_check))) @@ -885,7 +1050,7 @@ impl PkdCanonicity { }); Self { - q_notecommit_pk_d, + q_notecommit_pk_d_asset, col_l, col_m, col_r, @@ -895,6 +1060,9 @@ impl PkdCanonicity { #[allow(clippy::too_many_arguments)] fn assign( + // This function is used for `pk_d` and `asset`. + // For `pk_d`, inputs are `pk_d`, `b_3`, `c`, `d_0`, `b3_c_prime`, `z13_c`, `z14_b3_c_prime` + // For `asset`, inputs are `asset`, `h_2_zsa`, `i`, `j_0`, `h2_i_prime`, `z13_i`, `z14_h2_i_prime` &self, layouter: &mut impl Layouter, pk_d: &NonIdentityEccPoint, @@ -906,7 +1074,7 @@ impl PkdCanonicity { z14_b3_c_prime: AssignedCell, ) -> Result<(), Error> { layouter.assign_region( - || "NoteCommit input pk_d", + || "NoteCommit input pk_d or asset", |mut region| { pk_d.x() .copy_advice(|| "pkd_x", &mut region, self.col_l, 0)?; @@ -923,7 +1091,7 @@ impl PkdCanonicity { z13_c.copy_advice(|| "z13_c", &mut region, self.col_z, 0)?; z14_b3_c_prime.copy_advice(|| "z14_b3_c_prime", &mut region, self.col_z, 1)?; - self.q_notecommit_pk_d.enable(&mut region, 0) + self.q_notecommit_pk_d_asset.enable(&mut region, 0) }, ) } @@ -1418,8 +1586,9 @@ pub struct NoteCommitConfig { e: DecomposeE, g: DecomposeG, h: DecomposeH, + j: DecomposeJ, g_d: GdCanonicity, - pk_d: PkdCanonicity, + pk_d_asset: PkdAssetCanonicity, value: ValueCanonicity, rho: RhoCanonicity, psi: PsiCanonicity, @@ -1474,7 +1643,8 @@ impl NoteCommitChip { let d = DecomposeD::configure(meta, col_l, col_m, col_r, two, two_pow_2, two_pow_10); let e = DecomposeE::configure(meta, col_l, col_m, col_r, two_pow_6); let g = DecomposeG::configure(meta, col_l, col_m, two, two_pow_10); - let h = DecomposeH::configure(meta, col_l, col_m, col_r, two_pow_5); + let h = DecomposeH::configure(meta, col_l, col_m, col_r, two_pow_5, two_pow_6); + let j = DecomposeJ::configure(meta, col_l, col_m, col_r, two); let g_d = GdCanonicity::configure( meta, @@ -1488,7 +1658,7 @@ impl NoteCommitChip { t_p.clone(), ); - let pk_d = PkdCanonicity::configure( + let pk_d_asset = PkdAssetCanonicity::configure( meta, col_l, col_m, @@ -1545,8 +1715,9 @@ impl NoteCommitChip { e, g, h, + j, g_d, - pk_d, + pk_d_asset, value, rho, psi, @@ -1574,12 +1745,15 @@ pub(in crate::circuit) mod gadgets { chip: SinsemillaChip, ecc_chip: EccChip, note_commit_chip: NoteCommitChip, + mux_chip: MuxChip, g_d: &NonIdentityEccPoint, pk_d: &NonIdentityEccPoint, value: AssignedCell, rho: AssignedCell, psi: AssignedCell, + asset: &NonIdentityEccPoint, rcm: ScalarFixed>, + is_native_asset: AssignedCell, ) -> Result>, Error> { let lookup_config = chip.config().lookup_config(); @@ -1623,10 +1797,22 @@ pub(in crate::circuit) mod gadgets { let (g, g_0, g_1) = DecomposeG::decompose(&lookup_config, chip.clone(), &mut layouter, &rho, &psi)?; - // h = h_0 || h_1 || h_2 + // h_zec = h_0 || h_1 || h_2_zec // = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits - let (h, h_0, h_1) = - DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi)?; + // h_zsa = h_0 || h_1 || h_2_zsa + // = (bits 249..=253 of psi) || (bit 254 of psi) || (bits 0..=3 of x(asset)) + let (h_zec, h_zsa, h_0, h_1, h_2_zsa) = + DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi, asset)?; + + // i = bits 4..=253 of asset + let i = MessagePiece::from_subpieces( + chip.clone(), + layouter.namespace(|| "i"), + [RangeConstrained::bitrange_of(asset.x().value(), 4..254)], + )?; + + // j = j_0 || j_1 || j_2 = (bit 254 of x(asset)) || (ỹ bit of asset) || 8 zero bits + let (j, j_0, j_1) = DecomposeJ::decompose(chip.clone(), &mut layouter, asset)?; // Check decomposition of `y(g_d)`. let b_2 = y_canonicity( @@ -1644,6 +1830,14 @@ pub(in crate::circuit) mod gadgets { pk_d.y(), d_1, )?; + // Check decomposition of `y(asset)`. + let j_1 = y_canonicity( + &lookup_config, + ¬e_commit_chip.config.y_canon, + layouter.namespace(|| "y(asset) decomposition"), + asset.y(), + j_1, + )?; // cm = NoteCommit^Orchard_rcm(g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi) // @@ -1654,7 +1848,21 @@ pub(in crate::circuit) mod gadgets { // https://p.z.cash/ZKS:action-cm-old-integrity?partial // https://p.z.cash/ZKS:action-cmx-new-integrity?partial let (cm, zs) = { - let message = Message::from_pieces( + let message_zec = Message::from_pieces( + chip.clone(), + vec![ + a.clone(), + b.clone(), + c.clone(), + d.clone(), + e.clone(), + f.clone(), + g.clone(), + h_zec.clone(), + ], + ); + + let message_zsa = Message::from_pieces( chip.clone(), vec![ a.clone(), @@ -1664,18 +1872,61 @@ pub(in crate::circuit) mod gadgets { e.clone(), f.clone(), g.clone(), - h.clone(), + h_zsa.clone(), + i.clone(), + j.clone(), ], ); - let domain = CommitDomain::new(chip, ecc_chip, &OrchardCommitDomains::NoteCommit); - domain.commit( - layouter.namespace(|| "Process NoteCommit inputs"), - message, - rcm, - )? + + let zec_domain = CommitDomain::new( + chip.clone(), + ecc_chip.clone(), + &OrchardCommitDomains::NoteCommit, + ); + let zsa_domain = + CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteZsaCommit); + + // We evaluate `hash_point_zec=hash(Q_ZEC, message_zec)` and `hash_point_zsa(Q_ZSA, message_zsa) + // and then perform a MUX to select the desired hash_point + // TODO: We can optimize the evaluation of hash_point by mutualizing a portion of the + // hash evaluation process between hash_point_zec and hash_point_zsa. + // 1. common_bits = a || b || c || d || e || f || g + // 2. suffix_zec = h_zec + // 3. suffix_zsa = h_zsa || i || j + // 4. Q = if (is_native_asset == 0) {Q_ZSA} else {Q_ZEC} + // 5. hash_prefix = hash(Q, common_bits) // this part is mutualized + // 6. hash_zec = hash(hash_prefix, suffix_zec) + // 7. hash_zsa = hash(hash_prefix, suffix_zsa) + // 8. hash_point = if (is_native_asset == 0) {hash_zsa} else {hash_zec} + let (hash_point_zec, _zs_zec) = + zec_domain.hash(layouter.namespace(|| "hash ZEC note"), message_zec)?; + let (hash_point_zsa, zs_zsa) = + zsa_domain.hash(layouter.namespace(|| "hash ZSA note"), message_zsa)?; + + // Perform a MUX to select the desired hash point + // hash_point = hash_zec if is_native_asset is true + // hash_point = hash_zsa if is_native_asset is false + let hash_point = Point::from_inner( + ecc_chip, + mux_chip.mux( + layouter.namespace(|| "mux on hash point"), + &is_native_asset, + &(hash_point_zsa.inner().clone().into()), + &(hash_point_zec.inner().clone().into()), + )?, + ); + + // To evaluate the blinding factor, we could use either zec_domain or zsa_domain + // because they have both the same `R` constant. + let blinding_factor = + zec_domain.blinding_factor(layouter.namespace(|| "[r] R"), rcm)?; + let commitment = + hash_point.add(layouter.namespace(|| "M + [r] R"), &blinding_factor)?; + + (commitment, zs_zsa) }; - // `CommitDomain::commit` returns the running sum for each `MessagePiece`. Grab + // `CommitDomain::hash` returns the running sum for each `MessagePiece`. Grab // the outputs that we will need for canonicity checks. let z13_a = zs[0][13].clone(); let z13_c = zs[2][13].clone(); @@ -1684,6 +1935,7 @@ pub(in crate::circuit) mod gadgets { let z1_g = zs[6][1].clone(); let g_2 = z1_g.clone(); let z13_g = zs[6][13].clone(); + let z13_i = zs[8][13].clone(); // Witness and constrain the bounds we need to ensure canonicity. let (a_prime, z13_a_prime) = canon_bitshift_130( @@ -1692,13 +1944,20 @@ pub(in crate::circuit) mod gadgets { a.inner().cell_value(), )?; - let (b3_c_prime, z14_b3_c_prime) = pkd_x_canonicity( + let (b3_c_prime, z14_b3_c_prime) = pkd_asset_x_canonicity( &lookup_config, layouter.namespace(|| "x(pk_d) canonicity"), b_3.clone(), c.inner().cell_value(), )?; + let (h2_i_prime, z14_h2_i_prime) = pkd_asset_x_canonicity( + &lookup_config, + layouter.namespace(|| "x(asset) canonicity"), + h_2_zsa.clone(), + i.inner().cell_value(), + )?; + let (e1_f_prime, z14_e1_f_prime) = rho_canonicity( &lookup_config, layouter.namespace(|| "rho canonicity"), @@ -1730,12 +1989,21 @@ pub(in crate::circuit) mod gadgets { .g .assign(&mut layouter, g, g_0, g_1.clone(), z1_g.clone())?; - let h_1 = cfg.h.assign(&mut layouter, h, h_0.clone(), h_1)?; + let h_1 = cfg.h.assign( + &mut layouter, + h_zec, + h_zsa, + h_0.clone(), + h_1, + h_2_zsa.clone(), + )?; + + let j_0 = cfg.j.assign(&mut layouter, j, j_0, j_1)?; cfg.g_d .assign(&mut layouter, g_d, a, b_0, b_1, a_prime, z13_a, z13_a_prime)?; - cfg.pk_d.assign( + cfg.pk_d_asset.assign( &mut layouter, pk_d, b_3, @@ -1746,6 +2014,17 @@ pub(in crate::circuit) mod gadgets { z14_b3_c_prime, )?; + cfg.pk_d_asset.assign( + &mut layouter, + asset, + h_2_zsa, + i, + j_0, + h2_i_prime, + z13_i, + z14_h2_i_prime, + )?; + cfg.value.assign(&mut layouter, value, d_2, z1_d, e_0)?; cfg.rho.assign( @@ -1810,15 +2089,16 @@ pub(in crate::circuit) mod gadgets { Ok((a_prime, zs[13].clone())) } - /// Check canonicity of `x(pk_d)` encoding. + /// Check canonicity of `x(pk_d)` and `x(asset)` encoding. /// /// [Specification](https://p.z.cash/orchard-0.1:note-commit-canonicity-pk_d?partial). - fn pkd_x_canonicity( + fn pkd_asset_x_canonicity( lookup_config: &LookupRangeCheckConfig, mut layouter: impl Layouter, b_3: RangeConstrained>, c: AssignedCell, ) -> Result { + // Example for `x(pk_d)`: // `x(pk_d)` = `b_3 (4 bits) || c (250 bits) || d_0 (1 bit)` // - d_0 = 1 => b_3 + 2^4 c < t_P // - 0 ≤ b_3 + 2^4 c < 2^134 @@ -1828,6 +2108,7 @@ pub(in crate::circuit) mod gadgets { // - z_13 of SinsemillaHash(c) == 0 constrains bits 4..=253 of pkd_x // to 130 bits. z13_c is directly checked in the gate. // - 0 ≤ b_3 + 2^4 c + 2^140 - t_P < 2^140 (14 ten-bit lookups) + // For `x(asset)`, we have to replace `pk_d`, `b_3`, `c`, `d_0` by `asset`, `h_2_zsa`, `i`, `j_0` // Decompose the low 140 bits of b3_c_prime = b_3 + 2^4 c + 2^140 - t_P, // and output the running sum at the end of it. @@ -2013,18 +2294,17 @@ pub(in crate::circuit) mod gadgets { #[cfg(test)] mod tests { - use core::iter; - use super::NoteCommitConfig; use crate::{ circuit::{ - gadget::assign_free_advice, + gadget::{ + assign_free_advice, assign_is_native_asset, + mux_chip::{MuxChip, MuxConfig}, + }, note_commit::{gadgets, NoteCommitChip}, }, - constants::{ - fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, OrchardCommitDomains, OrchardFixedBases, - OrchardHashDomains, L_ORCHARD_BASE, L_VALUE, T_Q, - }, + constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_Q}, + note::{commitment::NoteCommitTrapdoor, AssetBase, NoteCommitment}, value::NoteValue, }; use halo2_gadgets::{ @@ -2033,18 +2313,17 @@ mod tests { NonIdentityPoint, ScalarFixed, }, sinsemilla::chip::SinsemillaChip, - sinsemilla::primitives::CommitDomain, utilities::lookup_range_check::LookupRangeCheckConfig, }; - use ff::{Field, PrimeField, PrimeFieldBits}; - use group::Curve; + use ff::{Field, PrimeField}; + use group::{Curve, Group, GroupEncoding}; use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, plonk::{Circuit, ConstraintSystem, Error}, }; - use pasta_curves::{arithmetic::CurveAffine, pallas}; + use pasta_curves::{arithmetic::CurveAffine, pallas, EpAffine}; use rand::{rngs::OsRng, RngCore}; @@ -2052,16 +2331,15 @@ mod tests { fn note_commit() { #[derive(Default)] struct MyCircuit { - gd_x: Value, - gd_y_lsb: Value, - pkd_x: Value, - pkd_y_lsb: Value, + g_d: Value, + pk_d: Value, rho: Value, psi: Value, + asset: Value, } impl Circuit for MyCircuit { - type Config = (NoteCommitConfig, EccConfig); + type Config = (NoteCommitConfig, EccConfig, MuxConfig); type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -2130,7 +2408,10 @@ mod tests { range_check, ); - (note_commit_config, ecc_config) + let mux_config = + MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + + (note_commit_config, ecc_config, mux_config) } fn synthesize( @@ -2138,7 +2419,7 @@ mod tests { config: Self::Config, mut layouter: impl Layouter, ) -> Result<(), Error> { - let (note_commit_config, ecc_config) = config; + let (note_commit_config, ecc_config, mux_config) = config; // Load the Sinsemilla generator lookup table used by the whole circuit. SinsemillaChip::< @@ -2157,41 +2438,22 @@ mod tests { // Construct a NoteCommit chip let note_commit_chip = NoteCommitChip::construct(note_commit_config.clone()); + // Construct a Mux chip + let mux_chip = MuxChip::construct(mux_config); + // Witness g_d - let g_d = { - let g_d = self.gd_x.zip(self.gd_y_lsb).map(|(x, y_lsb)| { - // Calculate y = (x^3 + 5).sqrt() - let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap(); - if bool::from(y.is_odd() ^ y_lsb.is_odd()) { - y = -y; - } - pallas::Affine::from_xy(x, y).unwrap() - }); - - NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness g_d"), - g_d, - )? - }; + let g_d = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness g_d"), + self.g_d, + )?; // Witness pk_d - let pk_d = { - let pk_d = self.pkd_x.zip(self.pkd_y_lsb).map(|(x, y_lsb)| { - // Calculate y = (x^3 + 5).sqrt() - let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap(); - if bool::from(y.is_odd() ^ y_lsb.is_odd()) { - y = -y; - } - pallas::Affine::from_xy(x, y).unwrap() - }); - - NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness pk_d"), - pk_d, - )? - }; + let pk_d = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness pk_d"), + self.pk_d, + )?; // Witness a random non-negative u64 note value // A note value cannot be negative. @@ -2228,54 +2490,52 @@ mod tests { Value::known(rcm), )?; + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + let is_native_asset = assign_is_native_asset( + layouter.namespace(|| "witness is_native_asset"), + note_commit_config.advices[0], + self.asset, + )?; let cm = gadgets::note_commit( layouter.namespace(|| "Hash NoteCommit pieces"), sinsemilla_chip, ecc_chip.clone(), note_commit_chip, + mux_chip, g_d.inner(), pk_d.inner(), value_var, rho, psi, + asset.inner(), rcm_gadget, + is_native_asset, )?; let expected_cm = { - let domain = CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); // Hash g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi - let lsb = |y_lsb: pallas::Base| y_lsb == pallas::Base::one(); let point = self - .gd_x - .zip(self.gd_y_lsb) - .zip(self.pkd_x.zip(self.pkd_y_lsb)) + .g_d + .zip(self.pk_d) .zip(self.rho.zip(self.psi)) - .map(|(((gd_x, gd_y_lsb), (pkd_x, pkd_y_lsb)), (rho, psi))| { - domain - .commit( - iter::empty() - .chain( - gd_x.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ) - .chain(Some(lsb(gd_y_lsb))) - .chain( - pkd_x - .to_le_bits() - .iter() - .by_vals() - .take(L_ORCHARD_BASE), - ) - .chain(Some(lsb(pkd_y_lsb))) - .chain(value.to_le_bits().iter().by_vals().take(L_VALUE)) - .chain( - rho.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ) - .chain( - psi.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ), - &rcm, - ) - .unwrap() - .to_affine() + .zip(self.asset) + .map(|(((g_d, pk_d), (rho, psi)), asset)| { + NoteCommitment::derive( + g_d.to_bytes(), + pk_d.to_bytes(), + value, + asset, + rho, + psi, + NoteCommitTrapdoor(rcm), + ) + .unwrap() + .inner() + .to_affine() }); NonIdentityPoint::new(ecc_chip, layouter.namespace(|| "witness cm"), point)? }; @@ -2283,74 +2543,132 @@ mod tests { } } + fn affine_point_from_coordinates(x_coord: pallas::Base, y_lsb: pallas::Base) -> EpAffine { + // Calculate y = (x^3 + 5).sqrt() + let mut y = (x_coord.square() * x_coord + pallas::Affine::b()) + .sqrt() + .unwrap(); + if bool::from(y.is_odd() ^ y_lsb.is_odd()) { + y = -y; + } + pallas::Affine::from_xy(x_coord, y).unwrap() + } + let two_pow_254 = pallas::Base::from_u128(1 << 127).square(); + let mut rng = OsRng; + let random_asset = AssetBase::random(&mut rng); + // Test different values of `ak`, `nk` - let circuits = [ + let mut circuits = vec![]; + for asset in [random_asset, AssetBase::native()] { // `gd_x` = -1, `pkd_x` = -1 (these have to be x-coordinates of curve points) // `rho` = 0, `psi` = 0 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(pallas::Base::zero()), psi: Value::known(pallas::Base::zero()), - }, + asset: Value::known(asset), + }); // `rho` = T_Q - 1, `psi` = T_Q - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(T_Q - 1)), psi: Value::known(pallas::Base::from_u128(T_Q - 1)), - }, + asset: Value::known(asset), + }); // `rho` = T_Q, `psi` = T_Q - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(T_Q)), psi: Value::known(pallas::Base::from_u128(T_Q)), - }, + asset: Value::known(asset), + }); // `rho` = 2^127 - 1, `psi` = 2^127 - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(pallas::Base::from_u128((1 << 127) - 1)), psi: Value::known(pallas::Base::from_u128((1 << 127) - 1)), - }, + asset: Value::known(asset), + }); // `rho` = 2^127, `psi` = 2^127 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(1 << 127)), psi: Value::known(pallas::Base::from_u128(1 << 127)), - }, + asset: Value::known(asset), + }); // `rho` = 2^254 - 1, `psi` = 2^254 - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(two_pow_254 - pallas::Base::one()), psi: Value::known(two_pow_254 - pallas::Base::one()), - }, + asset: Value::known(asset), + }); // `rho` = 2^254, `psi` = 2^254 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(two_pow_254), psi: Value::known(two_pow_254), - }, - ]; + asset: Value::known(asset), + }); + // Random values + circuits.push(MyCircuit { + g_d: Value::known(pallas::Point::random(rng).to_affine()), + pk_d: Value::known(pallas::Point::random(rng).to_affine()), + rho: Value::known(pallas::Base::random(&mut rng)), + psi: Value::known(pallas::Base::random(&mut rng)), + asset: Value::known(asset), + }); + } for circuit in circuits.iter() { let prover = MockProver::::run(11, circuit, vec![]).unwrap(); diff --git a/src/circuit/value_commit_orchard.rs b/src/circuit/value_commit_orchard.rs index 078e9378f..4e4dfa36d 100644 --- a/src/circuit/value_commit_orchard.rs +++ b/src/circuit/value_commit_orchard.rs @@ -95,7 +95,6 @@ mod tests { circuit::gadget::{assign_free_advice, value_commit_orchard}, circuit::K, constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}, - keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}, note::AssetBase, value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, }; @@ -299,13 +298,7 @@ mod tests { let mut circuits = vec![]; let mut instances = vec![]; let native_asset = AssetBase::native(); - let random_asset = { - let sk = SpendingKey::random(&mut rng); - let isk = IssuanceAuthorizingKey::from(&sk); - let ik = IssuanceValidatingKey::from(&isk); - let asset_descr = "zsa_asset"; - AssetBase::derive(&ik, asset_descr) - }; + let random_asset = AssetBase::random(&mut rng); for split_flag in [false, true] { for asset in [native_asset, random_asset] { let v_old = NoteValue::from_raw(rng.next_u64()); diff --git a/src/circuit_description b/src/circuit_description index 212da733f..247c89889 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -2,46 +2,30 @@ PinnedVerificationKey { base_modulus: "0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001", scalar_modulus: "0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001", domain: PinnedEvaluationDomain { - k: 11, - extended_k: 14, - omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, + k: 12, + extended_k: 15, + omega: 0x028961bbd9c63b7bd7c75f72e02a9727d14d99e7985184470d34cd1b8ef03001, }, cs: PinnedConstraintSystem { num_fixed_columns: 30, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 56, + num_selectors: 59, gates: [ Product( Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -56,7 +40,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -71,7 +55,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -112,32 +96,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -152,7 +120,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -167,7 +135,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -239,32 +207,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -279,7 +231,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -294,7 +246,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -339,32 +291,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -379,7 +315,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -394,7 +330,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -435,32 +371,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -475,7 +395,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -490,7 +410,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -531,32 +451,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -571,7 +475,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -586,7 +490,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -638,32 +542,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -678,7 +566,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -693,7 +581,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -706,31 +594,27 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + ), ), ), ), @@ -738,29 +622,13 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, @@ -778,7 +646,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -793,7 +661,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -806,34 +674,27 @@ PinnedVerificationKey { ), ), ), - Sum( - Product( - Scaled( - Advice { - query_index: 12, - column_index: 9, - rotation: Rotation( - -1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + Product( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, ), + }, + Sum( Advice { - query_index: 11, - column_index: 9, + query_index: 12, + column_index: 2, rotation: Rotation( 1, ), }, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Negated( + Constant( + 0x2f70597a8e3d0f42f7a86a704f9bb232fe04a37f2b5a7c8c2aa7bd6e3af94367, ), - }, + ), ), ), ), @@ -841,48 +702,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -897,7 +726,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -910,53 +739,79 @@ PinnedVerificationKey { ), ), ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( Advice { - query_index: 0, - column_index: 0, + query_index: 11, + column_index: 1, rotation: Rotation( - 0, + 1, ), }, - ), - Sum( Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Constant( + 0x2d0e5169311919af1e917f63136d6c421d9ea766a7ffe3dba413c47eaf5af28e, + ), + ), + ), + ), + ), + Product( + Product( + Product( Product( - Advice { - query_index: 1, - column_index: 1, + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, ), - }, - ), - Negated( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 0, - column_index: 0, + Negated( + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, ), - Advice { - query_index: 0, - column_index: 0, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -964,145 +819,98 @@ PinnedVerificationKey { ), ), ), - Negated( + Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, ), ), ), - ), - Product( Product( Product( - Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + ), + ), + Sum( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, + Sum( + Advice { + query_index: 12, + column_index: 2, rotation: Rotation( - 0, + 1, ), }, - Sum( + Negated( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, + 0x2f70597a8e3d0f42f7a86a704f9bb232fe04a37f2b5a7c8c2aa7bd6e3af94367, ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, ), - ), + }, ), - Sum( + Negated( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), - Sum( Sum( Product( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Constant( + 0x2d0e5169311919af1e917f63136d6c421d9ea766a7ffe3dba413c47eaf5af28e, + ), ), - }, + ), Advice { - query_index: 1, - column_index: 1, + query_index: 15, + column_index: 5, rotation: Rotation( - 0, + 1, ), }, ), Negated( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), ), ), - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - ), ), ), Product( @@ -1110,20 +918,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1137,8 +945,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1152,8 +960,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1163,54 +971,29 @@ PinnedVerificationKey { ), Sum( Sum( - Product( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, ), Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -1219,8 +1002,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1231,8 +1014,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1242,12 +1025,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1261,8 +1044,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1272,44 +1055,70 @@ PinnedVerificationKey { ), Sum( Product( - Product( - Sum( - Sum( - Advice { - query_index: 13, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, + Scaled( + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + -1, ), - Advice { - query_index: 0, - column_index: 0, + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), ), Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), Negated( - Advice { - query_index: 2, - column_index: 2, + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1318,17 +1127,67 @@ PinnedVerificationKey { ), ), Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Sum( + Product( Advice { - query_index: 0, - column_index: 0, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), Advice { - query_index: 2, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), @@ -1337,45 +1196,128 @@ PinnedVerificationKey { ), ), Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), + ), + ), + Product( + Product( + Product( Product( - Sum( - Advice { - query_index: 1, - column_index: 1, + Product( + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), Negated( - Advice { - query_index: 3, - column_index: 3, + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, ), ), - Sum( - Advice { - query_index: 1, - column_index: 1, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), }, - Negated( + ), + ), + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Sum( + Product( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Product( + Product( Advice { - query_index: 3, - column_index: 3, + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), ), ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), ), ), Product( @@ -1391,7 +1333,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -1435,82 +1377,56 @@ PinnedVerificationKey { ), ), Sum( - Product( - Sum( - Advice { - query_index: 14, - column_index: 3, - rotation: Rotation( - 1, - ), - }, + Sum( + Product( Advice { - query_index: 3, - column_index: 3, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - ), - Sum( Advice { - query_index: 0, - column_index: 0, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - Negated( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - ), ), - ), - Negated( - Product( - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Negated( + Negated( + Product( + Product( Advice { - query_index: 3, - column_index: 3, + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, ), - ), - Sum( Advice { - query_index: 2, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, - Negated( - Advice { - query_index: 13, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - ), ), ), ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), ), ), Product( @@ -1541,7 +1457,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -1569,16 +1485,54 @@ PinnedVerificationKey { ), ), ), - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, + Sum( + Product( + Product( + Sum( + Sum( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), - }, - Negated( + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( Advice { query_index: 0, column_index: 0, @@ -1586,49 +1540,49 @@ PinnedVerificationKey { 0, ), }, + Negated( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + ), ), ), - Sum( + Negated( Product( Sum( Advice { - query_index: 2, - column_index: 2, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, ), ), - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), - Negated( Sum( Advice { - query_index: 3, - column_index: 3, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), @@ -1667,7 +1621,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -1695,34 +1649,36 @@ PinnedVerificationKey { ), ), ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Sum( + Product( + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, ), - Negated( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, ), + }, + Negated( Advice { - query_index: 5, - column_index: 5, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), @@ -1730,12 +1686,9 @@ PinnedVerificationKey { ), ), ), - Sum( + Negated( Product( - Product( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), + Sum( Advice { query_index: 1, column_index: 1, @@ -1743,33 +1696,30 @@ PinnedVerificationKey { 0, ), }, - ), - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Product( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Product( + Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, + ), + ), + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 12, + column_index: 2, rotation: Rotation( - 0, + 1, ), }, ), @@ -1835,61 +1785,34 @@ PinnedVerificationKey { ), ), Product( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - ), - Sum( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { - query_index: 2, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, - Negated( + ), + ), + Sum( + Product( + Sum( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, - ), - ), - ), - Sum( - Sum( - Sum( - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), Negated( Advice { query_index: 0, @@ -1900,24 +1823,33 @@ PinnedVerificationKey { }, ), ), - Negated( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Sum( Advice { - query_index: 2, - column_index: 2, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, - ), - ), - Negated( - Advice { - query_index: 13, - column_index: 2, - rotation: Rotation( - 1, + Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ), - }, + ), ), ), ), @@ -1979,72 +1911,46 @@ PinnedVerificationKey { ), ), Product( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - ), - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), Sum( - Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, Sum( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, Negated( Advice { - query_index: 13, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( - 1, + 0, ), }, ), ), + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, ), - Negated( + ), + ), + Sum( + Product( + Product( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), Advice { query_index: 1, column_index: 1, @@ -2053,16 +1959,37 @@ PinnedVerificationKey { ), }, ), - ), - Negated( Advice { - query_index: 14, - column_index: 3, + query_index: 4, + column_index: 4, rotation: Rotation( - 1, + 0, ), }, ), + Negated( + Product( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), ), ), ), @@ -2142,19 +2069,21 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), ), Sum( @@ -2198,7 +2127,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -2284,19 +2213,21 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), ), Sum( @@ -2319,7 +2250,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -2340,7 +2271,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -2407,22 +2338,125 @@ PinnedVerificationKey { ), ), Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, ), - Negated( - Product( + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Sum( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, - Advice { - query_index: 6, - column_index: 6, + ), + ), + Negated( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -2431,14 +2465,30 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 13, - column_index: 2, - rotation: Rotation( - 1, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, Advice { query_index: 2, column_index: 2, @@ -2447,6 +2497,71 @@ PinnedVerificationKey { ), }, ), + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), ), ), ), @@ -2532,16 +2647,16 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 14, - column_index: 3, + query_index: 12, + column_index: 2, rotation: Rotation( 1, ), }, Negated( Advice { - query_index: 3, - column_index: 3, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), @@ -2614,15 +2729,15 @@ PinnedVerificationKey { Negated( Product( Advice { - query_index: 2, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, Advice { - query_index: 7, - column_index: 7, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), @@ -2633,15 +2748,15 @@ PinnedVerificationKey { Sum( Advice { query_index: 13, - column_index: 2, + column_index: 3, rotation: Rotation( 1, ), }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), @@ -2732,16 +2847,16 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 14, - column_index: 3, + query_index: 12, + column_index: 2, rotation: Rotation( 1, ), }, Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), @@ -2808,17 +2923,117 @@ PinnedVerificationKey { ), Product( Sum( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, ), - Negated( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( + ), + ), + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( 0, ), }, @@ -2871,7 +3086,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -3000,7 +3215,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3012,37 +3227,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3052,12 +3251,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3067,12 +3266,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3093,14 +3292,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -3109,7 +3308,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3120,14 +3319,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -3136,7 +3335,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3166,21 +3365,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3190,12 +3421,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3205,12 +3436,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3241,51 +3472,83 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Product( + Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, ), ), ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3303,7 +3566,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -3316,21 +3579,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3340,12 +3635,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3355,12 +3650,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3380,7 +3675,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -3406,7 +3701,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -3424,21 +3719,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3448,12 +3775,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3463,12 +3790,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3592,7 +3919,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -3624,21 +3951,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3648,12 +4007,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3663,12 +4022,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3697,7 +4056,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3761,36 +4120,68 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Product( + Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), }, - ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3800,12 +4191,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3833,7 +4224,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3920,14 +4311,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -3936,7 +4327,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3947,14 +4338,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, ), }, Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -3963,7 +4354,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -3994,16 +4385,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -4018,7 +4425,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -4033,7 +4440,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4048,7 +4455,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -4073,7 +4480,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4099,7 +4506,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4118,16 +4525,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -4142,7 +4565,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -4157,7 +4580,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4172,7 +4595,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -4301,7 +4724,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4334,16 +4757,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -4358,7 +4797,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -4373,7 +4812,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4388,7 +4827,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -4422,7 +4861,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -4487,16 +4926,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -4511,7 +4966,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -4526,7 +4981,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4541,7 +4996,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -4574,7 +5029,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -4658,7 +5113,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -4672,16 +5127,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -4696,7 +5167,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -4711,7 +5182,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4726,7 +5197,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -4759,7 +5230,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -4994,7 +5465,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -5682,7 +6153,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -5749,16 +6220,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -5773,7 +6260,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -5788,7 +6275,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -5803,7 +6290,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -5873,16 +6360,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -5897,7 +6400,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -5912,7 +6415,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -5927,7 +6430,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -6089,16 +6592,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -6113,7 +6632,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -6128,7 +6647,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -6143,7 +6662,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -6242,16 +6761,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -6266,7 +6801,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -6281,7 +6816,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -6296,7 +6831,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -6427,16 +6962,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -6451,7 +7002,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -6466,7 +7017,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -6481,7 +7032,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -6497,7 +7048,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -6509,7 +7060,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -6525,7 +7076,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -6537,7 +7088,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -6555,16 +7106,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -6579,7 +7146,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -6594,7 +7161,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -6609,7 +7176,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -6626,7 +7193,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -6638,7 +7205,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -6674,7 +7241,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -6686,7 +7253,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 12, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -6722,8 +7289,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6734,8 +7301,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6745,12 +7312,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6760,12 +7327,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6775,12 +7342,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6832,8 +7399,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6844,8 +7411,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6855,12 +7422,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6870,12 +7437,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6885,12 +7452,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6930,8 +7497,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6942,8 +7509,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6953,12 +7520,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6968,12 +7535,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6983,12 +7550,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7026,8 +7593,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7038,8 +7605,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7049,12 +7616,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7064,12 +7631,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7079,12 +7646,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7115,8 +7682,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7127,8 +7694,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7138,12 +7705,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7153,12 +7720,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7168,12 +7735,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7235,21 +7802,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7263,8 +7846,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7278,8 +7861,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7293,8 +7876,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7305,7 +7888,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7331,7 +7914,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7359,21 +7942,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7387,8 +7986,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7402,8 +8001,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7417,8 +8016,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7430,7 +8029,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7465,7 +8064,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7512,21 +8111,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7540,8 +8155,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7555,8 +8170,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7570,8 +8185,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -7583,7 +8198,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7618,7 +8233,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7648,7 +8263,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -7684,7 +8299,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7710,7 +8325,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7739,7 +8354,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7768,7 +8383,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7797,7 +8412,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7826,7 +8441,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7855,7 +8470,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7884,7 +8499,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7947,7 +8562,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -7984,7 +8599,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8006,7 +8621,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8044,7 +8659,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8066,7 +8681,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8088,7 +8703,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8127,7 +8742,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8149,7 +8764,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8171,7 +8786,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8193,7 +8808,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8233,7 +8848,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8255,7 +8870,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8277,7 +8892,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8299,7 +8914,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8321,7 +8936,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8362,7 +8977,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8384,7 +8999,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8406,7 +9021,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8428,7 +9043,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8450,7 +9065,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8472,7 +9087,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8514,7 +9129,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8536,7 +9151,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8558,7 +9173,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8580,7 +9195,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8602,7 +9217,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8624,7 +9239,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -8646,7 +9261,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -13272,14 +13887,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, ), }, Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -13299,14 +13914,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, ), }, Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -13325,7 +13940,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -13366,7 +13981,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -13755,7 +14370,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, @@ -13842,7 +14457,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -13854,7 +14469,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -13936,7 +14551,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -14022,7 +14637,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -14031,7 +14646,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -14039,7 +14654,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 14, + query_index: 13, column_index: 3, rotation: Rotation( 1, @@ -14250,7 +14865,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -14336,7 +14951,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -14448,113 +15063,1235 @@ PinnedVerificationKey { ), ), ), - ), - Product( - Sum( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, - ), - }, + ), + Product( + Sum( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + ), + ), + Negated( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), + ), + ), + ), + Product( + Scaled( + Product( + Fixed { + query_index: 13, + column_index: 13, + rotation: Rotation( + 0, + ), + }, + Sum( + Fixed { + query_index: 13, + column_index: 13, + rotation: Rotation( + 0, + ), + }, + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + ), + ), + ), + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + Negated( + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Scaled( + Sum( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + 0x0001000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - Sum( - Advice { - query_index: 16, - column_index: 5, + Negated( + Fixed { + query_index: 25, + column_index: 25, rotation: Rotation( - 1, + 0, ), }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - Negated( - Advice { - query_index: 16, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - ), - ), - Negated( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), ), ), ), - ), - Product( - Scaled( - Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( Fixed { - query_index: 13, - column_index: 13, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), }, - Sum( - Fixed { - query_index: 13, - column_index: 13, - rotation: Rotation( - 0, - ), - }, - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - ), - ), ), - 0x0000000000000000000000000000000000000000000000000000000000000002, ), - Advice { - query_index: 19, - column_index: 8, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, rotation: Rotation( - 1, + 0, ), }, ), ), ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 25, + column_index: 25, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + ), + ), ), ), Product( @@ -14587,7 +16324,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -14602,7 +16339,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14647,45 +16384,34 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, Negated( Sum( - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Sum( Advice { - query_index: 6, - column_index: 6, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), + Scaled( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), + ), + Scaled( Advice { query_index: 5, column_index: 5, @@ -14693,6 +16419,7 @@ PinnedVerificationKey { 0, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), ), ), @@ -14728,7 +16455,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -14743,7 +16470,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14788,52 +16515,30 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 8, - column_index: 8, + query_index: 12, + column_index: 2, rotation: Rotation( - 0, - ), - }, - Negated( - Sum( - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), + 1, + ), + }, + Negated( + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, ), + }, + Scaled( Advice { - query_index: 6, - column_index: 6, + query_index: 14, + column_index: 4, rotation: Rotation( - 0, + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), ), @@ -14869,7 +16574,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -14884,7 +16589,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14927,28 +16632,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Sum( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + 0x0400000000000000000000000000000000000000000000000000000000000000, + ), ), - Negated( + Scaled( Advice { - query_index: 9, - column_index: 9, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, + 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -14996,7 +16720,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15041,30 +16765,52 @@ PinnedVerificationKey { ), Sum( Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, + Sum( + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), ), - }, - Negated( Scaled( Advice { - query_index: 16, - column_index: 5, + query_index: 13, + column_index: 3, rotation: Rotation( 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + 0x0020000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), ), Negated( Advice { - query_index: 11, - column_index: 9, + query_index: 10, + column_index: 0, rotation: Rotation( 1, ), @@ -15117,7 +16863,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15160,61 +16906,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Advice { - query_index: 16, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Scaled( - Sum( - Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Negated( - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), - ), - 0x0001000000000000000000000000000000000000000000000000000000000000, + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, ), - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), + }, + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, ), ), Product( @@ -15262,7 +16968,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15305,35 +17011,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Scaled( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, ), - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), + }, + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), Product( @@ -15381,7 +17073,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15425,33 +17117,33 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - Negated( + Sum( Sum( Advice { - query_index: 18, - column_index: 7, + query_index: 1, + column_index: 1, rotation: Rotation( - 1, + 0, ), }, - Scaled( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, ), ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), + ), + ), + Negated( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -15551,20 +17243,13 @@ PinnedVerificationKey { 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -15657,26 +17342,19 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 15, + query_index: 14, column_index: 4, rotation: Rotation( 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 15, - column_index: 4, - rotation: Rotation( - 1, - ), - }, + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -15767,47 +17445,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 2, - column_index: 2, + query_index: 14, + column_index: 4, rotation: Rotation( - 0, + 1, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Scaled( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -15899,34 +17551,46 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 13, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - Negated( + Sum( Sum( - Advice { - query_index: 14, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - Scaled( + Sum( Advice { - query_index: 15, - column_index: 4, + query_index: 5, + column_index: 5, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000200, + Scaled( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Constant( + 0x0000000000000000000000000000100000000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, ), ), ), + Negated( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -16017,47 +17681,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - 0x0400000000000000000000000000000000000000000000000000000000000000, - ), + Product( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, ), - Scaled( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + }, + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), + }, ), ), Product( @@ -16120,7 +17758,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16148,59 +17786,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), - ), - Scaled( - Advice { - query_index: 14, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - 0x0020000000000000000000000000000000000000000000000000000000000000, - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - Scaled( + Negated( Advice { - query_index: 15, - column_index: 4, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), - Negated( - Advice { - query_index: 10, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), ), ), Product( @@ -16263,7 +17870,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16293,19 +17900,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 4, - column_index: 4, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + Negated( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), ), ), Product( @@ -16368,7 +17982,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16396,14 +18010,7 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Sum( Advice { query_index: 6, column_index: 6, @@ -16411,6 +18018,51 @@ PinnedVerificationKey { 0, ), }, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), + ), + ), ), ), Product( @@ -16473,7 +18125,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16488,7 +18140,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -16501,35 +18153,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), ), ), - Negated( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - ), ), ), Product( @@ -16592,7 +18237,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16607,7 +18252,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -16621,13 +18266,6 @@ PinnedVerificationKey { ), ), Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, Advice { query_index: 8, column_index: 8, @@ -16635,6 +18273,20 @@ PinnedVerificationKey { 0, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -16697,7 +18349,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16712,7 +18364,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -16725,21 +18377,59 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 15, - column_index: 4, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 14, - column_index: 3, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), - }, + ), ), ), Product( @@ -16749,8 +18439,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16761,8 +18451,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16772,12 +18462,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16787,12 +18477,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16806,8 +18496,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16821,8 +18511,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16830,21 +18520,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 15, - column_index: 4, - rotation: Rotation( - 1, - ), - }, + Sum( Advice { - query_index: 22, + query_index: 6, column_index: 6, rotation: Rotation( - 1, + 0, ), }, + Negated( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), + ), + ), ), ), Product( @@ -16854,8 +18558,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16866,8 +18570,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16881,8 +18585,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16892,12 +18596,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16911,8 +18615,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16926,8 +18630,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16935,47 +18639,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), - ), - Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, ), ), - Negated( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - ), ), ), Product( @@ -16985,8 +18670,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -16997,8 +18682,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17012,8 +18697,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17023,12 +18708,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17042,8 +18727,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17057,8 +18742,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17066,21 +18751,47 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 15, - column_index: 4, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), - }, + ), ), ), Product( @@ -17090,8 +18801,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17102,8 +18813,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17117,8 +18828,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17132,8 +18843,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17143,12 +18854,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17162,8 +18873,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17202,8 +18913,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17214,8 +18925,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17229,8 +18940,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17244,8 +18955,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17255,12 +18966,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17274,8 +18985,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17283,26 +18994,33 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 18, - column_index: 7, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Negated( + Sum( Advice { - query_index: 18, + query_index: 7, column_index: 7, rotation: Rotation( - 1, + 0, ), }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), ), ), ), @@ -17314,8 +19032,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17326,8 +19044,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17341,8 +19059,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17356,8 +19074,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17367,12 +19085,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17386,8 +19104,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17397,40 +19115,28 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 6, + query_index: 22, column_index: 6, rotation: Rotation( - 0, + 1, ), }, Negated( Sum( Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, Scaled( Advice { - query_index: 18, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, 0x0000000000000000000000000000000000000000000000000000000000000020, @@ -17438,8 +19144,8 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, - column_index: 8, + query_index: 18, + column_index: 7, rotation: Rotation( 1, ), @@ -17457,8 +19163,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17469,8 +19175,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17484,8 +19190,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17499,8 +19205,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17514,8 +19220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17525,12 +19231,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17569,8 +19275,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17581,8 +19287,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17596,8 +19302,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17611,8 +19317,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17626,8 +19332,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17637,12 +19343,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17681,8 +19387,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17693,8 +19399,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17708,8 +19414,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17723,8 +19429,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17738,8 +19444,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17749,12 +19455,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17772,46 +19478,22 @@ PinnedVerificationKey { }, Negated( Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000004, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, Scaled( Advice { - query_index: 19, + query_index: 8, column_index: 8, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), ), @@ -17847,7 +19529,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -17862,7 +19544,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17877,7 +19559,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17892,7 +19574,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17906,33 +19588,45 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000040, + 0x0400000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -17981,7 +19675,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17996,7 +19690,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18011,7 +19705,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18024,28 +19718,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -18093,7 +19794,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18108,7 +19809,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18123,7 +19824,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18136,47 +19837,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -18239,7 +19914,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18254,7 +19929,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18269,26 +19944,19 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 8, - column_index: 8, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -18351,7 +20019,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18366,7 +20034,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18379,35 +20047,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Negated( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -18416,21 +20070,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18440,12 +20110,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18455,12 +20125,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18470,12 +20140,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18485,12 +20155,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18502,21 +20172,21 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, Scaled( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, - 0x0400000000000000000000000000000000000000000000000000000000000000, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), ), Scaled( @@ -18547,21 +20217,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18571,12 +20257,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18586,12 +20272,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18601,12 +20287,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18616,12 +20302,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18632,15 +20318,27 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), - }, + ), Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, + 0x0000000000000000000000000000100000000000000000000000000000000000, ), ), Negated( @@ -18666,21 +20364,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18690,12 +20404,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18705,12 +20419,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18720,12 +20434,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18735,12 +20449,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18757,8 +20471,8 @@ PinnedVerificationKey { ), }, Advice { - query_index: 7, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( 0, ), @@ -18771,21 +20485,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18795,12 +20525,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18810,12 +20540,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18825,12 +20555,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18840,12 +20570,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18862,10 +20592,10 @@ PinnedVerificationKey { ), }, Advice { - query_index: 9, + query_index: 16, column_index: 9, rotation: Rotation( - 0, + 1, ), }, ), @@ -18876,21 +20606,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18900,12 +20646,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18915,12 +20661,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18930,12 +20676,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18945,12 +20691,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -18958,21 +20704,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000100, + ), ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000400000000000000, ), - }, + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -18981,21 +20753,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19005,12 +20793,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19020,12 +20808,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19035,12 +20823,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19050,12 +20838,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19112,21 +20900,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19136,12 +20940,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19151,12 +20955,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19166,12 +20970,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19181,12 +20985,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19243,126 +21047,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( + Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19372,12 +21087,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( - Fixed { - query_index: 26, - column_index: 26, + Fixed { + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19387,12 +21102,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19402,12 +21117,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19417,12 +21132,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19439,10 +21154,10 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 9, column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -19463,7 +21178,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19478,7 +21193,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19551,47 +21266,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000100, - ), + Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, ), - Scaled( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000400000000000000, + }, + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), + }, ), ), Product( @@ -19625,7 +21314,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19640,7 +21329,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19701,22 +21390,34 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), - }, + ), Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0200000000000000000000000000000000000000000000000000000000000000, ), ), Scaled( @@ -19772,7 +21473,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19787,7 +21488,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19864,11 +21565,11 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, + 0x0000000000000000000000000000000400000000000000000000000000000000, ), ), Negated( @@ -19919,7 +21620,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19934,7 +21635,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20001,10 +21702,10 @@ PinnedVerificationKey { ), }, Advice { - query_index: 9, - column_index: 9, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, ), @@ -20040,7 +21741,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20055,7 +21756,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20122,10 +21823,10 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 9, column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -20176,7 +21877,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20234,59 +21935,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0200000000000000000000000000000000000000000000000000000000000000, - ), + Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + }, + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), + }, ), ), Product( @@ -20335,7 +21998,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20350,7 +22013,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -20393,47 +22056,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, ), ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), ), ), Product( @@ -20482,7 +22126,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20497,7 +22141,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -20540,21 +22184,47 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 18, - column_index: 7, + query_index: 15, + column_index: 5, rotation: Rotation( 1, ), }, - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), - }, + ), ), ), Product( @@ -20603,7 +22273,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20618,7 +22288,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -20661,21 +22331,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, + Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 5, + column_index: 5, rotation: Rotation( 0, ), }, + Negated( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0400000000000000000000000000000000000000000000000000000000000000, + ), + ), + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + ), ), ), Product( @@ -20724,7 +22420,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20739,7 +22435,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -20782,21 +22478,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Sum( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), - }, + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -20860,7 +22570,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -20911,20 +22621,13 @@ PinnedVerificationKey { 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -20988,7 +22691,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21031,47 +22734,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 16, - column_index: 5, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -21135,7 +22812,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21172,54 +22849,28 @@ PinnedVerificationKey { query_index: 27, column_index: 27, rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( - Sum( - Sum( - Advice { - query_index: 16, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0400000000000000000000000000000000000000000000000000000000000000, + 0, ), - ), - Scaled( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, - ), + }, ), ), ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), ), Product( Product( @@ -21282,7 +22933,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21297,7 +22948,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21325,34 +22976,27 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Advice { - query_index: 16, - column_index: 5, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, ), ), ), @@ -21417,7 +23061,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21432,7 +23076,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21462,19 +23106,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + Negated( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), ), ), Product( @@ -21538,7 +23189,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21553,7 +23204,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21581,21 +23232,59 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), }, - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), ), - }, + ), ), ), Product( @@ -21659,7 +23348,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21674,7 +23363,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21689,7 +23378,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -21704,19 +23393,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + Negated( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -21795,7 +23491,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21810,7 +23506,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -21923,56 +23619,87 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { query_index: 27, column_index: 27, rotation: Rotation( - 0, + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000400, ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - ), - ), ), ), Product( @@ -21983,20 +23710,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22006,12 +23733,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22021,12 +23748,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22036,12 +23763,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22055,8 +23782,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22070,8 +23797,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22089,43 +23816,19 @@ PinnedVerificationKey { }, Negated( Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, Scaled( Advice { - query_index: 19, + query_index: 8, column_index: 8, rotation: Rotation( - 1, + 0, ), }, 0x0000000000000000000000000000000000000000000000000000000000000040, @@ -22142,8 +23845,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22154,8 +23857,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22165,12 +23868,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22180,12 +23883,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22195,12 +23898,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22210,12 +23913,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22229,8 +23932,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22270,8 +23973,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22282,8 +23985,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22293,12 +23996,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22308,12 +24011,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22323,12 +24026,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22338,12 +24041,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22357,8 +24060,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22366,26 +24069,45 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 8, - column_index: 8, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, + Negated( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), - }, + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), ), ), @@ -22398,8 +24120,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22410,8 +24132,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22425,8 +24147,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22436,12 +24158,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22451,12 +24173,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22466,12 +24188,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22485,8 +24207,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22494,57 +24216,26 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, - Negated( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000004, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), - Scaled( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + }, ), ), ), @@ -22557,8 +24248,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22569,8 +24260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22584,8 +24275,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22595,12 +24286,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22610,12 +24301,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22625,12 +24316,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22640,12 +24331,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22678,7 +24369,7 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000040, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), ), ), @@ -22700,7 +24391,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -22715,7 +24406,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -22788,26 +24479,45 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, + Negated( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), - }, + ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), ), ), ), @@ -22828,7 +24538,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -22843,7 +24553,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -22858,7 +24568,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -22916,45 +24626,26 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + }, ), ), ), @@ -22990,7 +24681,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23005,7 +24696,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23118,7 +24809,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23133,7 +24824,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23216,7 +24907,7 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), ), @@ -23268,7 +24959,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23283,7 +24974,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23415,7 +25106,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23430,7 +25121,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23550,7 +25241,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23565,7 +25256,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23671,7 +25362,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23686,7 +25377,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23792,7 +25483,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23807,7 +25498,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23859,7 +25550,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -23928,7 +25619,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -23943,7 +25634,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24075,7 +25766,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24090,7 +25781,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24222,7 +25913,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24237,7 +25928,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24343,7 +26034,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24358,7 +26049,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24395,7 +26086,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -24479,7 +26170,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24494,7 +26185,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -24554,69 +26245,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24626,12 +26269,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24641,12 +26284,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24701,69 +26344,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24773,12 +26368,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24788,12 +26383,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24803,114 +26398,66 @@ PinnedVerificationKey { ), Sum( Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), ), + Constant( + 0x0000000000000000000000000000100000000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), + ), + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24920,12 +26467,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24935,12 +26482,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24969,69 +26516,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25041,12 +26540,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25056,12 +26555,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25078,7 +26577,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -25090,69 +26589,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25162,12 +26613,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25177,12 +26628,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25249,69 +26700,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25321,12 +26724,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25336,12 +26739,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25396,69 +26799,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25468,12 +26823,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25483,12 +26838,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25517,69 +26872,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25589,12 +26896,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25604,12 +26911,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25638,69 +26945,94 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 16, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25710,12 +27042,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25725,12 +27057,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25738,31 +27070,6 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - 1, - ), - }, - ), - ), - Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, - ), - }, Product( Advice { query_index: 9, @@ -25788,16 +27095,64 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -25839,13 +27194,61 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Advice { query_index: 5, @@ -25858,7 +27261,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -25890,18 +27293,66 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Sum( Sum( Advice { - query_index: 16, + query_index: 15, column_index: 5, rotation: Rotation( 1, @@ -25912,30 +27363,78 @@ PinnedVerificationKey { ), ), Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), + ), + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, ), ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), ), - ), - Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, - ), - }, Product( Advice { query_index: 9, @@ -25954,13 +27453,61 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -25979,13 +27526,61 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -25995,7 +27590,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -26003,6 +27598,115 @@ PinnedVerificationKey { }, ), ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), ], advice_queries: [ ( @@ -26106,7 +27810,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 1, column_type: Advice, }, Rotation( @@ -26115,16 +27819,16 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 2, column_type: Advice, }, Rotation( - -1, + 1, ), ), ( Column { - index: 2, + index: 3, column_type: Advice, }, Rotation( @@ -26133,7 +27837,7 @@ PinnedVerificationKey { ), ( Column { - index: 3, + index: 4, column_type: Advice, }, Rotation( @@ -26142,7 +27846,7 @@ PinnedVerificationKey { ), ( Column { - index: 4, + index: 5, column_type: Advice, }, Rotation( @@ -26151,7 +27855,7 @@ PinnedVerificationKey { ), ( Column { - index: 5, + index: 9, column_type: Advice, }, Rotation( @@ -26160,11 +27864,11 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 9, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( @@ -26609,7 +28313,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 11, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -26712,7 +28416,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 13, + query_index: 12, column_index: 2, rotation: Rotation( 1, @@ -27180,51 +28884,51 @@ PinnedVerificationKey { minimum_degree: None, }, fixed_commitments: [ - (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), - (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), - (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x212ebe88f06142f838a0c5c4496fa768ae3ca10f1ce9022c562b26bfbdc498c3, 0x2b6528f6317e63892bed284c67f112218631e191be7d5fdc5cdf7b9e92c72e05), - (0x034445b7457e04150c75a6c82e6f83ce2e1adf0e54aae2cfef0531b24dde111f, 0x30a7f9ce9bd574162a4729f71d8c7f0c61a4b7de6aa0181eefad3693aeb09c10), - (0x2a119980555858bc332f02295311e188f6125be71b5e591fff068a5024571aee, 0x23803ce939432804d484b29078c9c161015408e5e383a8cfc8c13a30502c9400), - (0x085620965e456f2f2b98a365768c7be2e43577bd0ef92a50cc278d521e983e9f, 0x3f1f003651d27a02d609eb61fbba5e74bb61c63b5afcce2c683948c5caa22791), - (0x3dc695372b0d52f554c7ab1cee168937f45f3abdd2e8fdf65f3b523ec85a499a, 0x33ef73e550024b2285b082816eb8818e80255973d9560fd437387cdb870190f1), - (0x1028b99218dd2642e60b90b28ae9cecd4be814de17a429314530f9a8695ce1c8, 0x2592dc76f783462d5b3bed02626ef2514deb59b7a6a8438ff64fdf6aafa00d4f), - (0x10fea717c33f17c73458742a1431679d61a436da080918e030b1760627a9538b, 0x0faf9983733b318f75d91c0c1131cfe7c67ef5474657d36c5ecd566b9629b6cf), - (0x3c242ccdb145d93f2cf312fbaab513b66b4cacd30de01fe193984aec912dd1a0, 0x1fa195c07847db8e31bdf7993ea787c9656a9d86babdeeddb76817d3c546348c), - (0x3229e787cb7ce31299dedd67d2631c480399a333098f84e7577132aac163ec8d, 0x3822eb1cc8eb19179373ea6b66b25b26ac8c915f0c9382800dd45a5a408fd1fc), - (0x10f84d5a9fad7c64be8a3529d1dd98c0961df4bb677b6a60714ddb053792998e, 0x0f032b93492b60aed3339d5646e15d2a9a46557cb01621b8d3d1392207ed0021), - (0x1d5193db32232d750432a8ec23f74307ad8194a0a4ad273c9b761b4e0f365d0b, 0x0b73549978b1c24dcbb39570d9fab795337f6030f2fffb9452b5edba0dcd2906), - (0x12967b9d3412c47744d16acede02d8214db2def9bfa643cc3da724f3f4edecaf, 0x3744e1519dcf0ae6bdc813ef1a123fd7978c073232164050a9a24fcd57d9a0a2), - (0x02602bfa02be45cec73e24099a3ff88e66386fc8a55f60af328afe5a68007233, 0x3db6b250fdd9abcc16f17275cc83ac66c9a2d91954dce867f23497a3ad85a85e), - (0x274c6a300449842b07918941f243beac24a66bd9870bf0b1c59b0b6056200a73, 0x1a19946639473486c5aebb6f2c7f0ed9bfa6a072a37857b9cbd801174b6a152a), - (0x2280ada329e3a43f320cdd86e0cfbea20620a02c772fccb8f34091832b9c4e1c, 0x0f47924c100e3c314835e8e1112a21a9aa54122548b5a2fbf1ddca681f64d148), - (0x2cde628fe6b43f6d0a2406f020530790a1c03642bec15a27e4883830f1906f75, 0x269f42895d8fb9cdc21fe307bf0cf994bc8d4f57f5c9757d7e7f491f67218f41), - (0x385b8c0d2d99558538cb3a9f9032a5aa40e73909f80c72d4b56dabbd35da1edf, 0x3926c421e68c459e921bc92c452b6d471810358c9c9941d0e15255f07e81f52a), - (0x365be6624d5ddbced07b7759377bd70f42ef5c0727849dcf4295e2be882a1229, 0x2379fbecf58b756b83626b73e0a4fe3043b6f6f7d3cca1c35ae298993be00b55), - (0x3992f02cfe9f649c235efb0b12057bf4a6a23de1e9186ecd4755cde6af9f18a1, 0x3defc298ff6d6e34e250f303089cc3ff36f9960f3c37dbff959ec4d722c21354), - (0x0b89c282c8f2d54e66c7a11e6b4338a2f06a7c9430f7d3376328f12fa001cac5, 0x098b5c8ee6548183ccb4e60cdfee10b509db34ed136daf3530a426e8f200e89d), - (0x2f7f85b86b6adcf714d0df7878f4604d33fd319f39bd00fd5c34378247a155b5, 0x3a2f025447b83b65d148e99c93fe8bb991a81ef6d2f827f010680467361c47fc), - (0x1c2d777a98c9dbcf31b45d5a7584b154daed974f3263b6a93831d53bf593e6c2, 0x234766a4b905ed9627f6a200a7b0b50315203613a5b211494a94cf21fb4c386b), - (0x2ebbe4228a40b24bc3f05a07484c2d470ca997d5fd030a26c3c475fd24c5f71b, 0x00f27b013a7a80f1221a9fcf44332b3842ac2af0af4a7108e966f765d8ccebab), - (0x1484b5ee3bd870af246676953341b0825bac76cbe5a753c014bbd04c499c3946, 0x09860840096085811328952d906cdf7bdb748db7e08157d96b3252f909cbc6a9), - (0x13c4224160178c41c828d952f78a8a0d58321a7894cee8f2884c5d1d9e3246ac, 0x3699ad2eb29f2cd4825c0e7cbde86eb19889a00f4afd8cbe40d2eed7c7efd565), - (0x3e6b0d18402a8533aa2c9a681ef0c9c3636154feb1a95b6a50c522833f6e2cb1, 0x20336e540af50c99ef3208ff5dc2f4f0deb2c8beb8f1b3da046eebb05e39deee), - (0x16e89e0cf09f1d68ce3f16728839b4973604d9cad2a6ae3114ce75ce5cb7edeb, 0x1db108cbdb6e1af19ca087d3649ac673d59ced15e6780957d26a83aa8865f116), + (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), + (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), + (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), + (0x090c0e45d81111bd494b9ce7c16fb0e0bbc953911c1701e42a5de5f36389afbc, 0x23ab5bd08aed9eee6c7e78f15652ef51633694b92b1632f9e51ccd31b286066b), + (0x10b2c2af49d17b962211ad5bbb682532940839026d0d242b254b907a50d136ba, 0x1a59a77fd094078d6075a3bdb691bb0b8808a97d2e06092cb6afa767fcdf4cbb), + (0x2b98cb6188d5afb90a5bc94d9f6c23086164284107dfb04a4504b61833a5f9dc, 0x205725733d9c55704a574a244fd4c0038e001261c9f978a2ddbe2ffd33bc026c), + (0x31711515cf172b14651f22ff63fa42011b6de4daa3b71e28a0ce57ae65be3e18, 0x1da5bab80180265242efdfe09c64caf1e987a16384d9eb3bf80343cdd0154dd4), + (0x33548b13c1aeadbbebeced0618b28498d0f95cc26a0413dc6c6b12d305bc9de7, 0x04769755bd24a459f3b86018e78e1f4d14796ba33aa7a08684529e47860f215c), + (0x03e2f4d89dd13482c272721bcffc31fad53b5deb7f402cc2522d2c10cda6bbbd, 0x3b5af207073d98eb42123895069f5a1b726a476ad1ec2945ea63395c284447ec), + (0x3518a704cfc4622b72b4ff3cbc7382fe91fcd77d861e4ef7f2a9830150066746, 0x12639d3e4aa8d1d82cd591fa2e58b1679b677e5e99711a733746dcd47b36a987), + (0x035cc4fa63ce607b7dfdfc08beb5380e3f837090ec4b812b1772ad03ca97156c, 0x14e9d0f3ffedac7d9857fc47f68ccb943f602577a0037e0e3c972b9996f96d71), + (0x00f8d7b4c395ef38584c0182319952b12a25f9d51b75293d4c62f7a5f4405a72, 0x37fa03464d244314d298ecfe5ab9fd9d99d63f38e6c6d54b97efa04b3acc6fb4), + (0x3c0f3f0d7b2306490dac7d578d4846c63adcc76988ce322d8691c3b8b5b0f623, 0x12d81ca672a1c18f6e0d9b7eb8fbabdbe450fae6667cf349c1a0e63ca9a0824e), + (0x27d13b33003ffddcd36efb731fe94db93d181bd994e0c057e945402bc8501789, 0x0e1dde94ea3b35e0d0a66350163ba2ff9dd5070500912b7d076747816965ffd2), + (0x3049e9c8a3e6c7fe628660121f04915e03546b7a2dcb8a3e59fa99546e4f7f86, 0x2dcebc740917584f788b776f4cf1e3cd96b4a29e9df7224fd8e5f428d4112546), + (0x245ebb4ccefa7c4e2d5a9d7b1746b8277abc25f74cd11b2dbb752d49612f248e, 0x145f605111205a7c3e4620ac035b3cccb6375f8d3c3469b7900e427607c401c9), + (0x1751912a19fa0009ece61b686342d6b4385415e942159e8db3f174ad24d612b9, 0x0f31114ef566211d46914d0bc2d1a27a0e34eeda04dab53a0af7a37024f057a1), + (0x091c6c4854fa5d9ed8a966f2a1c4946b41f6872de6c19fa8b521a0a8eb2bd899, 0x29100b4e15344d750fae4a81c82faca1e8e0573336b1f54b394946e95e7baad0), + (0x210297af23386f0691220f2a0e3504336a815cdba5167277a13f0a7b992b8e43, 0x2a184bc5b1981e303cbc0a18f4a01b4dc49695b9a319bd7e713d55e46d1235ae), + (0x05cd80ee69394fb4efe616ef91593c3b8e6e142f2269524f01476ab78a67c9f6, 0x23a7840c00619fe55078a6bffb8a061913f929a7669861ebe99859a48136f12d), + (0x34c8b83a2cc924f1b0237978c8f911e6a54375c509ba46456a011fbb74c8698c, 0x260cc681c222535c0030f702172ee8855b681c16d706b1b9a786165e06705de6), + (0x3dcb136a22551e524212c0325331a9dae5ad6ff356175e6b82a54039475be1ef, 0x3bbbd0d20ea0ebb0f36d740910947d1934bcb93ba16325ea42f124ec0cde7a81), + (0x3bb657ca32617e6242b6c6a0b166a1db205024d0441d091b8d45fb478cd4782c, 0x3189ce1b97103345fc0eafd287eed80ab186151171f22af2c9befc71a0957529), + (0x25578b0a6d546cf38dc84329fad41e59690a2bd94a0db5fddb42e0db8c267827, 0x03448e4552625dda62a96318bcafcc305deafd6a028f8379d8c8d9ffa0f86e64), + (0x30d1828d7463255ad75b39ee4c718de05a762c45c5d717d059496fe05d1575b4, 0x0a8eb70a9b252ee9ee57b29e4dab191cbb29665821830b2ab60fdd5d3414de45), + (0x2b18121165b0ebf2ab46c207d973f44f135c24efecc1cc48d47d38769969aa2e, 0x1a829739cf7eb6422f581f64632c65073aa49819e62e80489b6aae61e6edd6a0), + (0x23ae57d2095a4324262aa76f345fe7bc21d8ad7b3203a8167bf8315e64a11d25, 0x1a871041d826e0e3bd7520e03dca1f56211065b049b2bebc59d8e01b4addb1d3), + (0x029871a070ccef21bb6d1d5d7e51597b0dd8f38208f1b304bd372b48aaea0a3f, 0x3205e4b0ab706647e6f45cf2b2091afd69636a8f61426504983bf44d47d676ec), + (0x0bd7a66e0b566e724536f77fe659014db82286485859c1ae9d95f42cb898f763, 0x358962c131dc5dd41db0fe6a8fe5315b75dd9204682d1de05470184c8a331a8a), + (0x336245b9b67f39852776a1f6ba5072ad3776f38d9b0659568d3afb2e6d3750d3, 0x1ae68f5f91a6d28b62a9fb9240ee53f86e0ac434286429024c253bf85325033e), ], permutation: VerifyingKey { commitments: [ - (0x12dbf09e55d044102f1ae361e8d266b69e1718e1d624b96e77b3cfa1feceb732, 0x31caaac60ce9718af01c87d262fec2c754c77550d8bb35e63f8b07fa9c89fc66), - (0x22da488fb2f178bb8139f14a2aec59c91799533c774af776e94c104f7687c421, 0x2af740c09b699a113bfc6e74b029298d54af6bfb0b92da9c1b0bded28625f450), - (0x2b48b45f4a5a2b4d3605d823a561d7cf0e0ba56c0cbc5d40b58b1b8ea7e36ae5, 0x1035a22259f1b163d3aeb91785cbda566f1501d75011335fa62a0f904c1cb318), - (0x16940bc043dab8afc2a1459edac40382bd790dee8c14db086c4619dc53ebb2e9, 0x1ad505a146f27451d13f90c75b8651eb10a3f67cc6609ea75ca71eee7c1c157d), - (0x3a3ed02c9cbf7b5d099b4c7e3f12f46f3fd898e07f8e7a4f707b1df7f5de3ac3, 0x1d90e34b6d292a48989e3fd47d0eee2ecdffe086ce57e43e1c98dd63ced3fcda), - (0x1f622082868867262854bb7e8cf99d8414bbb244abffde123330b8aed84bd92d, 0x244be4573a4986eaff1e2a6beaa0aecdcdb361540f0b8cf4db289242c6eaefc2), - (0x2d8cbc3dc5fada2ddb980b66a31f57cb02af14982712cb1a12c0d11945811a0e, 0x330cc47c866342bdcd769f9c4ac214a022894aaa4f706182ac5b9e7abac7b2ee), - (0x0367c84844db2532b1fe3833504c46fb366ed8a6b91053a64bb820b5407ba0f1, 0x17fab750fb792623f23d091a07bbc30ce0a669d7270ea36ca38b934bb3caa135), - (0x088b09cd2e59ab2d95dd62077692f366604d9dbda58f7915e5b7c4874cb7ac17, 0x3ce41c4b67191c663c5c5e2413b5359bf55f2d59b65f91b086a2aadfaf4816a2), - (0x230701deaa69a778874d4fa8682366c61954107150807386f5d335157eb93395, 0x000d66512afd16ccc26d6d086a116dfd6f246ec5e4817a71832244218ac6fd9b), - (0x3b7b47bca87fc15cd5565b546ce7624078f7cbf71d4ef78360740cecc16a6415, 0x20ab204faaa0df261b922ee76d97057b4bfa1fb7f2e50015b2aae29d4dbb820c), - (0x07ff65506877a9a21905ddfa323607a02794f495d6448484fda71859af8d51db, 0x0fb1605d3e8d4a77121e70e1339b819825cf04c10edf28b4bf5238a836608c74), + (0x1dcbd758066eec5488296ece96ea7fd0eb814479bf5cf04418c109e0c6e3b65f, 0x16f9507e843611c3891c03a5acbb47cb2d8c591575911c12815cb1e031cab8af), + (0x2388cbed968c22e32b6bd4a1b2395ec1d940135e0136e1df5600f2d759748a64, 0x251608eff7019c64b80df6b45d2a561208e59247da23c0c41f29268ebebcc989), + (0x25d09b3bd46f027633197dae5164cb90c8cf4358598bcd747791b9d95370b1e3, 0x0e94d8861f8b7a6c4f7edf780b131fe2b89757c46cf0b2da24a3592c8824c692), + (0x019398cb329abefa110b3c4d12af9685272f7a611599f5e9c54cd644f0882a51, 0x2a5d9081f77f6e389a355fcc45425a3d4d6de28cb34b26bf54ba66fbd34b8f86), + (0x04596f22bde8d6e02fa2426ea314dd115fd757bc58a60e7349669dd090e5d756, 0x09ead6fcd376d620681f3b14c89337d25ec795cde09fab7da0376bf07bbd402b), + (0x0f7bd41cab58414151f520efc629836da3052d911e95ec09301e25a36e10e9fb, 0x008998b3c16c01c66bd471eca4c16d87adfa0856886b11bff2d04e281e45f234), + (0x122e03591cfc43c812fbfcd45a3062d845b6beecd5e9591fc78cd07734fd5eab, 0x3bb6a66ca91558265efcd59482b2f016ccd34e6b916410e5a198e142ff9257c1), + (0x1656a1c579376b8b92f00c907dc544843231a13b0e0b58be652c9ef44e0d8957, 0x0608dca2d8f9ad5ce0d7b0545a3d148371e4e3993249db87ae4e8a95034e330a), + (0x1d8dd2ef5d363793653c385ef62f382f48d21234caf6dce0806f9295d0f63f47, 0x3aa78867d1d8cc02a50e0ed804a07b0572ae191f0b1c495072fd11f6d2aea2ef), + (0x2cb9fe3cfca45f22aab479b9c54d7731bd165a236bc2d0bfea9af9bdaf8969eb, 0x2acc3469ecb12ba57992881873adeda3f8380262977b53175a99f4009d082405), + (0x1f56f0d66eb5c9f86a680efda44e992322f4934c10b83895ffe60aca9305c5f3, 0x20cb980461e94d5e6a5b5beaf4361b77680f5cdd4f3c4398473aeaca212ada1f), + (0x3f821ad8e7fe3fb349c6e9b316bba2505648a219f337f9e5f1265572b606fb4f, 0x3f4472a3137db52586f3adad1584ee57dc0946595c62f6a39420183814cb3a42), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 027e09fba4a2bfba0be636799cd3f6c55bbd7d1a..a6199f11455998fbbe3d3b83f1149313c158b811 100644 GIT binary patch literal 5250 zcmV-|6n*O&f}X(R#n@#_VcmMPHMHYC_EedfGU{?Dw}vgYeGw{#_zU}7yKu-^XxJ8jsY<`=F}dNblUu3dO6B?p{pAz zeAu_((N#plGIC{>-j3YKNTd(VSvx1ph#!5Bwr6L^^+W{Gp4nC=)+ zA1E$fTvFIgX^=Jn0qW>v%WZ7od<5N=zGc=UM}0sZPr0DPKeVIg9q&qU7t56|nzzB8 z?y|2pRCI360fx7B%RRfn{&>T!)%{EEGq_X3cmIwnghDK$!zt+{c;y9S|DoDHh2N4p z25q9J2FAN&Yn72SRMwT8Ew_RwNUaz+xBGt0sNz&aV{69>mB9h9J8HBl_{GK|5i<4K zLBQYvm4;T_eT%K7N5N8V0i%8c6v+v|I`%p#ko9{Xz1_iQLr;1GSAg+Z&;*d*B1UkH zhtD`|gxVW7qs(2IDSprF!BMi7N7RnVE5@Ie2iLuVvVlCQQ%10Uu4Q=IIb=>jXXtXy z&mt+IdW|pRtYCXwJ=k?5Cp}+U=B#y&?1+yY5lGT@_{1}hH39i@$EMq zs8MzDQKAbm)M&QG;M%YIsGhl%WL@TWhQ3|Dw?`hT`n?81HRs2iX2AYtUN_q5qg9xFvP_y zwI8{kPaZ7fCwkJ60SNW%>!Rk9iHXN zyxf0X*;;%^zr!oDm8BI!1+Q9z4F^3k;M^>!r$ttu=*5rG+7g~r9_BS|TvUQI>(8gq zle79M3OOx^oCTK%o$*ZFZqeH!dP)?i={k8r@Z5Emc7v**Tc32lp!V@Wn-i|^L?1_r zT7nUX7GbKP+r}zNge5Pfdg^R25TzgI(`b%XUi&k;6|V9_qu=ALW^JYV+3)xrG;>*S zh62^N{WvbXYXG4X0ESP49MH*SHZy9&A@hyq3=C!B5GFr3oQxwgePf+?E$I!D87S*= z7){=k=Inu1ft@79`bPaK(G$pa%3N) zCvlL%^H9O=>pxRIf>g8zz#^E@ssSu86@|y5 zHr`>@jMKQ4(4zHqUe&!JL`@~iqLvlYeQ6{I0kYBD+}qDEFDiRuuh;J$YI20gLxi95 zE5@f5@nW%WAE-+{MZ^LJ!(o3o*C&F=pAOb##k8WNvPQctdYhqrP zI*u|JSaEw83@Ev6Bp-)S+SZyamAUB?ml)3#DcCQ$;cqM)I2q)9U_$PC z8i!M{KaXjoEv0Gg@v%eE>27mfAD6^?R#AUF`s2Mqyn#{NE9YfhnC1Bg@J4)ONJlFU z<6eClI${h@pwiutTs^^l3H6AkrXF`>$>*T*A23Q&#{Ui_;G^ams(G5rwic+DJE)hQ zGsN0}{lk786p2e~=?O<6sxN3vLV7sEC8RoZ2Yf)@lE&_ssgJ94AE6Yg*MgJ=#&R!V z1=+CZTf9A#GJyya*0Q^Ygk={adF_8Je{%D2bO&>+m;ZKspQ6 zk^cC-Uq0V(yZy%QtmLnho!@vjlYrc(Jin+N*6D%(qCw)hv1c?JaRx10 z)gd}-5xy0k<&6(!F3B+1I0J%qwG^oH`KonzHkx;=b4hfWcGFCu;X$?z9zavbyBon+ z+667<5G}9>R1+$H;iB{=Ix4&J@(AM0Hbb2#Cc4+S*?bMZnFlSKH2$gaZJ@qc8&wO% z(avf50?E&40zz9P)ds8?ps%32iUM$R!9S}>PomGwlkOr89&R=W(MR#(YE}|TOF~ULG~7Dcr-rM$UH5^D^M+sPV*uos5?aH*6BlY!ru^rV z5VhH$;O56X4T8CIlfz8M#JC|Q1L(R8eOiduA7fHl`}zZ`<;hhR|JYp6J*x9v7QX%r zFmL5^rWll!z$@Cq)-A!mXEE9@9-8eFb8evHC9LOoHOP#=2)$Jv(Z-qL#9Jfy{=A$G zcAy0JTz-*LyE@}HJ8K2SE_HvvBxRpB#AYg5$Tk!F^%XL9C(S~8JK zQ1tn24eilU$?qfZc2WnkC$wa7Jr+0quY(cpUT8R*k9#g~JZ6w%SXmDG!fK1iJaDTD zcR#6c6+mZBK{|zu@CyiCB-ZGxB{6zY1CBy&?zO6BxHg{Z?nc8sV;1^Y?W$LKF@-@1 zUA4n(9H068I@>^7K5B!Z!Ym~RI&GCs+oqo^5WIcxGnD2O2ioYZ3Rf>+#vSnQXGoz+ z7VD3nI|}Ux4&6&AgfhX4+zg4dP|In+w3dNZhyw#)8?b40IIoKz9tCvd+D9Ph@#aH3#|66EB~sI{9&4AF_Y>DOtM{>0d?c79n*!7uL=TfwiP3cwDnfT>cF zvOA7e0Dp6pa@V&SZyU^xlp}vIZ#lJ30@n$?tx7}mtN`BFfX!zPLkJ^Ss=NIZ{jX_L z2>l?hDGzKp*yPYze_SZoL+#tGO65~>lF_eI{?I6AT}?Al8WnavrT(CxO|&TNc^^<- zY}#xYDP93qHzG7u>X;042geDB-8i-zU@-v$`!}o@kM}r>W=Q)DcWI3+OmzND3r*{? z2GGPVA`&;~46g{nwUIdJL`z{#GHGuwB#nLfgXDuN`k*UGAB|n!kMy|LXK%`JDskUsrK;=k z4}cWl#tv?L`fkt%CoYLFZICn`Z{sJ@CZzA^xMC=*7)LwWC$xtc$cIrSLn)NOQ9|p* z_pKiJ=Wyr?n4j7CtjUes7rx}^kbk-0qA}~)WHi$6l2wP05 zv&eDd6v~Wl!Qj*u1a5|Al;v^8;EWq@Nmw(mZr4uu;<1;m=EskUF0%!V#!`hf)1JN7 zuMv*2)-DHo7-nhiQm&|;<90-r9Bv+03>5T~EkKtX`d6yp#{jW`w@X;IjyeT|fUS`a zCM5rhL}@DaR4%7*8hFnzphgFq9f9(3^2C|L(lJ`H(831_|AhEyO+~-C8Y%E~m2u zUU@|9_$vR74k27cqi4FN(=vN1ySKLnER(C27SrX$U?U7n<#ccMd1J!$ztYhDfQVq9 zsq6w3%#HLfH}@K2yG+pR%_zJv3$;k5R>cuq8japxgsIK)SG^{a8<3G8YEQb|7{)}y zSEvu)k9DeOz0=LOVtTdOM1vYoz96Ea>d=zJvhn#&dj#U_6j0!LNr8n? z1x}828r$umz1FYs3a@NKQnIIGT}MJtY@B@aA)I!o3f`<#AVj#dAd`GxL2s{Dz&}pX zKP4~rNZ{7cbbc)O8}P}a%(H4Z8h<~brJ&P(pP=`>W~)$sQJguf{c8#*Bi`m$ZOzRy z9x_9z&vQ^;aECvK5Zb?o3};++?AxANII7q6uwN)1r-*Ee87E=iaI-LgbDTa&6b;Uq zLS@u9H-Gv=22L|aRy1GQN*8~T11j89Q)RKD-R>R_l^$V@D7ot>G+o~(z=Ialzmni~ zjsX4gj-%Ct?|WI$tad}W+8`fQg0;$Va+kdXbhI^fEwrvQmSYP6=Tp=G(XP<5KY$^8*EJ1T z*CD#k?8cGoJ5Qzt(}6j}EjLbcg{YIuMo-!!R|5})L)f!c>mlt39JRoT=M?DuLgizg z!i^XEz9;L)i~|e(tut5mSJR$5LbI4)DwM`c;>^a2GFm&Z zJCtgGd~>@}j=m-y?nBZIogA74-iSQo?Z^Y@3TI`~&W&4?FWOFDz;z~Uf0Ge_t&BblOREY)EV<0be|%tKmP@(EJ1VcE!b_t> zLo+UodD%aKxt8$Lwwapsjygy;D}aDvAmewCa;K zx)-s1p(%whJulnK(J|t+NX`P4?RZA|iL~&m4x5+r!xhOMk#zh=?>h=F^0PX~*6c*x zj|66rC{g!zrGEovvDg_2ggnkz@00Ay*hm!`HvH@d`Ig?SPxbx5{R_T(yz8|Ik=ZK~ zqtoMab^?iR2De$(W;*VZa;gv?`@bt*BkUi1KgK8*Ik?fIEy+Oay%E!&$hm_SqR8!6 ztlLNuBZ=}HlDps2b;RY!Ss3VS(~7O(3vCvTs=@#5W_|?J8l$@wBPxJxAL-KkXmhp( z7RSk62<0u{kr^mZB;2>Gi&$QHsxkb!JI(2V(R$JP8h3Y(C}n$QjUS>AWGK7KA&t4S zl55hTKBKym$UxF9=NhH1s@AF|itfOhZT~cFupYfpFK}vQ!1?TnFk%w+%#q3mCa)q( zv)B6$m3FgX5#w}kFp2&4rbOa3{qSt2D3-Bv2n7VAOsDh;usq!-lX@h4hsycam%HtG z<7u4TG0U6_Exc665r*{lsT8&MSk`9@!|-{PdPRx5*-E`ULa`YdbYrUz+yEC)%)tr=Nh(SmAI z1?y0gabfp-)nk9sHHCzffz&HixHm`PZrW~xkqg^|&6-~CF<+faogr=13yDLJdg#eC zFhYxM8Z+{$y;Ga09A-rtJY-XEGV>&PUuFwy{M@>KI!Nxs$siB2g-^G#^-1T#daPeH z?sgw!pD0pcZosFqIeGdbsFv~lAYddz7i0;V&JvNmM3?}nsthyA3u+95y`Sid75r0K zj|w0d)@euy*gJ{-IEXB{*IH`gYZP%;J<>4LhADJqJ&Uc)5cG+Nn&~v)7TkgrIXG-L Ib7Nu#GPHCAVgLXD literal 5186 zcmV-I6us-H`}*wY>T}*kiMnt>BQirw(OigWbMMrm>vjq+E;$`~YJ;=Z zqH~=fDyc1IUYbaS&!{N05CXFl(G=Sk(wPDQL8e76xwGxHjTJfLzqNR1c`>|mJnuG{ zL+7VnuK8f;=i)EWo~ds-FX=A2#%ZNdbT*@27OcAItarJlYM!Ky1k{+$B_mFE2ReFD z{8Ur(txLO91tS~*0WVr)o`O1vj=nnB-1d}Tn;|^bVx#DhfGR$Je$`W94z4|I#rwHR z$ueFW?kWQ1wuK-Pgdp=(;W31a1m{s%sZ~R?9L4t+BH?fk2QruYjmu=j9wk5~39?oo zvilpInwY~NtSkG-(Ecolm!UXb#mO<_*`X$Ld*RRK_Q?4HKfTyh8`R`?f$pp=fG!5N z@ULirgPipjL;b;`!j;wsD%srSNz`bv54r=`pb!F{gR6O?^SKyQt6jsJLoxfsp?7@N zn>D(V{_Vkb>*j;x=8F4}>BEPB7k)s>Ti4FmqZQT11f#D>vEMiINP?Kzs(j^xWd_k1 zKrZBnegbMdC&FpW(t{gV8Dlazdax*xzComr&?Ml9h>piH(`oc&z11{UFBoN~szf4# z91sLT6e@QeoCJ_k*VWPs**@_Yya3Bv%Ac8-A5-d91mfuqE?a+`@)*eVpcAi!8SXy?;pT}P~vPWQtbfEni@39sYkE2(G z&lTU!aF`n7)vtCoB|ki0iHYPGg#3193A%n*&CE1os5~lLt+yKcd!%V?1_XHz@6K(` z4CB=Q-LRYQJ<Dm+pFo0L`fAoV9B*3!PRzQR;AV`|)ku~3u{n)3t#`%P?jSCWlH+K+ z58B9tslt5lvm}FJW7$6@s@#$pth6$^b)~`b;C-vHHI!!#pw7#Rz%)JFd6PHZvxfJ{ zGh6q1lVPMBMU(J4RZr&}pz8T* z96E&xoDOw6OwiA?1gW<^GU7t)pnIHUrpB(`pPn^VpVCQXYI#V%-54B5vEc`g)xP84 z#@4eF{i~#?MG|8+qhm}@$79EbKMu(YDkcJypHS=-0=0WKIbcgjF&Kf87?~`R^WP!7 zc_*n15e@nELdR|nMsF~xZsxeRob7bpjWZQD$P_xbfm$_er=oVDB*un6*It#eHwIQJ z)jT>7x9RNz#W^btli~W@zjmJ<+BGx8BD10!0D-zmm&_pz4^t?V zWt%@F^4l;^Z=EzO5v9G@bS^dW2o}w^Y-#*%phDA@Aq+D2l-KjeRwh0l266 zc^}FfY%e+{s)9xJT3@UXie+rcFBS7YsxhX9=@ls&;C=SNP29EF(2#Wlx)Q0Ok2+~b zI+Lb*=w6(3EY2l7^oGoQ<(FCvo08QjMq&id&=R_t483IS9df?Br(cD=H9^7$ddj-; zXL7|wdYI}3vW!XyE@D)^H_f9VMYO|L6_1Gj3O(M|*!1f%x^3IF9n&4yFgGaJ@TC79 zpvvPT@m9#~)>;X7VTiQbM3y)F$E?ty1{kNSld(ftdEPpcqR=`=D%1?pO-U7o+Ob+M zp%VWKIuAgKI>l<_@XD=HHU9~Xi3)q_)6bB3jA22ux>{Zu7}_A{0{SNvjcDypM{hVF zj@d7%0bVbVJ-Pw+s1y1J49!_WC9-ATrdSe>{Cbm|9P2))g2?G#?Gu`uX4i6fC^9Ht zcS?`Dy(G#62Qc}q?mC?5Abti~WH1AW{##jpAB^M-A<6VM7#IR`{$EcWnIbQ6d%3RH z_%M|4ng?)^CxXMdrDt`~QJz^>cOH-5uE#t;5&Iwpc@eDW(@U|17@-U@&D6q%QL*A? zr#jXc2=bBF-BceaI3*ANTpl}e8^GkYHXwxOY4PuBBO)0vD~isN(63oYweNtSe2ObV z6)Z!2FrhVlXE%2HSS8#KR@8vPYd;n?`Uf;9tW`uhB$dPzpJ(g*q-z&kUxpG z(!mDt%!|NS0(zACC=8)@?tYDoR0ED`Yk@D&GZ;IJiYgvs5ejbp@o9^V0*()wFp7j# zXsQCz6fYeDTNa)k&3`#Kctdvc_}SXF9Esg0!aZJ=ExIasm5IK^biXw2M`-CDY?wRd z!Dbz0F==Iv;&n8|6nXDm0$v5b*B%Wpvlp9AYEKp&LMKX6l04&C~g1BB-I+d*vo* z5#7RRf@_K$BtCIR9{j@`b@)33w*-Ca8pV5%E2!izK%Ujnnr@|zIyLu7DZk>K0Lv1& z**A)%sYU#>sKu$bF3tAK%L>R8?s8n+N%3t1pFG zE$PQA+2b7JlcK6N5xK`2nxj%dv6^=9Vzszx^Nsf>75XkC(v07d@|I{upGK*dkq-+6 zyS^vSf%Wli%{Fv%8vuA}z|^{nxAK-1dAHwv1{5l7Qq_-W3suGVv+qvnHH1yIQ`{hn zKV=Ame}FY3sx1k-IIE5zhD_v>*G#zkGh6=n{C*UW;?r_c3s!0+a;3@}>(`!su($y1 z$rpK*Ao;p>YP+VZdCX_+Z^N8Wk^AFzKRJA7NaW_(V6`ZP0M>#2P)~C4FEi4(ah_c# zM}oXk$Q6xS+-AmF-oiO3G-YB7RU%tldaOo|1K5bvQ1J*|3oN?eH3lWtn?t}!GBp_V z-G3KT;&aj}jm?{Q@~-dJEr!X0rSu>a%$fPNIKg<{BXJjoM-B;**G6e&jukwF$3(_z zwgxX$PZNY%GK&}-XUcGAeuS+^(YxAyf=smXKUZMCkaiKIyB|Ijvc8Q!eQj#Dhh3?Wt{AV@mJ`;NqB-hTZ2ICycBR7H!VmiKv`1)Bb1 z4YUUBCMqLTvb?hFdR(ZxW}D6s)rWiyEW&s5JkND*A*!yx#5PHV_D&1Jf#18gJxDz= zaY+5GLbI$DNVw0gHbMoRxmpw}Bv&-$1br^{h}YL zeHOc-K?Ed{z5?YXzCjgM3UKu#Dm7|Mng6}i;!H6ve8{5FD-QFx#5%V*TmAv9VI zjo2w6ybC>E5R9Nz$BZiuje$%|jPRBN?DrZD6&}O}p*3_ma2Tv^lgY8LGmV8uxb?Ol z%Vm8DV{J|*AS*lLf47gGV2y1ZiHFi^1oUBX>jhKJ-?B>3b!XW6KOCw~X}GV(tkiAh z_bs0O+=4`jdR`R9HqcRETTh4W4Fw`I8Vir%xzFEHaSb%~=VQAYyDkuoNNg}53HAWmg`^IPp_202~lV<+CLb?r^xt4fyd-|yGnwDt_5`5B>a2Z3P&JLt) zaACwIm(Oi*e*2H3;dgld##!p{N7HS0|`619If7S{+DZqTbpKycr;2YS0f z@aeyCLu?faUep>z7(`d&1VATp&{RSUKQ4LLIymgg;%|eJP5cg#$C|GDMCHPS5fCW|38~pL9YQOaG-A(R-%aCh0qKRI zo?2dq41CT`NW$|aM~yapVBr(69=4jI$$vk2BNO@yXWf>^B$0}IzUzI z%JY@E(?Zfhw0W3vJBTI*y>RB|V59UZZoe#5{2m{AfSx)*cH}fz;{Q(pFo#^DTm!?B z8H`Qp#6O4pZ+kBy{5{%C3@QLMiswIWJBw$FSqR9_5~{8*C`FKN+gEgg9X2d$!8L}p z=2nRCC2<*wT>Rk+`jM~lWHJ|1KAup$o8{w?wJm}?$;_(!CxOygZwO;|z69j%y#}c% z$`}b#B)u&8EbD!5Rb{spBzGELZ_AmYd?L>&KP!k z&1xG`jgB`9hapO5dSy#$e322{0`E!yhs)}yjR1L8UYEuKI_|Cge`VKMjq3K)lY_59 zQ1Wk-vkPiT>X4BcF6Qiu5mU5s3i_7)70Z++@ zv)goSIsgJ}3`__8Yv%>nfi3DzkVB)C{t0>TgwTtQSC9BM5@;ro2AAC>_p8NCc+Dy& zc@OzncPSk}p|P3uOQ^A@!L~>S)6+ycR|&ocB&R)?EXT9pg&X-gm-|8xE)A*`Qn3{A zuFb~9mgeEWXg;eClPA3%AFhEqnT;X_lpz_(NNeOtDBDw)*^>J8&UBU8MXF6n^=+Bw zjtCx-p^FGA*E3P&Do&AQYX*Y;w}*Mm{TKP3%2=Jkm*P(i!q zpbOr8)S^#N<>)v@U4H(-Ag^3YE&Pix;t#iOD-0}y%T3s_dOw``d%vv&+%d3cAxb6~ zfYPc4XCane!#bF14QyH9+B*nO=s$i9n2I6!k^gto$U2sYbe!x?J6uat2{)r{mL(z;;jnS z0Ce5N64io4ys8FG$*&|$DY&7rGR0o(4H)VKw(!b1EMSoLBd?2_I;{I^7~+g=`+{wJ wwAJiJTE?}T<5s<8EK>~ELCE55dB1Eg9ANCQGt?Q*o1g76%(Fe2`tt [bool; K] { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardHashDomains { NoteCommit, + NoteZsaCommit, CommitIvk, MerkleCrh, } @@ -96,6 +109,11 @@ impl HashDomains for OrchardHashDomains { pallas::Base::from_repr(Q_NOTE_COMMITMENT_M_GENERATOR.1).unwrap(), ) .unwrap(), + OrchardHashDomains::NoteZsaCommit => pallas::Affine::from_xy( + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.0).unwrap(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.1).unwrap(), + ) + .unwrap(), OrchardHashDomains::MerkleCrh => pallas::Affine::from_xy( pallas::Base::from_repr(Q_MERKLE_CRH.0).unwrap(), pallas::Base::from_repr(Q_MERKLE_CRH.1).unwrap(), @@ -108,6 +126,7 @@ impl HashDomains for OrchardHashDomains { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardCommitDomains { NoteCommit, + NoteZsaCommit, CommitIvk, } @@ -115,6 +134,8 @@ impl CommitDomains for Or fn r(&self) -> OrchardFixedBasesFull { match self { Self::NoteCommit => OrchardFixedBasesFull::NoteCommitR, + // For ZSA note commitment, we use the same `R` than for ZEC note commitment. + Self::NoteZsaCommit => OrchardFixedBasesFull::NoteCommitR, Self::CommitIvk => OrchardFixedBasesFull::CommitIvkR, } } @@ -122,6 +143,7 @@ impl CommitDomains for Or fn hash_domain(&self) -> OrchardHashDomains { match self { Self::NoteCommit => OrchardHashDomains::NoteCommit, + Self::NoteZsaCommit => OrchardHashDomains::NoteZsaCommit, Self::CommitIvk => OrchardHashDomains::CommitIvk, } } @@ -131,7 +153,10 @@ impl CommitDomains for Or mod tests { use super::*; use crate::constants::{ - fixed_bases::{COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION}, + fixed_bases::{ + COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION, + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + }, sinsemilla::MERKLE_CRH_PERSONALIZATION, }; use group::{ff::PrimeField, Curve}; @@ -192,6 +217,22 @@ mod tests { ); } + #[test] + fn q_note_zsa_commitment_m() { + let domain = CommitDomain::new(NOTE_ZSA_COMMITMENT_PERSONALIZATION); + let point = domain.Q(); + let coords = point.to_affine().coordinates().unwrap(); + + assert_eq!( + *coords.x(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.0).unwrap() + ); + assert_eq!( + *coords.y(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.1).unwrap() + ); + } + #[test] fn q_commit_ivk_m() { let domain = CommitDomain::new(COMMIT_IVK_PERSONALIZATION); diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index 1079e4a6c..63da3a5f8 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -2,6 +2,7 @@ use blake2b_simd::{Hash as Blake2bHash, Params}; use group::GroupEncoding; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; +use rand::RngCore; use std::hash::{Hash, Hasher}; use subtle::{Choice, ConstantTimeEq, CtOption}; @@ -9,7 +10,7 @@ use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{ NATIVE_ASSET_BASE_V_BYTES, VALUE_COMMITMENT_PERSONALIZATION, ZSA_ASSET_BASE_PERSONALIZATION, }; -use crate::keys::IssuanceValidatingKey; +use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] @@ -86,6 +87,17 @@ impl AssetBase { pub fn is_native(&self) -> Choice { self.0.ct_eq(&Self::native().0) } + + /// Generates a ZSA random asset. + /// + /// This is only used in tests. + pub(crate) fn random(rng: &mut impl RngCore) -> Self { + let sk = SpendingKey::random(rng); + let isk = IssuanceAuthorizingKey::from(&sk); + let ik = IssuanceValidatingKey::from(&isk); + let asset_descr = "zsa_asset"; + AssetBase::derive(&ik, asset_descr) + } } impl Hash for AssetBase { diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 18024afe8..995b13693 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -17,7 +17,7 @@ use crate::{ }; #[derive(Clone, Debug)] -pub(crate) struct NoteCommitTrapdoor(pub(super) pallas::Scalar); +pub(crate) struct NoteCommitTrapdoor(pub(crate) pallas::Scalar); impl NoteCommitTrapdoor { pub(crate) fn inner(&self) -> pallas::Scalar { @@ -41,7 +41,7 @@ impl NoteCommitment { /// Defined in [Zcash Protocol Spec § 5.4.8.4: Sinsemilla commitments][concretesinsemillacommit]. /// /// [concretesinsemillacommit]: https://zips.z.cash/protocol/nu5.pdf#concretesinsemillacommit - pub(super) fn derive( + pub(crate) fn derive( g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, diff --git a/tests/zsa.rs b/tests/zsa.rs index ec53b93eb..ca8c1b874 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -259,7 +259,7 @@ fn build_and_verify_bundle( }; // Verify the shielded bundle, currently without the proof. - verify_bundle(&shielded_bundle, &keys.vk, false); + verify_bundle(&shielded_bundle, &keys.vk, true); assert_eq!(shielded_bundle.actions().len(), expected_num_actions); Ok(()) } From b4f628133e8c6cdbc05038b312abe78f0ce7ba10 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Thu, 25 May 2023 16:01:50 +0200 Subject: [PATCH 28/67] Circuit: Use nf_old_pub to evaluate new note commitment (with rho_new = nf_old_pub) (#62) Currently, every new note commitment is calculated using rho_new = nf_old = DeriveNullifier_nk(rho_old, psi_old, cm_old). For split notes, we would like to evaluate the new note commitment with rho_new = nf_old_pub (a random nullifier which is stored in the instance nf_old_pub). For all remaining notes, nf_old = nf_old_pub. As such, implementing rho_new = nf_old_pub for all notes will not affect those remaining notes (and only affect split notes). --- src/circuit.rs | 28 +++++++++------ src/circuit_description | 58 ++++++++++++++++---------------- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 9b2f9b766..7d5cb389f 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -459,7 +459,7 @@ impl plonk::Circuit for Circuit { let ecc_chip = config.ecc_chip(); // Witness private inputs that are used across multiple checks. - let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset) = { + let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, nf_old_pub) = { // Witness psi_old let psi_old = assign_free_advice( layouter.namespace(|| "witness psi_old"), @@ -524,8 +524,22 @@ impl plonk::Circuit for Circuit { self.asset.map(|asset| asset.cv_base().to_affine()), )?; + // Witness nf_old_pub + let nf_old_pub = layouter.assign_region( + || "load nf_old pub", + |mut region| { + region.assign_advice_from_instance( + || "load nf_old pub", + config.primary, + NF_OLD, + config.advices[0], + 1, + ) + }, + )?; + ( - psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, + psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, nf_old_pub, ) }; @@ -754,7 +768,7 @@ impl plonk::Circuit for Circuit { }; // ρ^new = nf^old - let rho_new = nf_old.inner().clone(); + let rho_new = nf_old_pub.clone(); // Witness psi_new let psi_new = assign_free_advice( @@ -851,13 +865,7 @@ impl plonk::Circuit for Circuit { nf_old .inner() .copy_advice(|| "nf_old", &mut region, config.advices[9], 0)?; - region.assign_advice_from_instance( - || "nf_old pub", - config.primary, - NF_OLD, - config.advices[0], - 1, - )?; + nf_old_pub.copy_advice(|| "nf_old", &mut region, config.advices[0], 1)?; is_native_asset.copy_advice( || "is_native_asset", diff --git a/src/circuit_description b/src/circuit_description index 247c89889..32ecbe8ea 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -28887,48 +28887,48 @@ PinnedVerificationKey { (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), - (0x090c0e45d81111bd494b9ce7c16fb0e0bbc953911c1701e42a5de5f36389afbc, 0x23ab5bd08aed9eee6c7e78f15652ef51633694b92b1632f9e51ccd31b286066b), - (0x10b2c2af49d17b962211ad5bbb682532940839026d0d242b254b907a50d136ba, 0x1a59a77fd094078d6075a3bdb691bb0b8808a97d2e06092cb6afa767fcdf4cbb), - (0x2b98cb6188d5afb90a5bc94d9f6c23086164284107dfb04a4504b61833a5f9dc, 0x205725733d9c55704a574a244fd4c0038e001261c9f978a2ddbe2ffd33bc026c), - (0x31711515cf172b14651f22ff63fa42011b6de4daa3b71e28a0ce57ae65be3e18, 0x1da5bab80180265242efdfe09c64caf1e987a16384d9eb3bf80343cdd0154dd4), - (0x33548b13c1aeadbbebeced0618b28498d0f95cc26a0413dc6c6b12d305bc9de7, 0x04769755bd24a459f3b86018e78e1f4d14796ba33aa7a08684529e47860f215c), - (0x03e2f4d89dd13482c272721bcffc31fad53b5deb7f402cc2522d2c10cda6bbbd, 0x3b5af207073d98eb42123895069f5a1b726a476ad1ec2945ea63395c284447ec), - (0x3518a704cfc4622b72b4ff3cbc7382fe91fcd77d861e4ef7f2a9830150066746, 0x12639d3e4aa8d1d82cd591fa2e58b1679b677e5e99711a733746dcd47b36a987), - (0x035cc4fa63ce607b7dfdfc08beb5380e3f837090ec4b812b1772ad03ca97156c, 0x14e9d0f3ffedac7d9857fc47f68ccb943f602577a0037e0e3c972b9996f96d71), - (0x00f8d7b4c395ef38584c0182319952b12a25f9d51b75293d4c62f7a5f4405a72, 0x37fa03464d244314d298ecfe5ab9fd9d99d63f38e6c6d54b97efa04b3acc6fb4), + (0x340633bc671d4839c9245701bd7877dffa14caa8516fc2b2d97ab743abff31b2, 0x2d44e13f4cbd8767746e33ca3780ca730de2e81c68fd2eac2856405c810ea835), + (0x0686df606b54c901940689a81e292bbf35653bed36d07d565e6c1bb2f04f7f16, 0x109273b534b0bcdf7d3b651b87631202e692e9799f300b93bdde0c1084644f98), + (0x3b5c55541e5ecbed649a67e81c69ecf846b0d8bb5b3fb0dca7cc855508a60291, 0x2c2d977d9db18dac2bfeb6863e04603fbe577260b77d83de7a40440d0d7e96e0), + (0x377b4690b84709cca9b5f7557a4946907582090395704a279bc3d0474649649c, 0x19d8a463645acaf5e80a0eae028da3175fe3fd07a8afa7b357266951fabf15a2), + (0x01b35d8bd7fff98c6eca9e68b04159d9e04c8c97ee823cbfb25c72759a0f1bff, 0x2f690ea00d11748a56994db1d5086cc14feb4e182950aa3bd78a5e7c39f1c438), + (0x14322512145256db0a887e0d44cb0ca576d199cd60dd6c0fc592974f5bfc982c, 0x14f0d717d83c30687335f599f0e0b313e1f908d8cb539273271d61b6c0c7a977), + (0x2cfd5a6eebaf22de42df01c35ea51d5149528799a4dae214ff5ea4964384549a, 0x0241a066241ababd11a9d336f30a68d2eb40b15a1a74ce7ebb8284818341195f), + (0x1a104a92aae262af0c12ae8e460b8a050d0609236881b44523a51ade8d58fb59, 0x1b4826150f81242668cdf5ac67894f1aaa4f958b4e26af911fcca643c4cd5265), + (0x1973139bb6cfd1f498c01fda7934f1b9954a52bb7e3778814745f73a03f1ec21, 0x0984409ed6f0dfbf0b25a658c4838327096519bd700e0b7ccd69528d971da6d4), (0x3c0f3f0d7b2306490dac7d578d4846c63adcc76988ce322d8691c3b8b5b0f623, 0x12d81ca672a1c18f6e0d9b7eb8fbabdbe450fae6667cf349c1a0e63ca9a0824e), (0x27d13b33003ffddcd36efb731fe94db93d181bd994e0c057e945402bc8501789, 0x0e1dde94ea3b35e0d0a66350163ba2ff9dd5070500912b7d076747816965ffd2), (0x3049e9c8a3e6c7fe628660121f04915e03546b7a2dcb8a3e59fa99546e4f7f86, 0x2dcebc740917584f788b776f4cf1e3cd96b4a29e9df7224fd8e5f428d4112546), (0x245ebb4ccefa7c4e2d5a9d7b1746b8277abc25f74cd11b2dbb752d49612f248e, 0x145f605111205a7c3e4620ac035b3cccb6375f8d3c3469b7900e427607c401c9), (0x1751912a19fa0009ece61b686342d6b4385415e942159e8db3f174ad24d612b9, 0x0f31114ef566211d46914d0bc2d1a27a0e34eeda04dab53a0af7a37024f057a1), (0x091c6c4854fa5d9ed8a966f2a1c4946b41f6872de6c19fa8b521a0a8eb2bd899, 0x29100b4e15344d750fae4a81c82faca1e8e0573336b1f54b394946e95e7baad0), - (0x210297af23386f0691220f2a0e3504336a815cdba5167277a13f0a7b992b8e43, 0x2a184bc5b1981e303cbc0a18f4a01b4dc49695b9a319bd7e713d55e46d1235ae), - (0x05cd80ee69394fb4efe616ef91593c3b8e6e142f2269524f01476ab78a67c9f6, 0x23a7840c00619fe55078a6bffb8a061913f929a7669861ebe99859a48136f12d), + (0x1a5bb6ffd1af2165203df63414021a531f0f2bfcec85443a180993cc222b40af, 0x0d6b8b0d2363607d15746434b670008845ed0524406c1d8a221cb6f58ee2d4ed), + (0x3b31f6e48472e06a9f21145e3a37744fa0ceb6188485ce44b1a131ae47661e17, 0x382d47f03a6703a3018d8582a6123e0e61c549d695f1e2a40bb578bc2ca0e6f2), (0x34c8b83a2cc924f1b0237978c8f911e6a54375c509ba46456a011fbb74c8698c, 0x260cc681c222535c0030f702172ee8855b681c16d706b1b9a786165e06705de6), - (0x3dcb136a22551e524212c0325331a9dae5ad6ff356175e6b82a54039475be1ef, 0x3bbbd0d20ea0ebb0f36d740910947d1934bcb93ba16325ea42f124ec0cde7a81), + (0x1b7a61e8a9b32fe558433feec9aaf51204e5486aa468d7215087ed35fd6ecbe5, 0x1f36dc6852f92c141ba800f721d079ffc553c7449b85d16e7487e0c3009c7835), (0x3bb657ca32617e6242b6c6a0b166a1db205024d0441d091b8d45fb478cd4782c, 0x3189ce1b97103345fc0eafd287eed80ab186151171f22af2c9befc71a0957529), (0x25578b0a6d546cf38dc84329fad41e59690a2bd94a0db5fddb42e0db8c267827, 0x03448e4552625dda62a96318bcafcc305deafd6a028f8379d8c8d9ffa0f86e64), (0x30d1828d7463255ad75b39ee4c718de05a762c45c5d717d059496fe05d1575b4, 0x0a8eb70a9b252ee9ee57b29e4dab191cbb29665821830b2ab60fdd5d3414de45), - (0x2b18121165b0ebf2ab46c207d973f44f135c24efecc1cc48d47d38769969aa2e, 0x1a829739cf7eb6422f581f64632c65073aa49819e62e80489b6aae61e6edd6a0), - (0x23ae57d2095a4324262aa76f345fe7bc21d8ad7b3203a8167bf8315e64a11d25, 0x1a871041d826e0e3bd7520e03dca1f56211065b049b2bebc59d8e01b4addb1d3), - (0x029871a070ccef21bb6d1d5d7e51597b0dd8f38208f1b304bd372b48aaea0a3f, 0x3205e4b0ab706647e6f45cf2b2091afd69636a8f61426504983bf44d47d676ec), - (0x0bd7a66e0b566e724536f77fe659014db82286485859c1ae9d95f42cb898f763, 0x358962c131dc5dd41db0fe6a8fe5315b75dd9204682d1de05470184c8a331a8a), - (0x336245b9b67f39852776a1f6ba5072ad3776f38d9b0659568d3afb2e6d3750d3, 0x1ae68f5f91a6d28b62a9fb9240ee53f86e0ac434286429024c253bf85325033e), + (0x21c6cc32a998a56e0184238756f9bc06c034326644fa797d58d37a4ce04862ad, 0x0a3215ded9e38470be699055ba4776fda0751bc3d0b893e49c71f2817e12c354), + (0x2b8641a13009b6e2c57fb902961c97d5a37fe9e7012c48a27e644ab86c6e798c, 0x31dc90911a15d74e74ad51ac80cbfca12b1eb06038bb3d5aecc0498c5bd5ff68), + (0x10b4ec889583134fa09dc3e6f0fac585f2dbf6dddcc1eea2c95bab4b8de05be5, 0x0eb4092d1a27658602828702d73145b842f9dbe4b113b61b10049ebe406d625c), + (0x0b9493ff319556d1792c2b1ccef1c52d6097620601b22c8a6cc9f3da9608a3df, 0x098fabd4f3443138f8c72fa5991a7012266cd3d574a65083a611688aec7c631d), + (0x2574aa02cd03503fc37ade3434a4d426f97f94e5f98ae5ea8f3d1324589670a5, 0x22b31bec6726ce49ea837dc05d3576d2e71536ada0d7db4efcd06c34b2129e2c), ], permutation: VerifyingKey { commitments: [ - (0x1dcbd758066eec5488296ece96ea7fd0eb814479bf5cf04418c109e0c6e3b65f, 0x16f9507e843611c3891c03a5acbb47cb2d8c591575911c12815cb1e031cab8af), - (0x2388cbed968c22e32b6bd4a1b2395ec1d940135e0136e1df5600f2d759748a64, 0x251608eff7019c64b80df6b45d2a561208e59247da23c0c41f29268ebebcc989), - (0x25d09b3bd46f027633197dae5164cb90c8cf4358598bcd747791b9d95370b1e3, 0x0e94d8861f8b7a6c4f7edf780b131fe2b89757c46cf0b2da24a3592c8824c692), - (0x019398cb329abefa110b3c4d12af9685272f7a611599f5e9c54cd644f0882a51, 0x2a5d9081f77f6e389a355fcc45425a3d4d6de28cb34b26bf54ba66fbd34b8f86), - (0x04596f22bde8d6e02fa2426ea314dd115fd757bc58a60e7349669dd090e5d756, 0x09ead6fcd376d620681f3b14c89337d25ec795cde09fab7da0376bf07bbd402b), - (0x0f7bd41cab58414151f520efc629836da3052d911e95ec09301e25a36e10e9fb, 0x008998b3c16c01c66bd471eca4c16d87adfa0856886b11bff2d04e281e45f234), - (0x122e03591cfc43c812fbfcd45a3062d845b6beecd5e9591fc78cd07734fd5eab, 0x3bb6a66ca91558265efcd59482b2f016ccd34e6b916410e5a198e142ff9257c1), - (0x1656a1c579376b8b92f00c907dc544843231a13b0e0b58be652c9ef44e0d8957, 0x0608dca2d8f9ad5ce0d7b0545a3d148371e4e3993249db87ae4e8a95034e330a), - (0x1d8dd2ef5d363793653c385ef62f382f48d21234caf6dce0806f9295d0f63f47, 0x3aa78867d1d8cc02a50e0ed804a07b0572ae191f0b1c495072fd11f6d2aea2ef), - (0x2cb9fe3cfca45f22aab479b9c54d7731bd165a236bc2d0bfea9af9bdaf8969eb, 0x2acc3469ecb12ba57992881873adeda3f8380262977b53175a99f4009d082405), - (0x1f56f0d66eb5c9f86a680efda44e992322f4934c10b83895ffe60aca9305c5f3, 0x20cb980461e94d5e6a5b5beaf4361b77680f5cdd4f3c4398473aeaca212ada1f), - (0x3f821ad8e7fe3fb349c6e9b316bba2505648a219f337f9e5f1265572b606fb4f, 0x3f4472a3137db52586f3adad1584ee57dc0946595c62f6a39420183814cb3a42), + (0x09d1106babba44f67eace95337e3b9916cf02d0b143d5993cf212ba4fa6e2d81, 0x2046a60feac842a629a24189de9d914da26b2254440c142cf851f6d4d5c586a4), + (0x26086868fee3f97d3171042e8ad377782aa845dd3e5c6c86f5d1251b41b8ff03, 0x2f60015e46a7e2bc0e30413be4782c648ec5e9dedc92ce9052fd2857a779a4cd), + (0x00d54c6162e5654355cbaa6951f86836cea891242793df30e4ae74d522747d01, 0x0f9d6c7108000d07ff766c16757c7a02cc8bcaa1ce3001c476bda543db4b52fb), + (0x131a626c24a64b23cb9a554921462f8b3848294a5a12110528b11362fe80f59c, 0x3e8076404262e3d7b5a6d2a3dbdf0fb151e2f3fe4a9239365dfd63853bfd8b8d), + (0x00aae2c83a8cb88fd04c9c631ea69362f38d41688624f519c6aab8fb15110931, 0x0294f0e5b376a7bc9fd190f34c00201c0ffa2a019148d27e1a578effba915450), + (0x2022cd25023adefba897a064d43365c59df92f547eea992189040ecf23eb1b89, 0x2d5ada0189acf8d400ed967e8537e7de7979d2bd6ad5430aa009e200edcad889), + (0x30e4290b63621db78bfadf242ac8a940179ddd601127f4fe05df818dda0de8b5, 0x13ab4dd58054df7dc7c4e59fcf5745373889113fccc60d8a79957dcbc4a1a79e), + (0x17ee4b08749d802b2cb5a8d72df1d27c4a521293347698bac389f473f573888f, 0x19efafbfa1bc8c4e62cb0d8893905ac7a30da08a9ffc18ac26f741c6419f2fe1), + (0x1a5804444e8f54cdff0f38ee9fc051672b5fcb0cf39cc608e20db884c18c2ae0, 0x11b297659614cacbc3fe5b6b8506d7b31d04ec061329c791714478f480215263), + (0x22bbc74dac7b42add29982d2d276b548b38b2fdc8628d4fd331f5d09cae93881, 0x0808f95123e9339e6643594561b28d0a4b6d7d52bdf0b60e3ab698336cfefe06), + (0x07201f37d78f79f85a69d9333e60682fd709fcb7b9fbc843d0baef7885a79246, 0x3b01c7b445dd60b44309c172d55cd2bfed068fa420f8c2cbf316eac3bda6985b), + (0x3998aad0ccd62e9339c4ca91363bec2524ec945bb780efd9984fec68b4f51efb, 0x32cdaa4c65f29fa0675df2196f3190b849dd1dc4a48d615602e57b282cb34673), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index a6199f11455998fbbe3d3b83f1149313c158b811..7fe92dc3d1d910ff5b4a2044c05f15fa7afb872c 100644 GIT binary patch literal 5250 zcmV-|6n*P~xU_b;fhbt`k_*LOM;@_`#gb>k&yej6H_8dei)K5i+*|`g8yfmp$BEVq z23+KO>Dh8*7?A{o1c>_?cykn-_tvM}{pSTSdvd4jx%6dB8vlM9Ax#Hm=#NEr-axBt>wd& zPX15lxd?gBv4j+s--^^kI4LK4-W{<^$jP58o;7rNt`h&~?v5~Wf`*MHEX_2}hpnz< zbYWrN3f?yL0g`_wO5+x)U*$aF|Ns7ta++hlEs2}-BiYkw1fhlPsAoXbkwto!&Ygy@jDn3v`8x#F_we3V$+Ho$0yQ+=$Vap?9pB zJeU7N{vjp7uPl&_I{&IM0(c-)#j9D~1U}?7R4C*!T9sE=Vh=Wz zjkyokA5|`^ltR}jT@AdC!*{A&v&}AhVEgEhy|zrn?yw^Jtjac2H$bsrmrGx9d5GJ* zz`Vz<+LiUga?dJ^c=o5#bJuKTtY~s8mxuO zk_IfSYr~ypatn*3Vu`y)&L9!iHY2)7yXmJ{G!R%alMlVoVPW$NUQJA|#5d7i2?$*JoKs1jc7XY;)Acv*$8 z6S4n~xHWkzuMz81{^RKS;C~LfAJF$+fXIsx(!!+UKADEqCF{>P*&bO)ay5KgUUd z73nj(?w>zbl0NqsQK|U>ngHm6J@=AU`gZ<+2Y_=xPpw4(-q$+F8sh>b{4p@;vj9X` zSNj7+vEIia6sHaHt1HjG>#A9cm) zmS+0qEC|u2&n1awmpLd=7-SL)0^8KxGVEaSQX}xqcuwAsy-+jDgnq9$FY9SkltP2C=n!W$2bgqA_=|Z0g4s-hPw`;bKi1Ew@kE~*uXwH9PE-l_)mwx2-9R@h(B?Di+lMy9K-84pS5_0Dro@f?7AYr`gwl%W%UZ z@oMiNo0W}AB*$MlLkiosqwyY9i9i?*!C(}GlL=)eW+ceHT=LzGqMlQ&bhSn zqfRg=7vJ4sXetB}!c$L5%aa-{n52&vD_Z{?E*%kD&$6o!#E{@Y2cY7EC?2i&vW=U$ z)Dm8hKQY7G{T?|WBDD|J0XGq*dV7(Xb#~$c#E>t<`^Cn2Ix0!s_z$_0Z5ZGp{Y-+q zT^WeRSYlS4+#1wFapqhkM03Fx|qq*VP85B8QNTVQt~jbl{pMiBAE(JZ(BIhcjyMN z5>`ubK^4jrItVj)vS){X0xPg+5kjQQYrk2j_Rs^6R@{DqceyV{&2EI+NF6U1Ug{D+xq}5C$mA99xOIGEIqvdiZ9rHT(8Q+2&DYn8?`J>AEL(XisLX@D-`uOE$6Bjhe(F0Y25m&rPbiDY)e^)<0nk0p zQ}>K_kBE<#6Id17bHmtdOlQpy@$OfsFXSBt3TOZ9Jl9EDj!ip<0rW3D{m~%etvqWW zNoe0VU3&fD5cm&zF_`+8Y#mW#FP3c|$m0mXv+Q$U8dt;Sik5Z+5%k*T^s^{2BkJGv zh0cE*14=%Keu^iK#GgCDNAt+IC0s-SL-;0V2E6k3m2Ayqn>dK%bK%0mDlYx6cGM5q zE=oflAc=;a4rzyPUPNGfw-jWZvRL8uAp#%1Gxd<(KVVs5;e3TgHe&Hz#~V^(o1W0u-YYUAA>YA^8 zUE3pfR<~Rc_FDkMXOwyzHrV{O!~Wj2{9hk==zVgR43ETSMW(;<-Jp_C9(mS1C7up& zn~=xLI&~R>*#_>9d#L5W+-DvCQpp3rxYZ{;JdG&CjY}TGS{{=D62hw~i7`n8EU=sk zGNI_oW+Z?T9w@VIZ0k^ZvN|*d9?utufEktN57ucbNh^S!^{u@M9guLJNC@I82eY&r z66o?mwk#gx?tXSTV>f^KW4@<^BZE~VKRhrU&$=fr6&C^pA+lHcDZz~KHuW8WB%Cj} z325w352-R$O(^DIwkZZ&rkkb<8VQW1()rG;vwD?tJ3y{u3VC|nqN>%Zuh~ssok~cU zz5|sB9LL+_#Y+I$9fD|kt8X5m+gvFy?DWYX)ix}(6j&RM+;2P*@!)tCCwY?o8dV2@gZO@G-g%#xb}NeoWlzb> zB@`_L+gGueLedENTi%$q6p;(IWGe6HY@AxU_wD!NYXnvZ?6@RKe zlyE$_{M^tgOzCUUU0QTVQ#ZW1K{fUF_b6Gh0}@4?hMxkp7UM%X_EZwE%^%DI#j%Js z6Q!$Zi)kEY0p{JMBB_&t=upWg`&L`GUPw*{dGN0r@4mu-0!z0`4!%c}g+CmYRj!8k-}fi4CDy!IoQ1*~N;zBtB}NStIC@gBfzzW8r3qY(CJgRiZh&9F`w z9WsgyEZ&sTL*^4S1BjPGBy$=*BXvlT)dVyb&D}9ABQw@QF;ULw(6(r)H93KWSupg- zDc)GLCN{`RZhR4(9a17!N7qDiOC7&!jmUqGOQ75@=0EUVrkIj7QO<-?0OiZB4UpKp zM>kdIYn;II+Q{S+Ofh@6DzG&KU~wGA`5 zE{%Z6EWaU}$>kjGThnWYs62**9;czVA$lv#YZ0Dz0$O64_22hE8qoW`t2M*YIVC}M7LqmxHh^TrN^`F?1qL}1 zV?DnO#08k0??xtlp|p>niYnmpDG`Z0Y4?N1^q^?B-h=YZqV#f7d=@1Td&3>E*+Gv} z9e8__D4>mH;ohZ|hLN@>-2l+k-0BDE{^HU`|wE zHJ@NTZ7lx;2Znhz4x5Mu(owd35>mssz_>%tKUPWa3d*JO?7!gy+8ypFJEmkzjFEiTrV6>BbWJC{+ zhn%$*q3z7V1BYj81bb=HBntb^q?ga~1ZmcWe0^7o@hl55@>!-|GL4IV^Nvh>9a(O` z%(wu`K+q_I6}oirwwj*=;gw2$J^4`$=93a*<;ACBBKMR6=4-!p)W?_|eJRg;wk)yp z3a~PwxKZu;+wI5lY_#bdg5|Un3~;oM*3VX@>^WyA1Wx8@#ksTCE(_jf7<+Hex%#mj z#O23kQyO@7S@sUY^RZ$S+&Ci29XxQv>J3Ah5%BpCt zylj*R5;(FEuQYkOMlON@gf3ucxV!JM9E*}X>)PN`XQC!)}=czW6t!<1%ex)U;P3IH1z>_)`qCvW*^-yt*J;?LKyWiVmyP)X-9Q3P#EZ$@1oX z7ipY3!0$>{F?kLC&}T|BfCB`V*ZijuYVDj;T>h@7VIK}ZoG+@Td23AR}`T_U6jf! zVpJ4AXfL>+)6C`E6&ZsjqiXUIpY@o;XWwv_8q0^aNhRb=n_4YC;a6DE2bn=sBsa@= z<&Xcy*IkFwNOFH{m3h0e^Wg5B9M?8FAK6rhy(>WummzS|ZR>0vXf92Q8}`F0zPI|s zb;e-mjMWR=khcr^iZ@}sv7%0kzA@03HokB7knj;NM5%yTpA^@BtdM}Jd6v`YOA8ca zBN;Sr6LEZ6g*+)T_bv1FsxHzd7prw@#GqE8ZWtlCqXikE3mR3wDW9uVum;M;gwlR} z*R_B=96cy1LCz&d5{0Wu1{b3b4>o6ZphJ`&hYML0#;maf zOBy)Z=zf^rxiK+pyEYRor_j7s3Ch3lnX_)16@$5xCbgoBRer;4DkRS3@$tU}7yKu-^XxJ8jsY<`=F}dNblUu3dO6B?p{pAz zeAu_((N#plGIC{>-j3YKNTd(VSvx1ph#!5Bwr6L^^+W{Gp4nC=)+ zA1E$fTvFIgX^=Jn0qW>v%WZ7od<5N=zGc=UM}0sZPr0DPKeVIg9q&qU7t56|nzzB8 z?y|2pRCI360fx7B%RRfn{&>T!)%{EEGq_X3cmIwnghDK$!zt+{c;y9S|DoDHh2N4p z25q9J2FAN&Yn72SRMwT8Ew_RwNUaz+xBGt0sNz&aV{69>mB9h9J8HBl_{GK|5i<4K zLBQYvm4;T_eT%K7N5N8V0i%8c6v+v|I`%p#ko9{Xz1_iQLr;1GSAg+Z&;*d*B1UkH zhtD`|gxVW7qs(2IDSprF!BMi7N7RnVE5@Ie2iLuVvVlCQQ%10Uu4Q=IIb=>jXXtXy z&mt+IdW|pRtYCXwJ=k?5Cp}+U=B#y&?1+yY5lGT@_{1}hH39i@$EMq zs8MzDQKAbm)M&QG;M%YIsGhl%WL@TWhQ3|Dw?`hT`n?81HRs2iX2AYtUN_q5qg9xFvP_y zwI8{kPaZ7fCwkJ60SNW%>!Rk9iHXN zyxf0X*;;%^zr!oDm8BI!1+Q9z4F^3k;M^>!r$ttu=*5rG+7g~r9_BS|TvUQI>(8gq zle79M3OOx^oCTK%o$*ZFZqeH!dP)?i={k8r@Z5Emc7v**Tc32lp!V@Wn-i|^L?1_r zT7nUX7GbKP+r}zNge5Pfdg^R25TzgI(`b%XUi&k;6|V9_qu=ALW^JYV+3)xrG;>*S zh62^N{WvbXYXG4X0ESP49MH*SHZy9&A@hyq3=C!B5GFr3oQxwgePf+?E$I!D87S*= z7){=k=Inu1ft@79`bPaK(G$pa%3N) zCvlL%^H9O=>pxRIf>g8zz#^E@ssSu86@|y5 zHr`>@jMKQ4(4zHqUe&!JL`@~iqLvlYeQ6{I0kYBD+}qDEFDiRuuh;J$YI20gLxi95 zE5@f5@nW%WAE-+{MZ^LJ!(o3o*C&F=pAOb##k8WNvPQctdYhqrP zI*u|JSaEw83@Ev6Bp-)S+SZyamAUB?ml)3#DcCQ$;cqM)I2q)9U_$PC z8i!M{KaXjoEv0Gg@v%eE>27mfAD6^?R#AUF`s2Mqyn#{NE9YfhnC1Bg@J4)ONJlFU z<6eClI${h@pwiutTs^^l3H6AkrXF`>$>*T*A23Q&#{Ui_;G^ams(G5rwic+DJE)hQ zGsN0}{lk786p2e~=?O<6sxN3vLV7sEC8RoZ2Yf)@lE&_ssgJ94AE6Yg*MgJ=#&R!V z1=+CZTf9A#GJyya*0Q^Ygk={adF_8Je{%D2bO&>+m;ZKspQ6 zk^cC-Uq0V(yZy%QtmLnho!@vjlYrc(Jin+N*6D%(qCw)hv1c?JaRx10 z)gd}-5xy0k<&6(!F3B+1I0J%qwG^oH`KonzHkx;=b4hfWcGFCu;X$?z9zavbyBon+ z+667<5G}9>R1+$H;iB{=Ix4&J@(AM0Hbb2#Cc4+S*?bMZnFlSKH2$gaZJ@qc8&wO% z(avf50?E&40zz9P)ds8?ps%32iUM$R!9S}>PomGwlkOr89&R=W(MR#(YE}|TOF~ULG~7Dcr-rM$UH5^D^M+sPV*uos5?aH*6BlY!ru^rV z5VhH$;O56X4T8CIlfz8M#JC|Q1L(R8eOiduA7fHl`}zZ`<;hhR|JYp6J*x9v7QX%r zFmL5^rWll!z$@Cq)-A!mXEE9@9-8eFb8evHC9LOoHOP#=2)$Jv(Z-qL#9Jfy{=A$G zcAy0JTz-*LyE@}HJ8K2SE_HvvBxRpB#AYg5$Tk!F^%XL9C(S~8JK zQ1tn24eilU$?qfZc2WnkC$wa7Jr+0quY(cpUT8R*k9#g~JZ6w%SXmDG!fK1iJaDTD zcR#6c6+mZBK{|zu@CyiCB-ZGxB{6zY1CBy&?zO6BxHg{Z?nc8sV;1^Y?W$LKF@-@1 zUA4n(9H068I@>^7K5B!Z!Ym~RI&GCs+oqo^5WIcxGnD2O2ioYZ3Rf>+#vSnQXGoz+ z7VD3nI|}Ux4&6&AgfhX4+zg4dP|In+w3dNZhyw#)8?b40IIoKz9tCvd+D9Ph@#aH3#|66EB~sI{9&4AF_Y>DOtM{>0d?c79n*!7uL=TfwiP3cwDnfT>cF zvOA7e0Dp6pa@V&SZyU^xlp}vIZ#lJ30@n$?tx7}mtN`BFfX!zPLkJ^Ss=NIZ{jX_L z2>l?hDGzKp*yPYze_SZoL+#tGO65~>lF_eI{?I6AT}?Al8WnavrT(CxO|&TNc^^<- zY}#xYDP93qHzG7u>X;042geDB-8i-zU@-v$`!}o@kM}r>W=Q)DcWI3+OmzND3r*{? z2GGPVA`&;~46g{nwUIdJL`z{#GHGuwB#nLfgXDuN`k*UGAB|n!kMy|LXK%`JDskUsrK;=k z4}cWl#tv?L`fkt%CoYLFZICn`Z{sJ@CZzA^xMC=*7)LwWC$xtc$cIrSLn)NOQ9|p* z_pKiJ=Wyr?n4j7CtjUes7rx}^kbk-0qA}~)WHi$6l2wP05 zv&eDd6v~Wl!Qj*u1a5|Al;v^8;EWq@Nmw(mZr4uu;<1;m=EskUF0%!V#!`hf)1JN7 zuMv*2)-DHo7-nhiQm&|;<90-r9Bv+03>5T~EkKtX`d6yp#{jW`w@X;IjyeT|fUS`a zCM5rhL}@DaR4%7*8hFnzphgFq9f9(3^2C|L(lJ`H(831_|AhEyO+~-C8Y%E~m2u zUU@|9_$vR74k27cqi4FN(=vN1ySKLnER(C27SrX$U?U7n<#ccMd1J!$ztYhDfQVq9 zsq6w3%#HLfH}@K2yG+pR%_zJv3$;k5R>cuq8japxgsIK)SG^{a8<3G8YEQb|7{)}y zSEvu)k9DeOz0=LOVtTdOM1vYoz96Ea>d=zJvhn#&dj#U_6j0!LNr8n? z1x}828r$umz1FYs3a@NKQnIIGT}MJtY@B@aA)I!o3f`<#AVj#dAd`GxL2s{Dz&}pX zKP4~rNZ{7cbbc)O8}P}a%(H4Z8h<~brJ&P(pP=`>W~)$sQJguf{c8#*Bi`m$ZOzRy z9x_9z&vQ^;aECvK5Zb?o3};++?AxANII7q6uwN)1r-*Ee87E=iaI-LgbDTa&6b;Uq zLS@u9H-Gv=22L|aRy1GQN*8~T11j89Q)RKD-R>R_l^$V@D7ot>G+o~(z=Ialzmni~ zjsX4gj-%Ct?|WI$tad}W+8`fQg0;$Va+kdXbhI^fEwrvQmSYP6=Tp=G(XP<5KY$^8*EJ1T z*CD#k?8cGoJ5Qzt(}6j}EjLbcg{YIuMo-!!R|5})L)f!c>mlt39JRoT=M?DuLgizg z!i^XEz9;L)i~|e(tut5mSJR$5LbI4)DwM`c;>^a2GFm&Z zJCtgGd~>@}j=m-y?nBZIogA74-iSQo?Z^Y@3TI`~&W&4?FWOFDz;z~Uf0Ge_t&BblOREY)EV<0be|%tKmP@(EJ1VcE!b_t> zLo+UodD%aKxt8$Lwwapsjygy;D}aDvAmewCa;K zx)-s1p(%whJulnK(J|t+NX`P4?RZA|iL~&m4x5+r!xhOMk#zh=?>h=F^0PX~*6c*x zj|66rC{g!zrGEovvDg_2ggnkz@00Ay*hm!`HvH@d`Ig?SPxbx5{R_T(yz8|Ik=ZK~ zqtoMab^?iR2De$(W;*VZa;gv?`@bt*BkUi1KgK8*Ik?fIEy+Oay%E!&$hm_SqR8!6 ztlLNuBZ=}HlDps2b;RY!Ss3VS(~7O(3vCvTs=@#5W_|?J8l$@wBPxJxAL-KkXmhp( z7RSk62<0u{kr^mZB;2>Gi&$QHsxkb!JI(2V(R$JP8h3Y(C}n$QjUS>AWGK7KA&t4S zl55hTKBKym$UxF9=NhH1s@AF|itfOhZT~cFupYfpFK}vQ!1?TnFk%w+%#q3mCa)q( zv)B6$m3FgX5#w}kFp2&4rbOa3{qSt2D3-Bv2n7VAOsDh;usq!-lX@h4hsycam%HtG z<7u4TG0U6_Exc665r*{lsT8&MSk`9@!|-{PdPRx5*-E`ULa`YdbYrUz+yEC)%)tr=Nh(SmAI z1?y0gabfp-)nk9sHHCzffz&HixHm`PZrW~xkqg^|&6-~CF<+faogr=13yDLJdg#eC zFhYxM8Z+{$y;Ga09A-rtJY-XEGV>&PUuFwy{M@>KI!Nxs$siB2g-^G#^-1T#daPeH z?sgw!pD0pcZosFqIeGdbsFv~lAYddz7i0;V&JvNmM3?}nsthyA3u+95y`Sid75r0K zj|w0d)@euy*gJ{-IEXB{*IH`gYZP%;J<>4LhADJqJ&Uc)5cG+Nn&~v)7TkgrIXG-L Ib7Nu#GPHCAVgLXD From 95fcf884079b40e5e1a0f484b09c849799ae2faa Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 29 May 2023 12:06:30 +0200 Subject: [PATCH 29/67] Circuit: Check pk_d_old = derived_pk_d_old only when split_flag = 0 (#64) In the circuit derived_pk_d_old is evaluated from rivk, ak, nk and g_d_old. rivk, ak and nk comes from the FullViewingKey stored in the spent note. For split note, the FullViewingKey stored in the spent note is random in order to derive a random Nullifier nf_old. Thus, the constraint pk_d_old = derived_pk_d_old must not be checked for split note (split_flag=1). --- src/circuit.rs | 63 +++- src/circuit_description | 588 +++++++++++++++++++++----------- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes 3 files changed, 435 insertions(+), 216 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 7d5cb389f..4db6a9fa7 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -225,6 +225,7 @@ impl plonk::Circuit for Circuit { // Constrain split_flag = 1 or nf_old = nf_old_pub // Constrain is_native_asset to be boolean // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset + // Constraint split_flag = 1 or derived_pk_d_old = pk_d_old let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -261,6 +262,11 @@ impl plonk::Circuit for Circuit { let diff_asset_x = asset_x - Expression::Constant(*native_asset.x()); let diff_asset_y = asset_y - Expression::Constant(*native_asset.y()); + let pk_d_old_x = meta.query_advice(advices[6], Rotation::next()); + let pk_d_old_y = meta.query_advice(advices[7], Rotation::next()); + let derived_pk_d_old_x = meta.query_advice(advices[8], Rotation::next()); + let derived_pk_d_old_y = meta.query_advice(advices[9], Rotation::next()); + Constraints::with_selector( q_orchard, [ @@ -285,7 +291,7 @@ impl plonk::Circuit for Circuit { ), ( "split_flag = 1 or nf_old = nf_old_pub", - (one.clone() - split_flag) * (nf_old - nf_old_pub), + (one.clone() - split_flag.clone()) * (nf_old - nf_old_pub), ), ( "bool_check is_native_asset", @@ -308,7 +314,22 @@ impl plonk::Circuit for Circuit { "(is_native_asset = 0) => (asset != native_asset)", (one.clone() - is_native_asset) * (diff_asset_x * diff_asset_x_inv - one.clone()) - * (diff_asset_y * diff_asset_y_inv - one), + * (diff_asset_y * diff_asset_y_inv - one.clone()), + ), + // Constrain derived pk_d_old to equal witnessed pk_d_old + // + // This equality constraint is technically superfluous, because the assigned + // value of `derived_pk_d_old` is an equivalent witness. But it's nice to see + // an explicit connection between circuit-synthesized values, and explicit + // prover witnesses. We could get the best of both worlds with a write-on-copy + // abstraction (https://github.com/zcash/halo2/issues/334). + ( + "split_flag = 1 or pk_d_old_x = derived_pk_d_old_x", + (one.clone() - split_flag.clone()) * (pk_d_old_x - derived_pk_d_old_x), + ), + ( + "split_flag = 1 or pk_d_old_y = derived_pk_d_old_y", + (one - split_flag) * (pk_d_old_y - derived_pk_d_old_y), ), ], ) @@ -669,7 +690,7 @@ impl plonk::Circuit for Circuit { } // Diversified address integrity (https://p.z.cash/ZKS:action-addr-integrity?partial). - let pk_d_old = { + let (derived_pk_d_old, pk_d_old) = { let ivk = { let ak = ak_P.extract_p().inner().clone(); let rivk = ScalarFixed::new( @@ -696,22 +717,13 @@ impl plonk::Circuit for Circuit { let (derived_pk_d_old, _ivk) = g_d_old.mul(layouter.namespace(|| "[ivk] g_d_old"), ivk)?; - // Constrain derived pk_d_old to equal witnessed pk_d_old - // - // This equality constraint is technically superfluous, because the assigned - // value of `derived_pk_d_old` is an equivalent witness. But it's nice to see - // an explicit connection between circuit-synthesized values, and explicit - // prover witnesses. We could get the best of both worlds with a write-on-copy - // abstraction (https://github.com/zcash/halo2/issues/334). let pk_d_old = NonIdentityPoint::new( ecc_chip.clone(), layouter.namespace(|| "witness pk_d_old"), self.pk_d_old.map(|pk_d_old| pk_d_old.inner().to_affine()), )?; - derived_pk_d_old - .constrain_equal(layouter.namespace(|| "pk_d_old equality"), &pk_d_old)?; - pk_d_old + (derived_pk_d_old, pk_d_old) }; // Old note commitment integrity (https://p.z.cash/ZKS:action-cm-old-integrity?partial). @@ -933,6 +945,31 @@ impl plonk::Circuit for Circuit { }, )?; + pk_d_old.inner().x().copy_advice( + || "pk_d_old_x", + &mut region, + config.advices[6], + 1, + )?; + pk_d_old.inner().y().copy_advice( + || "pk_d_old_y", + &mut region, + config.advices[7], + 1, + )?; + derived_pk_d_old.inner().x().copy_advice( + || "derived_pk_d_old_x", + &mut region, + config.advices[8], + 1, + )?; + derived_pk_d_old.inner().y().copy_advice( + || "derived_pk_d_old_y", + &mut region, + config.advices[9], + 1, + )?; + config.q_orchard.enable(&mut region, 0) }, )?; diff --git a/src/circuit_description b/src/circuit_description index 32ecbe8ea..ffb19ab6f 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -913,6 +913,188 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 18, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Advice { + query_index: 17, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 19, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), Product( Product( Product( @@ -1057,7 +1239,7 @@ PinnedVerificationKey { Product( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -1066,7 +1248,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000400, ), Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -3675,7 +3857,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -3701,7 +3883,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -3919,7 +4101,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -4480,7 +4662,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -4506,7 +4688,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -4724,7 +4906,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -5223,7 +5405,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -5239,7 +5421,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -5250,14 +5432,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -5266,7 +5448,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -5558,7 +5740,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5584,7 +5766,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5786,7 +5968,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5907,7 +6089,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6059,7 +6241,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6146,7 +6328,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -6162,7 +6344,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6173,14 +6355,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -6189,7 +6371,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6315,7 +6497,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6341,7 +6523,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6559,7 +6741,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6696,7 +6878,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6864,7 +7046,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -6948,7 +7130,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -7048,7 +7230,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -7060,7 +7242,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -7076,7 +7258,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -7088,7 +7270,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -7193,7 +7375,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -7205,7 +7387,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -7224,7 +7406,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -7241,7 +7423,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -7253,7 +7435,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 20, column_index: 9, rotation: Rotation( -1, @@ -7273,7 +7455,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -7468,7 +7650,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -7668,7 +7850,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -7778,7 +7960,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -7789,7 +7971,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -7888,7 +8070,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -7914,7 +8096,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -8029,7 +8211,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -8064,7 +8246,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -8198,7 +8380,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -8233,7 +8415,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -10595,7 +10777,7 @@ PinnedVerificationKey { }, Sum( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -10701,7 +10883,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -10710,7 +10892,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -10727,7 +10909,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -10736,7 +10918,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -10832,7 +11014,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -11252,7 +11434,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -11620,7 +11802,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -11965,7 +12147,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -12310,7 +12492,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -12850,7 +13032,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12860,7 +13042,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -12871,7 +13053,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -13006,7 +13188,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13016,7 +13198,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -13027,7 +13209,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -13162,7 +13344,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13172,7 +13354,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -13183,7 +13365,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -13270,7 +13452,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -13286,7 +13468,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13386,7 +13568,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -13477,7 +13659,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -15067,14 +15249,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -15094,14 +15276,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -15120,7 +15302,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -15161,7 +15343,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -15678,7 +15860,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -15797,7 +15979,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -15809,7 +15991,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -15923,7 +16105,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -16041,7 +16223,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -16050,7 +16232,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -16058,7 +16240,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -17454,7 +17636,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -17584,7 +17766,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -17690,7 +17872,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -17900,7 +18082,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -17912,7 +18094,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -18042,7 +18224,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -18053,7 +18235,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -18409,7 +18591,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -18420,7 +18602,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -18771,7 +18953,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -18782,7 +18964,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -19115,7 +19297,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -19144,7 +19326,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -19610,7 +19792,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -19740,7 +19922,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -19839,7 +20021,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -19944,7 +20126,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -20049,14 +20231,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -20191,7 +20373,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -20349,7 +20531,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -20464,7 +20646,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -20585,14 +20767,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -20874,7 +21056,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -21032,7 +21214,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -21147,7 +21329,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -21268,14 +21450,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -21411,7 +21593,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -21422,7 +21604,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -21580,7 +21762,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -21695,14 +21877,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -21816,7 +21998,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -21937,14 +22119,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -22215,7 +22397,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -22500,7 +22682,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -22743,7 +22925,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -22864,7 +23046,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -23106,7 +23288,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -23118,7 +23300,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -23264,7 +23446,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -23275,7 +23457,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -23679,7 +23861,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -23690,7 +23872,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -24089,7 +24271,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -24100,7 +24282,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -24481,7 +24663,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -24510,7 +24692,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -25040,7 +25222,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -25186,7 +25368,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -25301,7 +25483,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -25422,7 +25604,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -25543,14 +25725,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -25685,7 +25867,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -25843,7 +26025,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -25958,7 +26140,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -26079,14 +26261,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -26320,7 +26502,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -26430,7 +26612,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -26497,7 +26679,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -26570,14 +26752,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -26665,7 +26847,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -26676,7 +26858,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -26786,7 +26968,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -26853,14 +27035,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -26926,7 +27108,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -26999,14 +27181,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -27181,7 +27363,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -27370,7 +27552,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 18, column_index: 8, rotation: Rotation( 1, @@ -27517,7 +27699,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -27590,7 +27772,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -27855,7 +28037,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 6, column_type: Advice, }, Rotation( @@ -27864,16 +28046,16 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 7, column_type: Advice, }, Rotation( - -1, + 1, ), ), ( Column { - index: 7, + index: 8, column_type: Advice, }, Rotation( @@ -27882,7 +28064,7 @@ PinnedVerificationKey { ), ( Column { - index: 8, + index: 9, column_type: Advice, }, Rotation( @@ -27891,7 +28073,7 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 9, column_type: Advice, }, Rotation( @@ -27900,7 +28082,7 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 6, column_type: Advice, }, Rotation( @@ -27909,11 +28091,11 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 1, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( @@ -28313,7 +28495,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 16, + query_index: 19, column_index: 9, rotation: Rotation( 1, @@ -28673,7 +28855,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 17, column_index: 7, rotation: Rotation( 1, @@ -28887,15 +29069,15 @@ PinnedVerificationKey { (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), - (0x340633bc671d4839c9245701bd7877dffa14caa8516fc2b2d97ab743abff31b2, 0x2d44e13f4cbd8767746e33ca3780ca730de2e81c68fd2eac2856405c810ea835), - (0x0686df606b54c901940689a81e292bbf35653bed36d07d565e6c1bb2f04f7f16, 0x109273b534b0bcdf7d3b651b87631202e692e9799f300b93bdde0c1084644f98), - (0x3b5c55541e5ecbed649a67e81c69ecf846b0d8bb5b3fb0dca7cc855508a60291, 0x2c2d977d9db18dac2bfeb6863e04603fbe577260b77d83de7a40440d0d7e96e0), - (0x377b4690b84709cca9b5f7557a4946907582090395704a279bc3d0474649649c, 0x19d8a463645acaf5e80a0eae028da3175fe3fd07a8afa7b357266951fabf15a2), - (0x01b35d8bd7fff98c6eca9e68b04159d9e04c8c97ee823cbfb25c72759a0f1bff, 0x2f690ea00d11748a56994db1d5086cc14feb4e182950aa3bd78a5e7c39f1c438), - (0x14322512145256db0a887e0d44cb0ca576d199cd60dd6c0fc592974f5bfc982c, 0x14f0d717d83c30687335f599f0e0b313e1f908d8cb539273271d61b6c0c7a977), - (0x2cfd5a6eebaf22de42df01c35ea51d5149528799a4dae214ff5ea4964384549a, 0x0241a066241ababd11a9d336f30a68d2eb40b15a1a74ce7ebb8284818341195f), - (0x1a104a92aae262af0c12ae8e460b8a050d0609236881b44523a51ade8d58fb59, 0x1b4826150f81242668cdf5ac67894f1aaa4f958b4e26af911fcca643c4cd5265), - (0x1973139bb6cfd1f498c01fda7934f1b9954a52bb7e3778814745f73a03f1ec21, 0x0984409ed6f0dfbf0b25a658c4838327096519bd700e0b7ccd69528d971da6d4), + (0x23d190a42430492732de147e7560ae1387a0e8c6b0dc405b893c99c34d124152, 0x0f7f1cb9cd7c701f22270a68d9cb484b4fffdc6144c8ce3f4eca5b646f8a939f), + (0x2b0f9d7b69e1f353868a4d542b7a23f24f39335b16c3a46fca1edb12a69bb350, 0x1e4ac9f6f6d4ba4fa4cd21e669b8293e3be8c143c795d2eb31503a9389ad4314), + (0x28f1ed28efc008bcec444c440ddbe60a8e58fe5b9a6047f0bf4d8abf599cc4ed, 0x180eef569a332ec094a76dd55de8f8ef4f087465bb2abc8dd5f7a265e048e84f), + (0x36608273abc0c47131ee4cb410b4e936fe693e9e034c686e188438d5eab134cd, 0x304e3ffef142c51a5a081a977f9c2581fa18a356e080d20cf10a044e46a3c802), + (0x355228aaa5e1134d08305d64d86cca7abac7c4114252a2a71df6a40d6a3633a9, 0x2d492e1c28cf94f9a074b14cb4cfd0cabd46121faa034d887c5f07cb743464e2), + (0x31fe923865ff58a9e59393bf64ebff3f25831371afbd2de5ddf147519ad6160a, 0x30449e9123aee5a61d3ed4c9e5822e2f60184a6c4234cfd61575e9f9572f370e), + (0x0e24cddb59a4615d0595e5439fca547a3f1ed39c4a2b0879d7e8603306d9e4b5, 0x35ab4acd6912b9bc66c19ebc9845886a4828bac17246137e36f924df2f9be175), + (0x3bd9f4407fcbb3e4ec812de2c53e70fb9203381f5a1c0f4c5e5fa52b932f5ac1, 0x06d8356f6b642427ddfad6e3642e40c0b29034baf9adb19c8a3ab251b16f39ef), + (0x21e3606f857180611036daa84bee713ff0b360b6282adc5bbaa40a5f6f7e6bc7, 0x3bff3cd61a5ae314f5eead93e3084c60a31e8b794186061a24ffa5a5dcd7e0f5), (0x3c0f3f0d7b2306490dac7d578d4846c63adcc76988ce322d8691c3b8b5b0f623, 0x12d81ca672a1c18f6e0d9b7eb8fbabdbe450fae6667cf349c1a0e63ca9a0824e), (0x27d13b33003ffddcd36efb731fe94db93d181bd994e0c057e945402bc8501789, 0x0e1dde94ea3b35e0d0a66350163ba2ff9dd5070500912b7d076747816965ffd2), (0x3049e9c8a3e6c7fe628660121f04915e03546b7a2dcb8a3e59fa99546e4f7f86, 0x2dcebc740917584f788b776f4cf1e3cd96b4a29e9df7224fd8e5f428d4112546), @@ -28903,32 +29085,32 @@ PinnedVerificationKey { (0x1751912a19fa0009ece61b686342d6b4385415e942159e8db3f174ad24d612b9, 0x0f31114ef566211d46914d0bc2d1a27a0e34eeda04dab53a0af7a37024f057a1), (0x091c6c4854fa5d9ed8a966f2a1c4946b41f6872de6c19fa8b521a0a8eb2bd899, 0x29100b4e15344d750fae4a81c82faca1e8e0573336b1f54b394946e95e7baad0), (0x1a5bb6ffd1af2165203df63414021a531f0f2bfcec85443a180993cc222b40af, 0x0d6b8b0d2363607d15746434b670008845ed0524406c1d8a221cb6f58ee2d4ed), - (0x3b31f6e48472e06a9f21145e3a37744fa0ceb6188485ce44b1a131ae47661e17, 0x382d47f03a6703a3018d8582a6123e0e61c549d695f1e2a40bb578bc2ca0e6f2), + (0x0e3ead6853e036099146875357a97c73327ac7aac89df7af91e8e126cf1adb3d, 0x16e19a920aa5d52ec2bb18e595b12cc3f65ae6703af8c088c3741ec59acdde8a), (0x34c8b83a2cc924f1b0237978c8f911e6a54375c509ba46456a011fbb74c8698c, 0x260cc681c222535c0030f702172ee8855b681c16d706b1b9a786165e06705de6), - (0x1b7a61e8a9b32fe558433feec9aaf51204e5486aa468d7215087ed35fd6ecbe5, 0x1f36dc6852f92c141ba800f721d079ffc553c7449b85d16e7487e0c3009c7835), + (0x3dcb136a22551e524212c0325331a9dae5ad6ff356175e6b82a54039475be1ef, 0x3bbbd0d20ea0ebb0f36d740910947d1934bcb93ba16325ea42f124ec0cde7a81), (0x3bb657ca32617e6242b6c6a0b166a1db205024d0441d091b8d45fb478cd4782c, 0x3189ce1b97103345fc0eafd287eed80ab186151171f22af2c9befc71a0957529), (0x25578b0a6d546cf38dc84329fad41e59690a2bd94a0db5fddb42e0db8c267827, 0x03448e4552625dda62a96318bcafcc305deafd6a028f8379d8c8d9ffa0f86e64), (0x30d1828d7463255ad75b39ee4c718de05a762c45c5d717d059496fe05d1575b4, 0x0a8eb70a9b252ee9ee57b29e4dab191cbb29665821830b2ab60fdd5d3414de45), - (0x21c6cc32a998a56e0184238756f9bc06c034326644fa797d58d37a4ce04862ad, 0x0a3215ded9e38470be699055ba4776fda0751bc3d0b893e49c71f2817e12c354), - (0x2b8641a13009b6e2c57fb902961c97d5a37fe9e7012c48a27e644ab86c6e798c, 0x31dc90911a15d74e74ad51ac80cbfca12b1eb06038bb3d5aecc0498c5bd5ff68), - (0x10b4ec889583134fa09dc3e6f0fac585f2dbf6dddcc1eea2c95bab4b8de05be5, 0x0eb4092d1a27658602828702d73145b842f9dbe4b113b61b10049ebe406d625c), - (0x0b9493ff319556d1792c2b1ccef1c52d6097620601b22c8a6cc9f3da9608a3df, 0x098fabd4f3443138f8c72fa5991a7012266cd3d574a65083a611688aec7c631d), - (0x2574aa02cd03503fc37ade3434a4d426f97f94e5f98ae5ea8f3d1324589670a5, 0x22b31bec6726ce49ea837dc05d3576d2e71536ada0d7db4efcd06c34b2129e2c), + (0x1bdd262015bc4b15fd90dcb6dea748cb9032fed094df3edfc0ca96c419c6ea9f, 0x28bad5ad4461b66303cb84925b54258e27953e8ef5e67c1057c823091a8562b9), + (0x09e15af05d50016fd1c475fbd3ae0be95289f239f13962f755f8b39732c73feb, 0x03760949d5057f33c30391474cbc3d447858da57e8b72487a98827b339993e60), + (0x0460fc7f74c9808eea035e8df3ac031c2d05ecafd8f0189f2d6ddac3274752fb, 0x2bc99ad7317625f1a1d6bca1781557b87e8b9976cdcaf994c827a0087d1ce182), + (0x31b7012d949d0668d34cb20200d4e159262aa0dd92114d3aa5e8aa84af51a802, 0x2eb9c55ed473e18e62dc273a8606f955690a984551fbc38e80d65199ab8d0c3d), + (0x33dced988c6a1d40aff3da1710a0e36a6b787fd6dae51ebe3dda7835c2dbea15, 0x3b54a967115d43feccf77c385dcfc6e89f30343457bc8921e017c930a381b5b0), ], permutation: VerifyingKey { commitments: [ - (0x09d1106babba44f67eace95337e3b9916cf02d0b143d5993cf212ba4fa6e2d81, 0x2046a60feac842a629a24189de9d914da26b2254440c142cf851f6d4d5c586a4), - (0x26086868fee3f97d3171042e8ad377782aa845dd3e5c6c86f5d1251b41b8ff03, 0x2f60015e46a7e2bc0e30413be4782c648ec5e9dedc92ce9052fd2857a779a4cd), - (0x00d54c6162e5654355cbaa6951f86836cea891242793df30e4ae74d522747d01, 0x0f9d6c7108000d07ff766c16757c7a02cc8bcaa1ce3001c476bda543db4b52fb), - (0x131a626c24a64b23cb9a554921462f8b3848294a5a12110528b11362fe80f59c, 0x3e8076404262e3d7b5a6d2a3dbdf0fb151e2f3fe4a9239365dfd63853bfd8b8d), - (0x00aae2c83a8cb88fd04c9c631ea69362f38d41688624f519c6aab8fb15110931, 0x0294f0e5b376a7bc9fd190f34c00201c0ffa2a019148d27e1a578effba915450), - (0x2022cd25023adefba897a064d43365c59df92f547eea992189040ecf23eb1b89, 0x2d5ada0189acf8d400ed967e8537e7de7979d2bd6ad5430aa009e200edcad889), - (0x30e4290b63621db78bfadf242ac8a940179ddd601127f4fe05df818dda0de8b5, 0x13ab4dd58054df7dc7c4e59fcf5745373889113fccc60d8a79957dcbc4a1a79e), - (0x17ee4b08749d802b2cb5a8d72df1d27c4a521293347698bac389f473f573888f, 0x19efafbfa1bc8c4e62cb0d8893905ac7a30da08a9ffc18ac26f741c6419f2fe1), - (0x1a5804444e8f54cdff0f38ee9fc051672b5fcb0cf39cc608e20db884c18c2ae0, 0x11b297659614cacbc3fe5b6b8506d7b31d04ec061329c791714478f480215263), - (0x22bbc74dac7b42add29982d2d276b548b38b2fdc8628d4fd331f5d09cae93881, 0x0808f95123e9339e6643594561b28d0a4b6d7d52bdf0b60e3ab698336cfefe06), - (0x07201f37d78f79f85a69d9333e60682fd709fcb7b9fbc843d0baef7885a79246, 0x3b01c7b445dd60b44309c172d55cd2bfed068fa420f8c2cbf316eac3bda6985b), - (0x3998aad0ccd62e9339c4ca91363bec2524ec945bb780efd9984fec68b4f51efb, 0x32cdaa4c65f29fa0675df2196f3190b849dd1dc4a48d615602e57b282cb34673), + (0x01b2f977b5e96e2d00052aa77013b4a7522b714ed1265e5b761a90add04a677d, 0x06ae5604d2abf710e3720ab4ca37bc7a75cec4772624973990fe7acb95d2b90e), + (0x3487595fd169aea1e2055c38daf7b83a923600084a12f6beb068e9ef0886884b, 0x2094e9bc4aead08e32eb63939e7b365f7c4dbe7bb9e4fe439fe7855da2a8ef59), + (0x34b7b5583a32b3a2a188214b041b0402948759fbdf47b4b50421905728b78148, 0x10fafdf7f63a938d87eb031cbe61c6dd5915612ecb71865e94a7d7fdcb96f9c8), + (0x38b9b1352ef7da340b69e7d152d86c26abaa7eb8da2b2049c75eb908bc42dae1, 0x2b7880c4c7790b2bd4f603a95561e7e1f4fba95eba4096f6d44b89e4b0a16519), + (0x08b55ac77535aa391210533786aa9a62215fe2cb6950b60dde6563f8c4f47d58, 0x1ca42aafc1ae6e8554a933225daae97222e08a59c866024a936f66e45455c47b), + (0x3b23fca8ae9ee4f186c654428419b16169777a1b5cf7e959f73de3fd21cf1403, 0x3ff330b5247e4a88c38452e3bbaf20c79cff67a4a5b91c5ac3c6614d8cc17119), + (0x39c00327041f3b0a21cc10acacd55a94f968770121fb55e8bee01e146ea024a1, 0x38c3af47f4278d74e808aeecaf9407b17757384e9d50b59500604c7bb86687cd), + (0x0fe245acf5779d18b38c28fd4f6d921bb5487579d1fd257b7ea48f8d6de2db2f, 0x1f8a5b90451fa159c9c517a0b7250787d86c63555659298bb7ca10c537e94e12), + (0x13f4c48990bdcadf99fc60d63b04eb82f26dc2c59b515f265a66c2732abd0205, 0x20dbafa9a43baccfc5ee6947bc408b1e8974af2f5c141f3f704a747e194f04f0), + (0x16d8e8e787a2dfde1ec419ce969aa5a6c23b9d703a7440a6f085cb1fbbb21a57, 0x217624d76f302eb4f3a4f9bd3968fa79f66e4b06b5bc72048b979fb58b1f29d7), + (0x0f74011b79a40415b90f8f22db1a1433b7336307801cfe97b84f60bf7cb15d44, 0x10f2a0765e05ab426d0b183ad84616438187efbfb6122540d768895324d42667), + (0x2139a7b9a8c74648139b556ae77015620edcc81cf0a89cc960a57e16c4346a0b, 0x0295889e3496dac3174b2ba3c5399b78d9ecf042730cede62d37f6f0bfc021b6), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 7fe92dc3d1d910ff5b4a2044c05f15fa7afb872c..9d541d63f1f5e947978137c33c8705bebd8de2b4 100644 GIT binary patch literal 5250 zcmV-|6n*PS;&7n9DkUC6Y5LQ`LXSFN{j7NH5!tWn%C}8*PI4t@{Mt+z7fxD)exhI@ z=?%44roo8`i!t2mP@Vu~k+mWq^V>jfW;rKH=Epq8kLj0AZz>qFw0$1!c&uo8A?qQi z+1bRJKS*&QF1F#$`#0_YM8~W1XL*v^al|b_L-{7cpT|Py0yv{=o;Z=DEVBnQrM>NY zB9j%gK8I4fO-K>}0bo>md-Ri__uxP1z9`H=SM0aPnf!0hWot*pvNmr!ql5xA?dr^Z z8a+3+t)JaVl%;AwB!c}D-uq!UBO0ifGIa-;bJ0P{H)d_d$|9cfbmd03><15Hsp88L zK26J^2g0ypp-d1&_2e^~#?or?N6w?U$(%CU7zs@myo(jz>I4IQW z=)URFeLO3?-P^BZ(g^vSt@=pK60x4THWg)^0k5Gjtzl3kPNb=}+ajPSnc~26)0|92 z=kB0Bo9pp_50=_aMuodugvotCdv3dcjl}o<9PnO702Vo+H6`((yzf#YF4w~=Q)xNj0 znehoz!k&&Ne1kqs)U#JWusul!)<#$8>mFBb^a99+cT~vq*=1R?^BpL3-XNjHjU!Ev z^qF{?kwU__o6?Cwr3o2;PiAAHt;GTz3_Tx$lffv*%cp*i6t1K+sIIbQZS23eHsPfk z77t*JISVX~gPmv^UzD9i$YJTND)Jb5qoai%CC6;aa$GJ1@!ULctiirZGkr4lr^C6E z7OVd50vhm5;^{YnT_b=|^SwVKsV7@r-~kX!CAP$g!S*Kmh_s3);LkE|D;oxzf9y9l zoIGqliY(qdJ?;Q{D1vqDtLK5hYnv3R14?&VpAX{p*^vPEjn&n<^mib4LR6r-YF(5H6UG-DYs(O znzD0roC!#w`As(7RjXz*h)88y+*N=RJ2Kj_c!7g|UZN07junLJ0J7e!x-G3n4zA9w z?pKG9>>zH@ceXP0U5LJ-UtW)VJ{^g-#OgQV(Y1%Q z9kmmT0>%-M>?gKN-zgKI6Q*n+8lW^!Y{1n+u`H-|WbSv?)E+E6Tb?;Ne((7ze-FY?g-Xf_cASFRd5z#*o#+ z)+uB$iLr1&DtQe|XZ+IlYhRPtl5&t`F67Y+OLPlScz;Xk|2D%kW?4YrPF|6l>fPt8 zS(hTkEWWU0r-_%6rZ^0yGltnh0xN-&Rn17GGn2INPf{TdGHwJKDV7&I+{gAS+PR{3 zGeoe*6{9P??lc+%SO!t195h*miAb2=^psNg=MPO$w89YMH&$9-jw2DulX(hE6lI#b z7xXYK+0a=u?efC}<53t&I6nL(gZL-JiUT#DZ3DGco`$-~%2q@7<~xAsmg9t(njJSnY;? zp&?O_@t@JD<`g3-~@iI9p|Ley*7pI|L#$C2Msh zYyQOyk4S0NxKL-7JH^0&cHGY7zRmloI+`b`2G=SP{3x(hk)(3LNrGlL1XRImkLjs- zQ))eZ9XQ#lt!GUg%WJUl$diiG@l?g|P1qnGrsHjNfIatKr>CD1RBD zWS+3%-LyPC0R=Y;LGAXEvI|oeJ6!Mk#d$?3FYG^)P7E;_h`DgUz?GL6)I7wC!f{B@?hH%1$&nJ zwApu&za?^#pZYo|&r@$SRE6pj7aPZ2kP|*uSIuft=NwDO>t&G}-?S)<`Y`Z9hUfJ% zA$hf*j+AZ$(->Ws6OZ75j8f8T0)9As`zBgvlHOPo7)PYduhbk_DPYJ4ufoi%sc5dP zYdNC~_le2>7Q$>x6>E#P%adB$MbZdkgw| zYWO|&Y0-Cmk+-}RLjGi|5;q-wmVJRyq6ek4iCqhmbC6kV4(h|5eFaY%oP;i+CoxZM zB(j^W_P^#s_Hfectp z{{{zjTO~Z$J!cc4UEL8fU?4TNoY*)v>e&&UQ)f#399h5q1nwt8IDzKNrA#y`lPcNS z_S`B8*1Vd~O{n;Hjzs0Bm=tchGKCYJY`GC!HPsH~as>|BKf77`MP&>U3MCG(G2Ca0 z0*FFnva48ra8hZtjShXLC$Eiqc7lI`W!8R*wS0aW=G5>TWB_KodsErUwu z7RPF_9aV_CgJb7g8g@ZjT_?lE%$2{-DM-XG_BST{lz8N11YpNSlQMQKBCuH*Sm7_& zfo;YGdl`sCdU(HI2z;GV>=PhHUCkp)7%t5Rykj4v4@j`6S`;G}(iBXD^C|Q4VK8>} z6#T(G3H&_(jYbQe)ng{Yiqu6!xKnfvbR9>RVm`96EzK9 zUc~OJRb;Sx|{>P(JRi&mr*BqAOwe}&G`E5)t8 zDZ4w%Xdb^3shCB28!_2v4pJ*?@B9J_e$B@@AP}r1~c() zMTASt=tIxY0%P=yjk1#yX7>Ih4(V_hl3lE#0!Fuk#AGYd>K3r#Dx>2_b=p!Bp^HJv z^P-Cn>e!3_^>6vK;TzSN`kmp5j7VY>QYWH#Io*1rCR0naJ-U?2hx7SV^aG ze7_hFoc7ZY8nHy3^G|}QF$E5~;2%tIRz&?WS_(-FgA5Rip30;=gP-n)aqgWIEhDhH zH(kZ?g6!fC_AI?|B1YOLP$~c(N@8E_{ zQm|R@TT^uG3=*$iqYx8V#o~WkJaVU{r4zB)FBkWhVDOAPj$`TL1qrl<{6nI6Hg*O> z;~6zIYLXbwiF%MV)tt9tNG#P9BIGnv%UJ^WDfaPWZ_Z5Q_@fqF42jUuHd?`D(92w< zJ0cuRwPbfgS4R#f%o!;rw0p}Rr!~A)b z`$5Uo^pk@(TU9@Q>`i)s`d9Y&+a2U{68WFC*K13Az#r*OJSuMcp8#trVNvzF7={Iu2CVA8Rf$FBPOSWp9H;8>+E`&>y&(8r`D&gBJMjE>VLrEiNgERdZ4- z3#viQ?gx`*L!L_Om%l%f@+rI82PK)wqZz0jt+uB0ryKRj2zTV z`}zBIOtebEhK1>dB0$$z%`BnnzZ;-^mpxbk8Q?jsVLG`Z@ZNV50`Wr<0=KtcjK%_C`6Yirz$i;^*2V7(0wvC zT+b=v0l9$+`cfF#AHVPjKU_BcOq@_!zT)UX5o#-Va=$@$=Mhb8m7GkVmaEU>6cj!- z?Q639xDS02+C-c(lpP>>28mA*L)}j^i8G&8CD{)>3=L9y;klY?tX9%u!~NJIyGKwH z6(-=!nmQ&!sh{$Bq8s4`nf8F&i|>LWQyw@T6NXc9@w+<&L}= z6TAK+&9|+18|l`NCIpV&l1lqVvNy^?BN@iLSds{p z9*Mtx;u>7&g}ofm)~1dtpZ(2MbX(6lF2nMO~y=WA0Wb4-KvW;H0M&b zE9SOkglRvy;#xQOtskgK8Z%^gF`G`Uwkb+=1|;s5h@^SS*t$uMmbh9G|LSF zr)9&cpg^~wu8M|c`PQ-!G7uio6DhF0cgo1K_w`u8H~p3er#Zt5mb|m%bHRC267Na4 z{Ie%Bqn!`O=Q?e_ra74^3R;C4o_eQ%Olm#3 zvq*RD@w16-0GAp*r zLiYgay~UJLIRFerN@xlJk&yej6H_8dei)K5i+*|`g8yfmp$BEVq z23+KO>Dh8*7?A{o1c>_?cykn-_tvM}{pSTSdvd4jx%6dB8vlM9Ax#Hm=#NEr-axBt>wd& zPX15lxd?gBv4j+s--^^kI4LK4-W{<^$jP58o;7rNt`h&~?v5~Wf`*MHEX_2}hpnz< zbYWrN3f?yL0g`_wO5+x)U*$aF|Ns7ta++hlEs2}-BiYkw1fhlPsAoXbkwto!&Ygy@jDn3v`8x#F_we3V$+Ho$0yQ+=$Vap?9pB zJeU7N{vjp7uPl&_I{&IM0(c-)#j9D~1U}?7R4C*!T9sE=Vh=Wz zjkyokA5|`^ltR}jT@AdC!*{A&v&}AhVEgEhy|zrn?yw^Jtjac2H$bsrmrGx9d5GJ* zz`Vz<+LiUga?dJ^c=o5#bJuKTtY~s8mxuO zk_IfSYr~ypatn*3Vu`y)&L9!iHY2)7yXmJ{G!R%alMlVoVPW$NUQJA|#5d7i2?$*JoKs1jc7XY;)Acv*$8 z6S4n~xHWkzuMz81{^RKS;C~LfAJF$+fXIsx(!!+UKADEqCF{>P*&bO)ay5KgUUd z73nj(?w>zbl0NqsQK|U>ngHm6J@=AU`gZ<+2Y_=xPpw4(-q$+F8sh>b{4p@;vj9X` zSNj7+vEIia6sHaHt1HjG>#A9cm) zmS+0qEC|u2&n1awmpLd=7-SL)0^8KxGVEaSQX}xqcuwAsy-+jDgnq9$FY9SkltP2C=n!W$2bgqA_=|Z0g4s-hPw`;bKi1Ew@kE~*uXwH9PE-l_)mwx2-9R@h(B?Di+lMy9K-84pS5_0Dro@f?7AYr`gwl%W%UZ z@oMiNo0W}AB*$MlLkiosqwyY9i9i?*!C(}GlL=)eW+ceHT=LzGqMlQ&bhSn zqfRg=7vJ4sXetB}!c$L5%aa-{n52&vD_Z{?E*%kD&$6o!#E{@Y2cY7EC?2i&vW=U$ z)Dm8hKQY7G{T?|WBDD|J0XGq*dV7(Xb#~$c#E>t<`^Cn2Ix0!s_z$_0Z5ZGp{Y-+q zT^WeRSYlS4+#1wFapqhkM03Fx|qq*VP85B8QNTVQt~jbl{pMiBAE(JZ(BIhcjyMN z5>`ubK^4jrItVj)vS){X0xPg+5kjQQYrk2j_Rs^6R@{DqceyV{&2EI+NF6U1Ug{D+xq}5C$mA99xOIGEIqvdiZ9rHT(8Q+2&DYn8?`J>AEL(XisLX@D-`uOE$6Bjhe(F0Y25m&rPbiDY)e^)<0nk0p zQ}>K_kBE<#6Id17bHmtdOlQpy@$OfsFXSBt3TOZ9Jl9EDj!ip<0rW3D{m~%etvqWW zNoe0VU3&fD5cm&zF_`+8Y#mW#FP3c|$m0mXv+Q$U8dt;Sik5Z+5%k*T^s^{2BkJGv zh0cE*14=%Keu^iK#GgCDNAt+IC0s-SL-;0V2E6k3m2Ayqn>dK%bK%0mDlYx6cGM5q zE=oflAc=;a4rzyPUPNGfw-jWZvRL8uAp#%1Gxd<(KVVs5;e3TgHe&Hz#~V^(o1W0u-YYUAA>YA^8 zUE3pfR<~Rc_FDkMXOwyzHrV{O!~Wj2{9hk==zVgR43ETSMW(;<-Jp_C9(mS1C7up& zn~=xLI&~R>*#_>9d#L5W+-DvCQpp3rxYZ{;JdG&CjY}TGS{{=D62hw~i7`n8EU=sk zGNI_oW+Z?T9w@VIZ0k^ZvN|*d9?utufEktN57ucbNh^S!^{u@M9guLJNC@I82eY&r z66o?mwk#gx?tXSTV>f^KW4@<^BZE~VKRhrU&$=fr6&C^pA+lHcDZz~KHuW8WB%Cj} z325w352-R$O(^DIwkZZ&rkkb<8VQW1()rG;vwD?tJ3y{u3VC|nqN>%Zuh~ssok~cU zz5|sB9LL+_#Y+I$9fD|kt8X5m+gvFy?DWYX)ix}(6j&RM+;2P*@!)tCCwY?o8dV2@gZO@G-g%#xb}NeoWlzb> zB@`_L+gGueLedENTi%$q6p;(IWGe6HY@AxU_wD!NYXnvZ?6@RKe zlyE$_{M^tgOzCUUU0QTVQ#ZW1K{fUF_b6Gh0}@4?hMxkp7UM%X_EZwE%^%DI#j%Js z6Q!$Zi)kEY0p{JMBB_&t=upWg`&L`GUPw*{dGN0r@4mu-0!z0`4!%c}g+CmYRj!8k-}fi4CDy!IoQ1*~N;zBtB}NStIC@gBfzzW8r3qY(CJgRiZh&9F`w z9WsgyEZ&sTL*^4S1BjPGBy$=*BXvlT)dVyb&D}9ABQw@QF;ULw(6(r)H93KWSupg- zDc)GLCN{`RZhR4(9a17!N7qDiOC7&!jmUqGOQ75@=0EUVrkIj7QO<-?0OiZB4UpKp zM>kdIYn;II+Q{S+Ofh@6DzG&KU~wGA`5 zE{%Z6EWaU}$>kjGThnWYs62**9;czVA$lv#YZ0Dz0$O64_22hE8qoW`t2M*YIVC}M7LqmxHh^TrN^`F?1qL}1 zV?DnO#08k0??xtlp|p>niYnmpDG`Z0Y4?N1^q^?B-h=YZqV#f7d=@1Td&3>E*+Gv} z9e8__D4>mH;ohZ|hLN@>-2l+k-0BDE{^HU`|wE zHJ@NTZ7lx;2Znhz4x5Mu(owd35>mssz_>%tKUPWa3d*JO?7!gy+8ypFJEmkzjFEiTrV6>BbWJC{+ zhn%$*q3z7V1BYj81bb=HBntb^q?ga~1ZmcWe0^7o@hl55@>!-|GL4IV^Nvh>9a(O` z%(wu`K+q_I6}oirwwj*=;gw2$J^4`$=93a*<;ACBBKMR6=4-!p)W?_|eJRg;wk)yp z3a~PwxKZu;+wI5lY_#bdg5|Un3~;oM*3VX@>^WyA1Wx8@#ksTCE(_jf7<+Hex%#mj z#O23kQyO@7S@sUY^RZ$S+&Ci29XxQv>J3Ah5%BpCt zylj*R5;(FEuQYkOMlON@gf3ucxV!JM9E*}X>)PN`XQC!)}=czW6t!<1%ex)U;P3IH1z>_)`qCvW*^-yt*J;?LKyWiVmyP)X-9Q3P#EZ$@1oX z7ipY3!0$>{F?kLC&}T|BfCB`V*ZijuYVDj;T>h@7VIK}ZoG+@Td23AR}`T_U6jf! zVpJ4AXfL>+)6C`E6&ZsjqiXUIpY@o;XWwv_8q0^aNhRb=n_4YC;a6DE2bn=sBsa@= z<&Xcy*IkFwNOFH{m3h0e^Wg5B9M?8FAK6rhy(>WummzS|ZR>0vXf92Q8}`F0zPI|s zb;e-mjMWR=khcr^iZ@}sv7%0kzA@03HokB7knj;NM5%yTpA^@BtdM}Jd6v`YOA8ca zBN;Sr6LEZ6g*+)T_bv1FsxHzd7prw@#GqE8ZWtlCqXikE3mR3wDW9uVum;M;gwlR} z*R_B=96cy1LCz&d5{0Wu1{b3b4>o6ZphJ`&hYML0#;maf zOBy)Z=zf^rxiK+pyEYRor_j7s3Ch3lnX_)16@$5xCbgoBRer;4DkRS3@$t Date: Mon, 29 May 2023 15:06:53 +0300 Subject: [PATCH 30/67] Protect bundle burn from adding assets with zero amount (#60) Prevent the burning of assets with zero value. --- src/builder.rs | 5 +++++ tests/zsa.rs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/builder.rs b/src/builder.rs index 1739ef12d..419b12fe8 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -397,6 +397,11 @@ impl Builder { if asset.is_native().into() { return Err("Burning is only possible for non-native assets"); } + + if value.inner() == 0 { + return Err("Burning is not possible for zero values"); + } + let cur = *self.burn.get(&asset).unwrap_or(&ValueSum::zero()); let sum = (cur + value).ok_or("Orchard ValueSum operation overflowed")?; self.burn.insert(asset, sum); diff --git a/tests/zsa.rs b/tests/zsa.rs index ca8c1b874..b80956ec4 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -508,4 +508,21 @@ fn zsa_issue_and_transfer() { Ok(_) => panic!("Test should fail"), Err(error) => assert_eq!(error, "Burning is only possible for non-native assets"), } + + // 12. Try to burn zero value - should fail + let result = build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: zsa_spend_1.note.value(), + asset: zsa_spend_1.note.asset(), + }], + vec![(zsa_spend_1.note.asset(), NoteValue::from_raw(0))], + anchor, + 2, + &keys, + ); + match result { + Ok(_) => panic!("Test should fail"), + Err(error) => assert_eq!(error, "Burning is not possible for zero values"), + } } From bedc732d6fe7b43afa335d6bed64e7897cca0e5f Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Thu, 1 Jun 2023 10:15:24 +0200 Subject: [PATCH 31/67] Circuit: Add tests for orchard circuit (#63) Add some positive and negative tests for Orchard circuit --- src/circuit.rs | 241 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 234 insertions(+), 7 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 4db6a9fa7..67833b013 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1188,20 +1188,24 @@ mod tests { use core::iter; use ff::Field; + use group::{Curve, Group, GroupEncoding}; use halo2_proofs::{circuit::Value, dev::MockProver}; use pasta_curves::pallas; use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; - use crate::note::AssetBase; + use crate::builder::SpendInfo; + use crate::note::commitment::NoteCommitTrapdoor; + use crate::note::{AssetBase, Nullifier}; + use crate::primitives::redpallas::VerificationKey; use crate::{ - keys::SpendValidatingKey, - note::Note, + keys::{FullViewingKey, Scope, SpendValidatingKey, SpendingKey}, + note::{Note, NoteCommitment}, tree::MerklePath, - value::{ValueCommitTrapdoor, ValueCommitment}, + value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, }; - fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { + fn generate_dummy_circuit_instance(mut rng: R) -> (Circuit, Instance) { let (_, fvk, spent_note) = Note::dummy(&mut rng, None, AssetBase::native()); let sender_address = spent_note.recipient(); @@ -1264,7 +1268,7 @@ mod tests { let mut rng = OsRng; let (circuits, instances): (Vec<_>, Vec<_>) = iter::once(()) - .map(|()| generate_circuit_instance(&mut rng)) + .map(|()| generate_dummy_circuit_instance(&mut rng)) .unzip(); let vk = VerifyingKey::build(); @@ -1378,7 +1382,7 @@ mod tests { let create_proof = || -> std::io::Result<()> { let mut rng = OsRng; - let (circuit, instance) = generate_circuit_instance(OsRng); + let (circuit, instance) = generate_dummy_circuit_instance(OsRng); let instances = &[instance.clone()]; let pk = ProvingKey::build(); @@ -1441,4 +1445,227 @@ mod tests { .render(K, &circuit, &root) .unwrap(); } + + fn check_proof_of_orchard_circuit(circuit: &Circuit, instance: &Instance, should_pass: bool) { + let proof_verify = MockProver::run( + K, + circuit, + instance + .to_halo2_instance() + .iter() + .map(|p| p.to_vec()) + .collect(), + ) + .unwrap() + .verify(); + if should_pass { + assert!(proof_verify.is_ok()); + } else { + assert!(proof_verify.is_err()); + } + } + + fn generate_circuit_instance( + is_native_asset: bool, + split_flag: bool, + mut rng: R, + ) -> (Circuit, Instance) { + // Create asset + let asset_base = if is_native_asset { + AssetBase::native() + } else { + AssetBase::random(&mut rng) + }; + + // Create spent_note + let (spent_note_fvk, spent_note) = { + let sk = SpendingKey::random(&mut rng); + let fvk: FullViewingKey = (&sk).into(); + let sender_address = fvk.address_at(0u32, Scope::External); + let rho_old = Nullifier::dummy(&mut rng); + let spent_note = Note::new( + sender_address, + NoteValue::from_raw(40), + asset_base, + rho_old, + &mut rng, + ); + (fvk, spent_note) + }; + + let output_value = NoteValue::from_raw(10); + + let (dummy_sk, fvk, scope, nf_old, v_net) = if split_flag { + let sk = SpendingKey::random(&mut rng); + let fvk: FullViewingKey = (&sk).into(); + ( + Some(sk), + fvk.clone(), + Scope::External, + spent_note.nullifier(&fvk), + // Split notes do not contribute to v_net. + // Therefore, if split_flag is true, v_net = - output_value + NoteValue::zero() - output_value, + ) + } else { + ( + None, + spent_note_fvk.clone(), + spent_note_fvk + .scope_for_address(&spent_note.recipient()) + .unwrap(), + spent_note.nullifier(&spent_note_fvk), + spent_note.value() - output_value, + ) + }; + let ak: SpendValidatingKey = fvk.clone().into(); + let alpha = pallas::Scalar::random(&mut rng); + let rk = ak.randomize(&alpha); + + let output_note = { + let sk = SpendingKey::random(&mut rng); + let fvk: FullViewingKey = (&sk).into(); + let sender_address = fvk.address_at(0u32, Scope::External); + + Note::new(sender_address, output_value, asset_base, nf_old, &mut rng) + }; + + let cmx = output_note.commitment().into(); + + let rcv = ValueCommitTrapdoor::random(&mut rng); + let cv_net = ValueCommitment::derive(v_net, rcv, asset_base); + + let path = MerklePath::dummy(&mut rng); + let anchor = path.root(spent_note.commitment().into()); + + let spend_info = SpendInfo { + dummy_sk, + fvk, + scope, + note: spent_note, + merkle_path: path, + split_flag, + }; + + ( + Circuit::from_action_context_unchecked(spend_info, output_note, alpha, rcv), + Instance { + anchor, + cv_net, + nf_old, + rk, + cmx, + enable_spend: true, + enable_output: true, + }, + ) + } + + fn random_note_commitment(mut rng: impl RngCore) -> NoteCommitment { + NoteCommitment::derive( + pallas::Point::random(&mut rng).to_affine().to_bytes(), + pallas::Point::random(&mut rng).to_affine().to_bytes(), + NoteValue::from_raw(rng.next_u64()), + AssetBase::random(&mut rng), + pallas::Base::random(&mut rng), + pallas::Base::random(&mut rng), + NoteCommitTrapdoor(pallas::Scalar::random(&mut rng)), + ) + .unwrap() + } + + #[test] + fn orchard_circuit_negative_test() { + let mut rng = OsRng; + + for is_native_asset in [true, false] { + for split_flag in [true, false] { + let (circuit, instance) = + generate_circuit_instance(is_native_asset, split_flag, &mut rng); + + check_proof_of_orchard_circuit(&circuit, &instance, true); + + // Set cv_net to zero + // The proof should fail + let instance_wrong_cv_net = Instance { + anchor: instance.anchor, + cv_net: ValueCommitment::from_bytes(&[0u8; 32]).unwrap(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_cv_net, false); + + // Set rk_pub to dummy VerificationKey + // The proof should fail + let instance_wrong_rk = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: VerificationKey::dummy(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_rk, false); + + // Set cm_old to random NoteCommitment + // The proof should fail + let circuit_wrong_cm_old = Circuit { + path: circuit.path, + pos: circuit.pos, + g_d_old: circuit.g_d_old, + pk_d_old: circuit.pk_d_old, + v_old: circuit.v_old, + rho_old: circuit.rho_old, + psi_old: circuit.psi_old, + rcm_old: circuit.rcm_old.clone(), + cm_old: Value::known(random_note_commitment(&mut rng)), + alpha: circuit.alpha, + ak: circuit.ak.clone(), + nk: circuit.nk, + rivk: circuit.rivk, + g_d_new: circuit.g_d_new, + pk_d_new: circuit.pk_d_new, + v_new: circuit.v_new, + psi_new: circuit.psi_new, + rcm_new: circuit.rcm_new.clone(), + rcv: circuit.rcv, + asset: circuit.asset, + split_flag: circuit.split_flag, + }; + check_proof_of_orchard_circuit(&circuit_wrong_cm_old, &instance, false); + + // Set cmx_pub to random NoteCommitment + // The proof should fail + let instance_wrong_cmx_pub = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: random_note_commitment(&mut rng).into(), + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_cmx_pub, false); + + // If split_flag=0, set nf_old_pub to random Nullifier + // The proof should fail + if !split_flag { + let instance_wrong_nf_old_pub = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net, + nf_old: Nullifier::dummy(&mut rng), + rk: instance.rk, + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_nf_old_pub, false); + } + } + } + } } From 32eee6e0838d20c392d2b2710840b61c6ea23ebf Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 6 Jun 2023 08:46:52 +0200 Subject: [PATCH 32/67] Do not create split notes with native asset (#65) Due to privacy considerations, we might incorporate dummy or split notes while generating a bundle. However, to maintain consistency with the previous version, we choose not to include split notes for native asset. In addition, we use a new dummy/split notes for each extend in order to have different nullifiers. --- src/builder.rs | 49 ++++++++++++++++++++++++++++++++++++++++-------- tests/zsa.rs | 51 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 419b12fe8..2b9729c0c 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -167,9 +167,28 @@ impl SpendInfo { } } - /// Return a copy of this note with the split flag set to `true`. - fn create_split_spend(&self) -> Self { - SpendInfo::new(self.fvk.clone(), self.note, self.merkle_path.clone(), true).unwrap() + /// Creates a split spend, which is identical to origin normal spend except that we use a random + /// fvk to generate a different nullifier. In addition, the split_flag is raised. + /// + /// Defined in [Transfer and Burn of Zcash Shielded Assets ZIP-0226 § Split Notes (DRAFT PR)][TransferZSA]. + /// + /// [TransferZSA]: https://qed-it.github.io/zips/zip-0226.html#split-notes + fn create_split_spend(&self, rng: &mut impl RngCore) -> Self { + let note = self.note; + let merkle_path = self.merkle_path.clone(); + + let sk = SpendingKey::random(rng); + let fvk: FullViewingKey = (&sk).into(); + + SpendInfo { + dummy_sk: Some(sk), + fvk, + // We use external scope to avoid unnecessary derivations + scope: Scope::External, + note, + merkle_path, + split_flag: true, + } } } @@ -467,12 +486,12 @@ impl Builder { .cloned() .unwrap(); - // use the first spend to create split spend(s) or create a dummy if empty. - let dummy_spend = spends.first().map_or_else( - || SpendInfo::dummy(asset, &mut rng), - |s| s.create_split_spend(), + let first_spend = spends.first().cloned(); + + spends.extend( + iter::repeat_with(|| pad_spend(first_spend.as_ref(), asset, &mut rng)) + .take(num_actions - num_spends), ); - spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); // Extend the recipients with dummy values. recipients.extend( @@ -574,6 +593,20 @@ fn partition_by_asset( hm } +/// Returns a dummy/split notes to extend the spends. +fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) -> SpendInfo { + if asset.is_native().into() { + // For native asset, extends with dummy notes + SpendInfo::dummy(asset, &mut rng) + } else { + // For ZSA asset, extends with + // - dummy notes if first spend is empty + // - split notes otherwise. + let dummy = SpendInfo::dummy(asset, &mut rng); + spend.map_or_else(|| dummy, |s| s.create_split_spend(&mut rng)) + } +} + /// Marker trait representing bundle signatures in the process of being created. pub trait InProgressSignatures: fmt::Debug { /// The authorization type of an Orchard action in the process of being authorized. diff --git a/tests/zsa.rs b/tests/zsa.rs index b80956ec4..cbda7fc19 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -261,9 +261,25 @@ fn build_and_verify_bundle( // Verify the shielded bundle, currently without the proof. verify_bundle(&shielded_bundle, &keys.vk, true); assert_eq!(shielded_bundle.actions().len(), expected_num_actions); + assert!(verify_unique_spent_nullifiers(&shielded_bundle)); Ok(()) } +fn verify_unique_spent_nullifiers(bundle: &Bundle) -> bool { + let mut unique_nulifiers = Vec::new(); + let spent_nullifiers = bundle + .actions() + .iter() + .map(|action| *action.nullifier()) + .collect::>(); + spent_nullifiers.iter().enumerate().all(|(i, item)| { + unique_nulifiers.push(*item); + // Check if the item is already in the unique_nullifiers vector by checking that the first + // position of the item is equal to the current index i. + unique_nulifiers.iter().position(|x| x == item) == Some(i) + }) +} + /// Issue several ZSA and native notes and spend them in different combinations, e.g. split and join #[test] fn zsa_issue_and_transfer() { @@ -315,23 +331,28 @@ fn zsa_issue_and_transfer() { ) .unwrap(); - // 2. Split single ZSA note into 2 notes - let delta = 2; // arbitrary number for value manipulation + // 2. Split single ZSA note into 3 notes + let delta_1 = 2; // arbitrary number for value manipulation + let delta_2 = 5; // arbitrary number for value manipulation build_and_verify_bundle( vec![&zsa_spend_1], vec![ TestOutputInfo { - value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta_1 - delta_2), asset: zsa_spend_1.note.asset(), }, TestOutputInfo { - value: NoteValue::from_raw(delta), + value: NoteValue::from_raw(delta_1), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_2), asset: zsa_spend_1.note.asset(), }, ], vec![], anchor, - 2, + 3, &keys, ) .unwrap(); @@ -357,11 +378,11 @@ fn zsa_issue_and_transfer() { vec![&zsa_spend_1, &zsa_spend_2], vec![ TestOutputInfo { - value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta), + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta_1), asset: zsa_spend_1.note.asset(), }, TestOutputInfo { - value: NoteValue::from_raw(zsa_spend_2.note.value().inner() + delta), + value: NoteValue::from_raw(zsa_spend_2.note.value().inner() + delta_1), asset: zsa_spend_2.note.asset(), }, ], @@ -401,13 +422,21 @@ fn zsa_issue_and_transfer() { asset: zsa_spend_1.note.asset(), }, TestOutputInfo { - value: native_spend.note.value(), + value: NoteValue::from_raw(native_spend.note.value().inner() - delta_1 - delta_2), + asset: AssetBase::native(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_1), + asset: AssetBase::native(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_2), asset: AssetBase::native(), }, ], vec![], native_anchor, - 4, + 5, &keys, ) .unwrap(); @@ -450,11 +479,11 @@ fn zsa_issue_and_transfer() { vec![&zsa_spend_t7_1, &zsa_spend_t7_2], vec![ TestOutputInfo { - value: NoteValue::from_raw(zsa_spend_t7_1.note.value().inner() + delta), + value: NoteValue::from_raw(zsa_spend_t7_1.note.value().inner() + delta_1), asset: zsa_spend_t7_1.note.asset(), }, TestOutputInfo { - value: NoteValue::from_raw(zsa_spend_t7_2.note.value().inner() - delta), + value: NoteValue::from_raw(zsa_spend_t7_2.note.value().inner() - delta_1), asset: zsa_spend_t7_2.note.asset(), }, ], From 02fa582c80c6aef05e7790621ba7599085d5d25c Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 6 Jun 2023 12:40:06 +0200 Subject: [PATCH 33/67] Global padding for bundle (#67) Each bundle must contain at least two actions for privacy concerns. Previously, we pad bundle to have at least two actions per asset. Now, we pad bundle globally, and add dummy/split actions to have at least two actions per bundle. --- src/builder.rs | 22 +++++++++++++++++----- tests/zsa.rs | 8 ++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 2b9729c0c..fa7c2f93a 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -464,6 +464,18 @@ impl Builder { i64::try_from(value_balance).and_then(|i| V::try_from(i).map_err(|_| value::OverflowError)) } + /// Returns the number of actions to add to this bundle in order to contain at least MIN_ACTION actions. + fn num_missing_actions(&self) -> usize { + let num_actions = [self.spends.len(), self.recipients.len()] + .iter() + .max() + .cloned() + .unwrap(); + (num_actions < MIN_ACTIONS) + .then(|| MIN_ACTIONS - num_actions) + .unwrap_or(0) + } + /// Builds a bundle containing the given spent notes and recipients. /// /// The returned bundle will have no proof or signatures; these can be applied with @@ -480,11 +492,11 @@ impl Builder { { let num_spends = spends.len(); let num_recipients = recipients.len(); - let num_actions = [num_spends, num_recipients, MIN_ACTIONS] - .iter() - .max() - .cloned() - .unwrap(); + let mut num_actions = [num_spends, num_recipients].iter().max().cloned().unwrap(); + // We might have to add dummy/split actions only for the first asset to reach MIN_ACTIONS. + pre_actions + .is_empty() + .then(|| num_actions += self.num_missing_actions()); let first_spend = spends.first().cloned(); diff --git a/tests/zsa.rs b/tests/zsa.rs index cbda7fc19..17c0a4b60 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -408,7 +408,7 @@ fn zsa_issue_and_transfer() { ], vec![], anchor, - 4, + 2, &keys, ) .unwrap(); @@ -436,7 +436,7 @@ fn zsa_issue_and_transfer() { ], vec![], native_anchor, - 5, + 4, &keys, ) .unwrap(); @@ -468,7 +468,7 @@ fn zsa_issue_and_transfer() { ], vec![], anchor_t7, - 4, + 2, &keys, ) .unwrap(); @@ -489,7 +489,7 @@ fn zsa_issue_and_transfer() { ], vec![], anchor_t7, - 4, + 2, &keys, ) .unwrap(); From 9965a6d06b64f71de5a2a9b23fa044f137e2aed6 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 6 Jun 2023 17:11:27 +0200 Subject: [PATCH 34/67] Add serialization of finalize flag (#68) Add a function `flags` to serialize the `finalize` flag of an IssueAction to a byte. This function will be used by the client. --- src/issuance.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/issuance.rs b/src/issuance.rs index af243358e..88719eb72 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -61,6 +61,23 @@ impl IssueAction { } } + /// Constructs a new `IssueAction`. + pub fn new_with_finalize(asset_desc: String, note: &Note, flags: u8) -> Option { + let finalize = match flags { + 0b0000_0000 => false, + 0b0000_0001 => true, + _ => return None, + }; + Some(IssueAction { + asset_desc, + notes: NonEmpty { + head: *note, + tail: vec![], + }, + finalize, + }) + } + /// Constructs an `IssueAction` from its constituent parts. pub fn from_parts(asset_desc: String, notes: NonEmpty, finalize: bool) -> Self { IssueAction { @@ -134,6 +151,11 @@ impl IssueAction { .then(|| Ok((asset, AssetSupply::new(value_sum, self.is_finalized())))) .ok_or(IssueBundleIkMismatchAssetBase)? } + + /// Serialize `finalize` flag to a byte + pub fn flags(&self) -> u8 { + self.finalize.then(|| 0b0000_0001).unwrap_or(0b0000_0000) + } } /// Defines the authorization type of an Issue bundle. @@ -1272,6 +1294,23 @@ mod tests { WrongAssetDescSize ); } + + #[test] + fn test_finalize_flag_serialization() { + let mut rng = OsRng; + let (_, _, note) = Note::dummy(&mut rng, None, AssetBase::native()); + + let action = + IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 0u8).unwrap(); + assert_eq!(action.flags(), 0b0000_0000); + + let action = + IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 1u8).unwrap(); + assert_eq!(action.flags(), 0b0000_0001); + + let action = IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 2u8); + assert!(action.is_none()); + } } /// Generators for property testing. From 7ad2bacf5d5e261634d6f5076d88c30630e5cf87 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 12 Jun 2023 17:20:20 +0200 Subject: [PATCH 35/67] Fix IssueBundle and IssueAction structures (#70) The vector of issue actions in an IssueBundle must not be empty. The vector of notes in an IssueAction could be empty when `finalize` is set to true. We could add some actions in an `IssueAction` even if `finalize` is set to true. Only the next block is affected by the `finalize` flag, not the current block. --- src/issuance.rs | 646 +++++++++++++++++++++++------------------------- tests/zsa.rs | 26 +- 2 files changed, 330 insertions(+), 342 deletions(-) diff --git a/src/issuance.rs b/src/issuance.rs index 88719eb72..d312b0dbe 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -7,8 +7,8 @@ use std::fmt; use crate::bundle::commitments::{hash_issue_bundle_auth_data, hash_issue_bundle_txid_data}; use crate::issuance::Error::{ - IssueActionAlreadyFinalized, IssueActionIncorrectAssetBase, IssueActionNotFound, - IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, + IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, + IssueActionWithoutNoteNotFinalized, IssueBundleIkMismatchAssetBase, IssueBundleInvalidSignature, ValueSumOverflow, WrongAssetDescSize, }; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; @@ -30,7 +30,7 @@ pub struct IssueBundle { /// The issuer key for the note being created. ik: IssuanceValidatingKey, /// The list of issue actions that make up this bundle. - actions: Vec, + actions: NonEmpty, /// The authorization for this action. authorization: T, } @@ -43,26 +43,23 @@ pub struct IssueAction { /// Asset description for verification. asset_desc: String, /// The newly issued notes. - notes: NonEmpty, + notes: Vec, /// `finalize` will prevent further issuance of the same asset type. finalize: bool, } -impl IssueAction { - /// Constructs a new `IssueAction`. - pub fn new(asset_desc: String, note: &Note) -> Self { - IssueAction { - asset_desc, - notes: NonEmpty { - head: *note, - tail: vec![], - }, - finalize: false, - } - } +/// The parameters required to add a Note into an IssueAction. +#[derive(Debug)] +pub struct IssueInfo { + /// The recipient of the funds. + pub recipient: Address, + /// The value of this note. + pub value: NoteValue, +} +impl IssueAction { /// Constructs a new `IssueAction`. - pub fn new_with_finalize(asset_desc: String, note: &Note, flags: u8) -> Option { + pub fn new_with_flags(asset_desc: String, notes: Vec, flags: u8) -> Option { let finalize = match flags { 0b0000_0000 => false, 0b0000_0001 => true, @@ -70,16 +67,13 @@ impl IssueAction { }; Some(IssueAction { asset_desc, - notes: NonEmpty { - head: *note, - tail: vec![], - }, + notes, finalize, }) } /// Constructs an `IssueAction` from its constituent parts. - pub fn from_parts(asset_desc: String, notes: NonEmpty, finalize: bool) -> Self { + pub fn from_parts(asset_desc: String, notes: Vec, finalize: bool) -> Self { IssueAction { asset_desc, notes, @@ -93,7 +87,7 @@ impl IssueAction { } /// Returns the issued notes. - pub fn notes(&self) -> &NonEmpty { + pub fn notes(&self) -> &Vec { &self.notes } @@ -121,35 +115,39 @@ impl IssueAction { /// /// This function may return an error in any of the following cases: /// - /// * `IssueActionIncorrectAssetBase`: If the asset type of any note in the `IssueAction` is - /// not equal to the asset type of the first note. - /// /// * `ValueSumOverflow`: If the total amount value of all notes in the `IssueAction` overflows. /// /// * `IssueBundleIkMismatchAssetBase`: If the provided `ik` is not used to derive the /// `AssetBase` for **all** internal notes. + /// + /// * `IssueActionWithoutNoteNotFinalized`:If the `IssueAction` contains no note and is not finalized. fn verify_supply(&self, ik: &IssuanceValidatingKey) -> Result<(AssetBase, AssetSupply), Error> { + if self.notes.is_empty() && !self.is_finalized() { + return Err(IssueActionWithoutNoteNotFinalized); + } + + let issue_asset = AssetBase::derive(ik, &self.asset_desc); + // Calculate the value of the asset as a sum of values of all its notes - // and ensure all note types are equal - let (asset, value_sum) = self.notes.iter().try_fold( - (self.notes().head.asset(), ValueSum::zero()), - |(asset, value_sum), ¬e| { - // All assets should have the same `AssetBase` + // and ensure all note types are equal the asset derived from asset_desc and ik. + let value_sum = self + .notes + .iter() + .try_fold(ValueSum::zero(), |value_sum, ¬e| { + // All assets should be derived correctly note.asset() - .eq(&asset) + .eq(&issue_asset) .then(|| ()) - .ok_or(IssueActionIncorrectAssetBase)?; + .ok_or(IssueBundleIkMismatchAssetBase)?; // The total amount should not overflow - Ok((asset, (value_sum + note.value()).ok_or(ValueSumOverflow)?)) - }, - )?; + (value_sum + note.value()).ok_or(ValueSumOverflow) + })?; - // Return the asset and its supply (or an error if the asset was not properly derived) - asset - .eq(&AssetBase::derive(ik, &self.asset_desc)) - .then(|| Ok((asset, AssetSupply::new(value_sum, self.is_finalized())))) - .ok_or(IssueBundleIkMismatchAssetBase)? + Ok(( + issue_asset, + AssetSupply::new(value_sum, self.is_finalized()), + )) } /// Serialize `finalize` flag to a byte @@ -199,7 +197,7 @@ impl IssueBundle { &self.ik } /// Return the actions for a given `IssueBundle`. - pub fn actions(&self) -> &Vec { + pub fn actions(&self) -> &NonEmpty { &self.actions } /// Return the notes from all actions for a given `IssueBundle`. @@ -238,7 +236,7 @@ impl IssueBundle { /// Constructs an `IssueBundle` from its constituent parts. pub fn from_parts( ik: IssuanceValidatingKey, - actions: Vec, + actions: NonEmpty, authorization: T, ) -> Self { IssueBundle { @@ -251,27 +249,77 @@ impl IssueBundle { impl IssueBundle { /// Constructs a new `IssueBundle`. - pub fn new(ik: IssuanceValidatingKey) -> IssueBundle { - IssueBundle { - ik, - actions: Vec::new(), - authorization: Unauthorized, + /// + /// If issue_info is None, the new `IssueBundle` will contain one `IssueAction` without notes + /// and with `finalize` set to true. + /// Otherwise, the new `IssueBundle` will contain one `IssueAction with one note created from + /// issue_info values and with `finalize` set to false. In this created note, rho will be + /// randomly sampled, similar to dummy note generation. + /// + /// # Errors + /// + /// This function may return an error in any of the following cases: + /// + /// * `WrongAssetDescSize`: If `asset_desc` is empty or longer than 512 bytes. + pub fn new( + ik: IssuanceValidatingKey, + asset_desc: String, + issue_info: Option, + mut rng: impl RngCore, + ) -> Result<(IssueBundle, AssetBase), Error> { + if !is_asset_desc_of_valid_size(&asset_desc) { + return Err(WrongAssetDescSize); } + + let asset = AssetBase::derive(&ik, &asset_desc); + + let action = match issue_info { + None => IssueAction { + asset_desc, + notes: vec![], + finalize: true, + }, + Some(issue_info) => { + let note = Note::new( + issue_info.recipient, + issue_info.value, + asset, + Nullifier::dummy(&mut rng), + &mut rng, + ); + + IssueAction { + asset_desc, + notes: vec![note], + finalize: false, + } + } + }; + + Ok(( + IssueBundle { + ik, + actions: NonEmpty::new(action), + authorization: Unauthorized, + }, + asset, + )) } /// Add a new note to the `IssueBundle`. /// /// Rho will be randomly sampled, similar to dummy note generation. /// - /// # Panics + /// # Errors /// - /// Panics if `asset_desc` is empty or longer than 512 bytes. + /// This function may return an error in any of the following cases: + /// + /// * `WrongAssetDescSize`: If `asset_desc` is empty or longer than 512 bytes. pub fn add_recipient( &mut self, asset_desc: String, recipient: Address, value: NoteValue, - finalize: bool, mut rng: impl RngCore, ) -> Result { if !is_asset_desc_of_valid_size(&asset_desc) { @@ -288,26 +336,25 @@ impl IssueBundle { &mut rng, ); - match self + let action = self .actions .iter_mut() - .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)) - { - // Append to an existing IssueAction. + .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)); + + match action { Some(action) => { - if action.finalize { - return Err(IssueActionAlreadyFinalized); - }; + // Append to an existing IssueAction. action.notes.push(note); - finalize.then(|| action.finalize = true); } - // Insert a new IssueAction. None => { - let mut action = IssueAction::new(asset_desc, ¬e); - finalize.then(|| action.finalize = true); - self.actions.push(action); + // Insert a new IssueAction. + self.actions.push(IssueAction { + asset_desc, + notes: vec![note], + finalize: false, + }); } - } + }; Ok(asset) } @@ -430,7 +477,6 @@ impl IssueBundle { /// asset in the bundle is incorrect. /// * `IssueActionPreviouslyFinalizedAssetBase`: This error occurs if the asset has already been /// finalized (inserted into the `finalized` collection). -/// * `IssueActionIncorrectAssetBase`: This error occurs if any note has an incorrect note type. /// * `ValueSumOverflow`: This error occurs if an overflow happens during the calculation of /// the value sum for the notes in the asset. /// * `IssueBundleIkMismatchAssetBase`: This error is raised if the `AssetBase` derived from @@ -473,16 +519,14 @@ pub fn verify_issue_bundle( /// Errors produced during the issuance process #[derive(Debug, PartialEq, Eq)] pub enum Error { - /// Unable to add note to the IssueAction since it has already been finalized. - IssueActionAlreadyFinalized, /// The requested IssueAction not exists in the bundle. IssueActionNotFound, - /// Not all `AssetBase`s are the same inside the action. - IssueActionIncorrectAssetBase, /// The provided `isk` and the driven `ik` does not match at least one note type. IssueBundleIkMismatchAssetBase, /// `asset_desc` should be between 1 and 512 bytes. WrongAssetDescSize, + /// The `IssueAction` is not finalized but contains no notes. + IssueActionWithoutNoteNotFinalized, /// Verification errors: /// Invalid signature. @@ -499,18 +543,9 @@ impl std::error::Error for Error {} impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - IssueActionAlreadyFinalized => { - write!( - f, - "unable to add note to the IssueAction since it has already been finalized" - ) - } IssueActionNotFound => { write!(f, "the requested IssueAction not exists in the bundle.") } - IssueActionIncorrectAssetBase => { - write!(f, "not all `AssetBase`s are the same inside the action") - } IssueBundleIkMismatchAssetBase => { write!( f, @@ -520,6 +555,12 @@ impl fmt::Display for Error { WrongAssetDescSize => { write!(f, "`asset_desc` should be between 1 and 512 bytes") } + IssueActionWithoutNoteNotFinalized => { + write!( + f, + "this `IssueAction` contains no notes but is not finalized" + ) + } IssueBundleInvalidSignature(_) => { write!(f, "invalid signature") } @@ -538,11 +579,10 @@ impl fmt::Display for Error { #[cfg(test)] mod tests { - use super::{AssetSupply, IssueBundle}; + use super::{AssetSupply, IssueBundle, IssueInfo}; use crate::issuance::Error::{ - IssueActionAlreadyFinalized, IssueActionIncorrectAssetBase, IssueActionNotFound, - IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, - IssueBundleInvalidSignature, WrongAssetDescSize, + IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, + IssueBundleIkMismatchAssetBase, IssueBundleInvalidSignature, WrongAssetDescSize, }; use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; use crate::keys::{ @@ -551,11 +591,9 @@ mod tests { use crate::note::{AssetBase, Nullifier}; use crate::value::{NoteValue, ValueSum}; use crate::{Address, Note}; - use nonempty::NonEmpty; use rand::rngs::OsRng; use rand::RngCore; use reddsa::Error::InvalidSignature; - use std::borrow::BorrowMut; use std::collections::HashSet; fn setup_params() -> ( @@ -611,14 +649,7 @@ mod tests { ( ik, asset, - IssueAction::from_parts( - note1_asset_desc.into(), - NonEmpty { - head: note1, - tail: vec![note2], - }, - finalize, - ), + IssueAction::from_parts(note1_asset_desc.into(), vec![note1, note2], finalize), ) } @@ -661,7 +692,7 @@ mod tests { assert_eq!( action.verify_supply(&ik), - Err(IssueActionIncorrectAssetBase) + Err(IssueBundleIkMismatchAssetBase) ); } @@ -680,48 +711,55 @@ mod tests { fn issue_bundle_basic() { let (rng, _, ik, recipient, _) = setup_params(); - let mut bundle = IssueBundle::new(ik); - let str = String::from("Halo"); let str2 = String::from("Halo2"); assert_eq!( - bundle - .add_recipient( - String::from_utf8(vec![b'X'; 513]).unwrap(), + IssueBundle::new( + ik.clone(), + String::from_utf8(vec![b'X'; 513]).unwrap(), + Some(IssueInfo { recipient, - NoteValue::unsplittable(), - true, - rng, - ) - .unwrap_err(), + value: NoteValue::unsplittable() + }), + rng, + ) + .unwrap_err(), WrongAssetDescSize ); assert_eq!( - bundle - .add_recipient( - "".to_string(), + IssueBundle::new( + ik.clone(), + "".to_string(), + Some(IssueInfo { recipient, - NoteValue::unsplittable(), - true, - rng, - ) - .unwrap_err(), + value: NoteValue::unsplittable() + }), + rng, + ) + .unwrap_err(), WrongAssetDescSize ); - let asset = bundle - .add_recipient(str.clone(), recipient, NoteValue::from_raw(5), false, rng) - .unwrap(); + let (mut bundle, asset) = IssueBundle::new( + ik, + str.clone(), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let another_asset = bundle - .add_recipient(str, recipient, NoteValue::from_raw(10), false, rng) + .add_recipient(str, recipient, NoteValue::from_raw(10), rng) .unwrap(); assert_eq!(asset, another_asset); let third_asset = bundle - .add_recipient(str2.clone(), recipient, NoteValue::from_raw(15), false, rng) + .add_recipient(str2.clone(), recipient, NoteValue::from_raw(15), rng) .unwrap(); assert_ne!(asset, third_asset); @@ -730,53 +768,39 @@ mod tests { let action = bundle.get_action_by_type(asset).unwrap(); assert_eq!(action.notes.len(), 2); - assert_eq!(action.notes.first().value().inner(), 5); - assert_eq!(action.notes.first().asset(), asset); - assert_eq!(action.notes.first().recipient(), recipient); + assert_eq!(action.notes.first().unwrap().value().inner(), 5); + assert_eq!(action.notes.first().unwrap().asset(), asset); + assert_eq!(action.notes.first().unwrap().recipient(), recipient); - assert_eq!(action.notes.tail().first().unwrap().value().inner(), 10); - assert_eq!(action.notes.tail().first().unwrap().asset(), asset); - assert_eq!(action.notes.tail().first().unwrap().recipient(), recipient); + assert_eq!(action.notes.get(1).unwrap().value().inner(), 10); + assert_eq!(action.notes.get(1).unwrap().asset(), asset); + assert_eq!(action.notes.get(1).unwrap().recipient(), recipient); let action2 = bundle.get_action(str2).unwrap(); assert_eq!(action2.notes.len(), 1); - assert_eq!(action2.notes().first().value().inner(), 15); - assert_eq!(action2.notes().first().asset(), third_asset); + assert_eq!(action2.notes().first().unwrap().value().inner(), 15); + assert_eq!(action2.notes().first().unwrap().asset(), third_asset); } #[test] fn issue_bundle_finalize_asset() { let (rng, _, ik, recipient, _) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("NFT"), + let (mut bundle, _) = IssueBundle::new( + ik, + String::from("NFT"), + Some(IssueInfo { recipient, - NoteValue::from_raw(u64::MIN), - false, - rng, - ) - .expect("Should properly add recipient"); + value: NoteValue::from_raw(u64::MIN), + }), + rng, + ) + .expect("Should properly add recipient"); bundle .finalize_action(String::from("NFT")) .expect("Should finalize properly"); - assert_eq!( - bundle - .add_recipient( - String::from("NFT"), - recipient, - NoteValue::unsplittable(), - false, - rng, - ) - .unwrap_err(), - IssueActionAlreadyFinalized - ); - assert_eq!( bundle .finalize_action(String::from("Another NFT")) @@ -795,46 +819,22 @@ mod tests { bundle.finalize_action("".to_string()).unwrap_err(), WrongAssetDescSize ); - - bundle - .add_recipient( - String::from("Another NFT"), - recipient, - NoteValue::unsplittable(), - true, - rng, - ) - .expect("should add and finalize"); - - assert_eq!( - bundle - .add_recipient( - String::from("Another NFT"), - recipient, - NoteValue::unsplittable(), - true, - rng, - ) - .unwrap_err(), - IssueActionAlreadyFinalized - ); } #[test] fn issue_bundle_prepare() { let (rng, _, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("Frost"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("Frost"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let prepared = bundle.prepare(sighash); assert_eq!(prepared.authorization().sighash, sighash); @@ -844,17 +844,16 @@ mod tests { fn issue_bundle_sign() { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik.clone()); - - bundle - .add_recipient( - String::from("Sign"), + let (bundle, _) = IssueBundle::new( + ik.clone(), + String::from("Sign"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -866,17 +865,16 @@ mod tests { fn issue_bundle_invalid_isk_for_signature() { let (rng, _, ik, recipient, _) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("IssueBundle"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("IssueBundle"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut OsRng)).into(); @@ -892,18 +890,17 @@ mod tests { fn issue_bundle_incorrect_asset_for_signature() { let (mut rng, isk, ik, recipient, _) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - // Add "normal" note - bundle - .add_recipient( - String::from("IssueBundle"), + // Create a bundle with "normal" note + let (mut bundle, _) = IssueBundle::new( + ik, + String::from("IssueBundle"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); // Add "bad" note let note = Note::new( @@ -913,37 +910,30 @@ mod tests { Nullifier::dummy(&mut rng), &mut rng, ); - bundle - .actions - .first_mut() - .unwrap() - .notes - .borrow_mut() - .push(note); + bundle.actions.first_mut().notes.push(note); let err = bundle .prepare([0; 32]) .sign(rng, &isk) .expect_err("should not be able to sign"); - assert_eq!(err, IssueActionIncorrectAssetBase); + assert_eq!(err, IssueBundleIkMismatchAssetBase); } #[test] fn issue_bundle_verify() { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("Verify"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("Verify"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let prev_finalized = &mut HashSet::new(); @@ -959,16 +949,19 @@ mod tests { fn issue_bundle_verify_with_finalize() { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik.clone()); + let (mut bundle, _) = IssueBundle::new( + ik.clone(), + String::from("Verify with finalize"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(7), + }), + rng, + ) + .unwrap(); bundle - .add_recipient( - String::from("Verify with finalize"), - recipient, - NoteValue::from_raw(7), - true, - rng, - ) + .finalize_action(String::from("Verify with finalize")) .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -986,8 +979,6 @@ mod tests { fn issue_bundle_verify_with_supply_info() { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik.clone()); - let asset1_desc = "Verify with supply info 1"; let asset2_desc = "Verify with supply info 2"; let asset3_desc = "Verify with supply info 3"; @@ -996,42 +987,44 @@ mod tests { let asset2_base = AssetBase::derive(&ik, &String::from(asset2_desc)); let asset3_base = AssetBase::derive(&ik, &String::from(asset3_desc)); - bundle - .add_recipient( - String::from(asset1_desc), + let (mut bundle, _) = IssueBundle::new( + ik, + String::from(asset1_desc), + Some(IssueInfo { recipient, - NoteValue::from_raw(7), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(7), + }), + rng, + ) + .unwrap(); bundle .add_recipient( String::from(asset1_desc), recipient, NoteValue::from_raw(8), - true, rng, ) .unwrap(); + bundle.finalize_action(String::from(asset1_desc)).unwrap(); + bundle .add_recipient( String::from(asset2_desc), recipient, NoteValue::from_raw(10), - true, rng, ) .unwrap(); + bundle.finalize_action(String::from(asset2_desc)).unwrap(); + bundle .add_recipient( String::from(asset3_desc), recipient, NoteValue::from_raw(5), - false, rng, ) .unwrap(); @@ -1069,17 +1062,16 @@ mod tests { fn issue_bundle_verify_fail_previously_finalized() { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik.clone()); - - bundle - .add_recipient( - String::from("already final"), + let (bundle, _) = IssueBundle::new( + ik.clone(), + String::from("already final"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let prev_finalized = &mut HashSet::new(); @@ -1105,17 +1097,16 @@ mod tests { let (mut rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("bad sig"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("bad sig"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut rng)).into(); @@ -1136,17 +1127,16 @@ mod tests { #[test] fn issue_bundle_verify_fail_wrong_sighash() { let (rng, isk, ik, recipient, random_sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("Asset description"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let sighash: [u8; 32] = bundle.commitment().into(); let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -1162,17 +1152,16 @@ mod tests { fn issue_bundle_verify_fail_incorrect_asset_description() { let (mut rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("Asset description"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -1185,19 +1174,13 @@ mod tests { &mut rng, ); - signed - .actions - .first_mut() - .unwrap() - .notes - .borrow_mut() - .push(note); + signed.actions.first_mut().notes.push(note); let prev_finalized = &HashSet::new(); assert_eq!( verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), - IssueActionIncorrectAssetBase + IssueBundleIkMismatchAssetBase ); } @@ -1207,17 +1190,16 @@ mod tests { let (mut rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from(asset_description), + let (bundle, _) = IssueBundle::new( + ik, + String::from(asset_description), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -1234,7 +1216,7 @@ mod tests { &mut rng, ); - signed.actions.first_mut().unwrap().notes = NonEmpty::new(note); + signed.actions.first_mut().notes = vec![note]; let prev_finalized = &HashSet::new(); @@ -1255,17 +1237,16 @@ mod tests { let (rng, isk, ik, recipient, sighash) = setup_params(); - let mut bundle = IssueBundle::new(ik); - - bundle - .add_recipient( - String::from("Asset description"), + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { recipient, - NoteValue::from_raw(5), - false, - rng, - ) - .unwrap(); + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); let prev_finalized = HashSet::new(); @@ -1274,7 +1255,6 @@ mod tests { signed .actions .first_mut() - .unwrap() .modify_descr(String::from_utf8(vec![b'X'; 513]).unwrap()); assert_eq!( @@ -1283,11 +1263,7 @@ mod tests { ); // 2. Try empty description - signed - .actions - .first_mut() - .unwrap() - .modify_descr("".to_string()); + signed.actions.first_mut().modify_descr("".to_string()); assert_eq!( verify_issue_bundle(&signed, sighash, &prev_finalized).unwrap_err(), @@ -1301,14 +1277,17 @@ mod tests { let (_, _, note) = Note::dummy(&mut rng, None, AssetBase::native()); let action = - IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 0u8).unwrap(); + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 0u8) + .unwrap(); assert_eq!(action.flags(), 0b0000_0000); let action = - IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 1u8).unwrap(); + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 1u8) + .unwrap(); assert_eq!(action.flags(), 0b0000_0001); - let action = IssueAction::new_with_finalize(String::from("Asset description"), ¬e, 2u8); + let action = + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 2u8); assert!(action.is_none()); } } @@ -1321,6 +1300,7 @@ pub mod testing { use crate::keys::testing::{arb_issuance_authorizing_key, arb_issuance_validating_key}; use crate::note::asset_base::testing::zsa_asset_id; use crate::note::testing::arb_zsa_note; + use nonempty::NonEmpty; use proptest::collection::vec; use proptest::prelude::*; use proptest::prop_compose; @@ -1335,7 +1315,11 @@ pub mod testing { ( note in arb_zsa_note(asset), )-> IssueAction { - IssueAction::new(asset_desc.clone(), ¬e) + IssueAction{ + asset_desc: asset_desc.clone(), + notes: vec![note], + finalize: false, + } } } @@ -1346,6 +1330,7 @@ pub mod testing { actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), ik in arb_issuance_validating_key() ) -> IssueBundle { + let actions = NonEmpty::from_vec(actions).unwrap(); IssueBundle { ik, actions, @@ -1363,6 +1348,7 @@ pub mod testing { ik in arb_issuance_validating_key(), fake_sighash in prop::array::uniform32(prop::num::u8::ANY) ) -> IssueBundle { + let actions = NonEmpty::from_vec(actions).unwrap(); IssueBundle { ik, actions, @@ -1383,7 +1369,7 @@ pub mod testing { fake_sighash in prop::array::uniform32(prop::num::u8::ANY) ) -> IssueBundle { let rng = StdRng::from_seed(rng_seed); - + let actions = NonEmpty::from_vec(actions).unwrap(); IssueBundle { ik, actions, diff --git a/tests/zsa.rs b/tests/zsa.rs index 17c0a4b60..af30ba5f1 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -4,7 +4,7 @@ use crate::builder::verify_bundle; use bridgetree::BridgeTree; use incrementalmerkletree::Hashable; use orchard::bundle::Authorized; -use orchard::issuance::{verify_issue_bundle, IssueBundle, Signed, Unauthorized}; +use orchard::issuance::{verify_issue_bundle, IssueBundle, IssueInfo, Signed, Unauthorized}; use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use orchard::note::{AssetBase, ExtractedNoteCommitment}; use orchard::note_encryption_v3::OrchardDomainV3; @@ -138,23 +138,25 @@ pub fn build_merkle_path_with_two_leaves( fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { let mut rng = OsRng; // Create a issuance bundle - let mut unauthorized = IssueBundle::new(keys.ik().clone()); + let unauthorized_asset = IssueBundle::new( + keys.ik().clone(), + asset_descr.to_string(), + Some(IssueInfo { + recipient: keys.recipient, + value: NoteValue::from_raw(40), + }), + &mut rng, + ); + + assert!(unauthorized_asset.is_ok()); + + let (mut unauthorized, _) = unauthorized_asset.unwrap(); - assert!(unauthorized - .add_recipient( - asset_descr.to_string(), - keys.recipient, - NoteValue::from_raw(40), - false, - &mut rng, - ) - .is_ok()); assert!(unauthorized .add_recipient( asset_descr.to_string(), keys.recipient, NoteValue::from_raw(2), - false, &mut rng, ) .is_ok()); From 950b80616db87bcf6685baba7a76f95e718568c7 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Tue, 13 Jun 2023 13:12:08 +0530 Subject: [PATCH 36/67] Updates to TXID Digest and Authorizing Data Commitment (#66) This updates the computation of the transaction digest and authorizing data commitment for the issue bundle to be in line with the specification in ZIP 227. --- src/bundle/commitments.rs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index dc6a0b65a..97cc8ab09 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -10,7 +10,9 @@ const ZCASH_ORCHARD_ACTIONS_COMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrc const ZCASH_ORCHARD_ACTIONS_MEMOS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActMHash"; const ZCASH_ORCHARD_ACTIONS_NONCOMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActNHash"; const ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxAuthOrchaHash"; -const ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcZSAIssue"; +const ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION: &[u8; 16] = b"ZTxIdSAIssueHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_ACTION_PERSONALIZATION: &[u8; 16] = b"ZTxIdIssuActHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_NOTE_PERSONALIZATION: &[u8; 16] = b"ZTxIdIAcNoteHash"; const ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION: &[u8; 16] = b"ZTxAuthZSAOrHash"; fn hasher(personal: &[u8; 16]) -> State { @@ -97,22 +99,34 @@ pub fn hash_bundle_auth_empty() -> Blake2bHash { /// Construct the commitment for the issue bundle pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) -> Blake2bHash { let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION); + let mut ia = hasher(ZCASH_ORCHARD_ZSA_ISSUE_ACTION_PERSONALIZATION); + let mut ind = hasher(ZCASH_ORCHARD_ZSA_ISSUE_NOTE_PERSONALIZATION); for action in bundle.actions().iter() { for note in action.notes().iter() { - h.update(¬e.recipient().to_raw_address_bytes()); - h.update(¬e.value().to_bytes()); - h.update(¬e.asset().to_bytes()); - h.update(¬e.rho().to_bytes()); - h.update(note.rseed().as_bytes()); + ind.update(¬e.recipient().to_raw_address_bytes()); + ind.update(¬e.value().to_bytes()); + ind.update(¬e.asset().to_bytes()); + ind.update(¬e.rho().to_bytes()); + ind.update(note.rseed().as_bytes()); } - h.update(action.asset_desc().as_bytes()); - h.update(&[u8::from(action.is_finalized())]); + ia.update(ind.finalize().as_bytes()); + ia.update(action.asset_desc().as_bytes()); + ia.update(&[u8::from(action.is_finalized())]); } + h.update(ia.finalize().as_bytes()); h.update(&bundle.ik().to_bytes()); h.finalize() } +/// Construct the commitment for the absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_txid_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() +} + /// Construct the commitment to the authorizing data of an /// authorized issue bundle pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake2bHash { @@ -120,3 +134,11 @@ pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake h.update(&<[u8; 64]>::from(bundle.authorization().signature())); h.finalize() } + +/// Construct the commitment for an absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_auth_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION).finalize() +} From f49be89f351806c25387e2a83a6e0ee089c95ae8 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 19 Jun 2023 10:01:51 +0200 Subject: [PATCH 37/67] Update code to refer to the upgraded version of librustzcash and reflect the corresponding changes --- Cargo.toml | 6 +++--- src/builder.rs | 1 - src/note_encryption_v3.rs | 26 ++++---------------------- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c8c88fe56..006f98c3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ reddsa = "0.5" nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" -zcash_note_encryption = "0.2" +zcash_note_encryption = "0.4" incrementalmerkletree = "0.4" # Logging @@ -57,7 +57,7 @@ criterion = "0.3" halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" -zcash_note_encryption = { version = "0.2", features = ["pre-zip-212"] } +zcash_note_encryption = { version = "0.4", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.4", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] @@ -92,4 +92,4 @@ debug = true debug = true [patch.crates-io] -zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", rev = "07c377ddedf71ab7c7a266d284b054a2dafc2ed4" } +zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", branch = "upgrade_for_orchard_v05_new" } diff --git a/src/builder.rs b/src/builder.rs index 70cd3dc77..bf3c7b581 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -287,7 +287,6 @@ impl ActionInfo { let encryptor = OrchardNoteEncryption::new( self.output.ovk, note, - self.output.recipient, self.output.memo.unwrap_or_else(|| { let mut memo = [0; 512]; memo[0] = 0xf6; diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs index 4333f6dba..7594b588d 100644 --- a/src/note_encryption_v3.rs +++ b/src/note_encryption_v3.rs @@ -16,7 +16,6 @@ use crate::{ OutgoingViewingKey, PreparedEphemeralPublicKey, PreparedIncomingViewingKey, SharedSecret, }, note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, - spec::diversify_hash, value::{NoteValue, ValueCommitment}, Address, Note, }; @@ -253,11 +252,7 @@ impl Domain for OrchardDomainV3 { secret.kdf_orchard(ephemeral_key) } - fn note_plaintext_bytes( - note: &Self::Note, - _: &Self::Recipient, - memo: &Self::Memo, - ) -> NotePlaintextBytes { + fn note_plaintext_bytes(note: &Self::Note, memo: &Self::Memo) -> NotePlaintextBytes { let mut np = [0u8; NOTE_PLAINTEXT_SIZE_V3]; np[0] = 0x03; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); @@ -312,22 +307,9 @@ impl Domain for OrchardDomainV3 { fn parse_note_plaintext_without_memo_ovk( &self, pk_d: &Self::DiversifiedTransmissionKey, - esk: &Self::EphemeralSecretKey, - ephemeral_key: &EphemeralKeyBytes, plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { - orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { - if esk - .derive_public(diversify_hash(diversifier.as_array())) - .to_bytes() - .0 - == ephemeral_key.0 - { - Some(*pk_d) - } else { - None - } - }) + orchard_parse_note_plaintext_without_memo(self, plaintext, |_| Some(*pk_d)) } fn extract_memo( @@ -499,7 +481,7 @@ mod tests { let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; // Encode. - let mut plaintext = OrchardDomainV3::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + let mut plaintext = OrchardDomainV3::note_plaintext_bytes(¬e, memo); // Decode. let domain = OrchardDomainV3 { rho: note.rho() }; @@ -622,7 +604,7 @@ mod tests { // Test encryption // - let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, recipient, tv.memo); + let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, tv.memo); assert_eq!(ne.encrypt_note_plaintext().as_ref(), &tv.c_enc[..]); assert_eq!( From aa1d89561cd1e28578c0cbb6c594efa3806131da Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 20 Jun 2023 20:35:57 +0200 Subject: [PATCH 38/67] Fix issuance key derivation (#74) Updated constants for master (extended) issuance key according to ZIP 227. Previously, we used the same personalization for the master extended spending key and the master extended issuance key, as well as the same purpose constant for the spending master key and the issuance master key. Now, the following updates have been made: - Personalization for the master extended issuance key: ZIP32ZSAIssue_V1 - Purpose constant for the issuance master key: 227" --- src/issuance.rs | 15 ++-- src/keys.rs | 166 +++++++++++++++++++++++++++--------- src/note/asset_base.rs | 18 ++-- src/primitives/redpallas.rs | 4 +- src/supply_info.rs | 6 +- src/zip32.rs | 41 ++++++--- tests/zsa.rs | 8 +- 7 files changed, 180 insertions(+), 78 deletions(-) diff --git a/src/issuance.rs b/src/issuance.rs index d312b0dbe..e3c7e973b 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -586,7 +586,8 @@ mod tests { }; use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; use crate::keys::{ - FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, + FullViewingKey, IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey, Scope, + SpendingKey, }; use crate::note::{AssetBase, Nullifier}; use crate::value::{NoteValue, ValueSum}; @@ -605,8 +606,8 @@ mod tests { ) { let mut rng = OsRng; - let sk = SpendingKey::random(&mut rng); - let isk: IssuanceAuthorizingKey = (&sk).into(); + let sk_iss = IssuanceKey::random(&mut rng); + let isk: IssuanceAuthorizingKey = (&sk_iss).into(); let ik: IssuanceValidatingKey = (&isk).into(); let fvk = FullViewingKey::from(&SpendingKey::random(&mut rng)); @@ -876,7 +877,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut OsRng)).into(); + let wrong_isk: IssuanceAuthorizingKey = (&IssuanceKey::random(&mut OsRng)).into(); let err = bundle .prepare([0; 32]) @@ -1108,7 +1109,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = (&SpendingKey::random(&mut rng)).into(); + let wrong_isk: IssuanceAuthorizingKey = (&IssuanceKey::random(&mut rng)).into(); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -1203,8 +1204,8 @@ mod tests { let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let incorrect_sk = SpendingKey::random(&mut rng); - let incorrect_isk: IssuanceAuthorizingKey = (&incorrect_sk).into(); + let incorrect_sk_iss = IssuanceKey::random(&mut rng); + let incorrect_isk: IssuanceAuthorizingKey = (&incorrect_sk_iss).into(); let incorrect_ik: IssuanceValidatingKey = (&incorrect_isk).into(); // Add "bad" note diff --git a/src/keys.rs b/src/keys.rs index 6842d182d..7853d4920 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -11,7 +11,7 @@ use group::{ prime::PrimeCurveAffine, Curve, GroupEncoding, }; -use pasta_curves::pallas; +use pasta_curves::{pallas, pallas::Scalar}; use rand::{CryptoRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zcash_note_encryption::EphemeralKeyBytes; @@ -24,11 +24,15 @@ use crate::{ to_scalar, NonIdentityPallasPoint, NonZeroPallasBase, NonZeroPallasScalar, PreparedNonIdentityBase, PreparedNonZeroScalar, PrfExpand, }, - zip32::{self, ChildIndex, ExtendedSpendingKey}, + zip32::{ + self, ChildIndex, ExtendedSpendingKey, ZIP32_ORCHARD_PERSONALIZATION, + ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE, + }, }; const KDF_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_OrchardKDF"; const ZIP32_PURPOSE: u32 = 32; +const ZIP32_PURPOSE_FOR_ISSUANCE: u32 = 227; /// A spending key, from which all key material is derived. /// @@ -99,7 +103,8 @@ impl SpendingKey { ChildIndex::try_from(coin_type)?, ChildIndex::try_from(account)?, ]; - ExtendedSpendingKey::from_path(seed, path).map(|esk| esk.sk()) + ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION) + .map(|esk| esk.sk()) } } @@ -132,13 +137,17 @@ impl From<&SpendingKey> for SpendAuthorizingKey { // SpendingKey cannot be constructed such that this assertion would fail. assert!(!bool::from(ask.is_zero())); // TODO: Add TryFrom for SpendAuthorizingKey. - let ret = SpendAuthorizingKey(ask.to_repr().try_into().unwrap()); - // If the last bit of repr_P(ak) is 1, negate ask. - if (<[u8; 32]>::from(SpendValidatingKey::from(&ret).0)[31] >> 7) == 1 { - SpendAuthorizingKey((-ask).to_repr().try_into().unwrap()) - } else { - ret - } + SpendAuthorizingKey(conditionally_negate(ask)) + } +} + +// If the last bit of repr_P(ak) is 1, negate ask. +fn conditionally_negate(scalar: Scalar) -> redpallas::SigningKey { + let ret = redpallas::SigningKey::(scalar.to_repr().try_into().unwrap()); + if (<[u8; 32]>::from(redpallas::VerificationKey::::from(&ret).0)[31] >> 7) == 1 { + redpallas::SigningKey::((-scalar).to_repr().try_into().unwrap()) + } else { + ret } } @@ -178,7 +187,7 @@ impl SpendValidatingKey { self.0.randomize(randomizer) } - /// Converts this issuance validating key to its serialized form, + /// Converts this spend key to its serialized form, /// I2LEOSP_256(ak). pub(crate) fn to_bytes(&self) -> [u8; 32] { // This is correct because the wrapped point must have ỹ = 0, and @@ -194,9 +203,87 @@ impl SpendValidatingKey { } } +/// A function to check structural validity of the validating keys for authorizing transfers and +/// issuing assets +/// Structural validity checks for ak_P or ik_P: +/// - The point must not be the identity (which for Pallas is canonically encoded as all-zeroes). +/// - The compressed y-coordinate bit must be 0. +fn check_structural_validity( + verification_key_bytes: [u8; 32], +) -> Option> { + if verification_key_bytes != [0; 32] && verification_key_bytes[31] & 0x80 == 0 { + >::try_from(verification_key_bytes).ok() + } else { + None + } +} + /// We currently use `SpendAuth` as the `IssuanceAuth`. type IssuanceAuth = SpendAuth; +/// An issuance key, from which all key material is derived. +/// +/// $\mathsf{sk}$ as defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// +/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +#[derive(Debug, Copy, Clone)] +pub struct IssuanceKey([u8; 32]); + +impl From for IssuanceKey { + fn from(sk: SpendingKey) -> Self { + IssuanceKey(*sk.to_bytes()) + } +} + +impl ConstantTimeEq for IssuanceKey { + fn ct_eq(&self, other: &Self) -> Choice { + self.to_bytes().ct_eq(other.to_bytes()) + } +} + +impl IssuanceKey { + /// Generates a random issuance key. + /// + /// This is only used when generating a random AssetBase. + /// Real issuance keys should be derived according to [ZIP 32]. + /// + /// [ZIP 32]: https://zips.z.cash/zip-0032 + pub(crate) fn random(rng: &mut impl RngCore) -> Self { + SpendingKey::random(rng).into() + } + + /// Constructs an Orchard issuance key from uniformly-random bytes. + /// + /// Returns `None` if the bytes do not correspond to a valid Orchard issuance key. + pub fn from_bytes(sk_iss: [u8; 32]) -> CtOption { + let sk_iss = IssuanceKey(sk_iss); + // If isk = 0 (A scalar value), discard this key. + let isk = IssuanceAuthorizingKey::derive_inner(&sk_iss); + CtOption::new(sk_iss, !isk.is_zero()) + } + + /// Returns the raw bytes of the issuance key. + pub fn to_bytes(&self) -> &[u8; 32] { + &self.0 + } + + /// Derives the Orchard issuance key for the given seed, coin type, and account. + pub fn from_zip32_seed( + seed: &[u8], + coin_type: u32, + account: u32, + ) -> Result { + // Call zip32 logic + let path = &[ + ChildIndex::try_from(ZIP32_PURPOSE_FOR_ISSUANCE)?, + ChildIndex::try_from(coin_type)?, + ChildIndex::try_from(account)?, + ]; + ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE) + .map(|esk| esk.sk().into()) + } +} + /// An issuance authorizing key, used to create issuance authorization signatures. /// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. /// @@ -208,9 +295,9 @@ type IssuanceAuth = SpendAuth; pub struct IssuanceAuthorizingKey(redpallas::SigningKey); impl IssuanceAuthorizingKey { - /// Derives isk from sk. Internal use only, does not enforce all constraints. - fn derive_inner(sk: &SpendingKey) -> pallas::Scalar { - to_scalar(PrfExpand::ZsaIsk.expand(&sk.0)) + /// Derives isk from sk_iss. Internal use only, does not enforce all constraints. + fn derive_inner(sk_iss: &IssuanceKey) -> pallas::Scalar { + to_scalar(PrfExpand::ZsaIsk.expand(&sk_iss.0)) } /// Sign the provided message using the `IssuanceAuthorizingKey`. @@ -223,18 +310,12 @@ impl IssuanceAuthorizingKey { } } -impl From<&SpendingKey> for IssuanceAuthorizingKey { - fn from(sk: &SpendingKey) -> Self { - let isk = Self::derive_inner(sk); +impl From<&IssuanceKey> for IssuanceAuthorizingKey { + fn from(sk_iss: &IssuanceKey) -> Self { + let isk = IssuanceAuthorizingKey::derive_inner(sk_iss); // IssuanceAuthorizingKey cannot be constructed such that this assertion would fail. assert!(!bool::from(isk.is_zero())); - let ret = IssuanceAuthorizingKey(isk.to_repr().try_into().unwrap()); - // If the last bit of repr_P(ik) is 1, negate isk. - if (<[u8; 32]>::from(IssuanceValidatingKey::from(&ret).0)[31] >> 7) == 1 { - IssuanceAuthorizingKey((-isk).to_repr().try_into().unwrap()) - } else { - ret - } + IssuanceAuthorizingKey(conditionally_negate(isk)) } } @@ -297,21 +378,6 @@ impl IssuanceValidatingKey { } } -/// A function to check structural validity of the validating keys for authorizing transfers and -/// issuing assets -/// Structural validity checks for ak_P or ik_P: -/// - The point must not be the identity (which for Pallas is canonically encoded as all-zeroes). -/// - The compressed y-coordinate bit must be 0. -fn check_structural_validity( - verification_key_bytes: [u8; 32], -) -> Option> { - if verification_key_bytes != [0; 32] && verification_key_bytes[31] & 0x80 == 0 { - >::try_from(verification_key_bytes).ok() - } else { - None - } -} - /// A key used to derive [`Nullifier`]s from [`Note`]s. /// /// $\mathsf{nk}$ as defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. @@ -1050,7 +1116,7 @@ impl SharedSecret { #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { use super::{ - DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, + DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey, SpendingKey, }; use proptest::prelude::*; @@ -1070,6 +1136,20 @@ pub mod testing { } } + prop_compose! { + /// Generate a uniformly distributed Orchard issuance key. + pub fn arb_issuance_key()( + key in prop::array::uniform32(prop::num::u8::ANY) + .prop_map(IssuanceKey::from_bytes) + .prop_filter( + "Values must correspond to valid Orchard issuance keys.", + |opt| bool::from(opt.is_some()) + ) + ) -> IssuanceKey { + key.unwrap() + } + } + prop_compose! { /// Generate a uniformly distributed Orchard ephemeral secret key. pub fn arb_esk()( @@ -1106,7 +1186,7 @@ pub mod testing { /// Generate a uniformly distributed RedDSA issuance authorizing key. pub fn arb_issuance_authorizing_key()(rng_seed in prop::array::uniform32(prop::num::u8::ANY)) -> IssuanceAuthorizingKey { let mut rng = StdRng::from_seed(rng_seed); - IssuanceAuthorizingKey::from(&SpendingKey::random(&mut rng)) + IssuanceAuthorizingKey::from(&IssuanceKey::random(&mut rng)) } } @@ -1187,7 +1267,9 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); - let isk: IssuanceAuthorizingKey = (&sk).into(); + let sk_iss = IssuanceKey::from_bytes(tv.sk).unwrap(); + + let isk: IssuanceAuthorizingKey = (&sk_iss).into(); assert_eq!(<[u8; 32]>::from(&isk.0), tv.isk); let ak: SpendValidatingKey = (&ask).into(); diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index 63da3a5f8..500d84210 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -10,7 +10,7 @@ use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{ NATIVE_ASSET_BASE_V_BYTES, VALUE_COMMITMENT_PERSONALIZATION, ZSA_ASSET_BASE_PERSONALIZATION, }; -use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; +use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] @@ -92,8 +92,8 @@ impl AssetBase { /// /// This is only used in tests. pub(crate) fn random(rng: &mut impl RngCore) -> Self { - let sk = SpendingKey::random(rng); - let isk = IssuanceAuthorizingKey::from(&sk); + let sk_iss = IssuanceKey::random(rng); + let isk = IssuanceAuthorizingKey::from(&sk_iss); let ik = IssuanceValidatingKey::from(&isk); let asset_descr = "zsa_asset"; AssetBase::derive(&ik, asset_descr) @@ -126,13 +126,13 @@ pub mod testing { use proptest::prelude::*; - use crate::keys::{testing::arb_spending_key, IssuanceAuthorizingKey, IssuanceValidatingKey}; + use crate::keys::{testing::arb_issuance_key, IssuanceAuthorizingKey, IssuanceValidatingKey}; prop_compose! { /// Generate a uniformly distributed note type pub fn arb_asset_id()( is_native in prop::bool::ANY, - sk in arb_spending_key(), + sk in arb_issuance_key(), str in "[A-Za-z]{255}", ) -> AssetBase { if is_native { @@ -155,10 +155,10 @@ pub mod testing { prop_compose! { /// Generate an asset ID pub fn arb_zsa_asset_id()( - sk in arb_spending_key(), + sk_iss in arb_issuance_key(), str in "[A-Za-z]{255}" ) -> AssetBase { - let isk = IssuanceAuthorizingKey::from(&sk); + let isk = IssuanceAuthorizingKey::from(&sk_iss); AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) } } @@ -166,10 +166,10 @@ pub mod testing { prop_compose! { /// Generate an asset ID using a specific description pub fn zsa_asset_id(asset_desc: String)( - sk in arb_spending_key(), + sk_iss in arb_issuance_key(), ) -> AssetBase { assert!(super::is_asset_desc_of_valid_size(&asset_desc)); - let isk = IssuanceAuthorizingKey::from(&sk); + let isk = IssuanceAuthorizingKey::from(&sk_iss); AssetBase::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) } } diff --git a/src/primitives/redpallas.rs b/src/primitives/redpallas.rs index 92fe165e4..a414bf285 100644 --- a/src/primitives/redpallas.rs +++ b/src/primitives/redpallas.rs @@ -23,7 +23,7 @@ impl SigType for Binding {} /// A RedPallas signing key. #[derive(Clone, Copy, Debug)] -pub struct SigningKey(reddsa::SigningKey); +pub struct SigningKey(pub(crate) reddsa::SigningKey); impl From> for [u8; 32] { fn from(sk: SigningKey) -> [u8; 32] { @@ -63,7 +63,7 @@ impl SigningKey { /// A RedPallas verification key. #[derive(Clone, Debug)] -pub struct VerificationKey(reddsa::VerificationKey); +pub struct VerificationKey(pub(crate) reddsa::VerificationKey); impl From> for [u8; 32] { fn from(vk: VerificationKey) -> [u8; 32] { diff --git a/src/supply_info.rs b/src/supply_info.rs index 6bd96df34..79e6b7d70 100644 --- a/src/supply_info.rs +++ b/src/supply_info.rs @@ -80,10 +80,10 @@ mod tests { use super::*; fn create_test_asset(asset_desc: &str) -> AssetBase { - use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey}; + use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; - let sk = SpendingKey::from_bytes([0u8; 32]).unwrap(); - let isk: IssuanceAuthorizingKey = (&sk).into(); + let sk_iss = IssuanceKey::from_bytes([0u8; 32]).unwrap(); + let isk: IssuanceAuthorizingKey = (&sk_iss).into(); AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc) } diff --git a/src/zip32.rs b/src/zip32.rs index 3ba8bd571..12427bf8d 100644 --- a/src/zip32.rs +++ b/src/zip32.rs @@ -10,8 +10,11 @@ use crate::{ spec::PrfExpand, }; -const ZIP32_ORCHARD_PERSONALIZATION: &[u8; 16] = b"ZcashIP32Orchard"; const ZIP32_ORCHARD_FVFP_PERSONALIZATION: &[u8; 16] = b"ZcashOrchardFVFP"; +/// Personalization for the master extended spending key +pub const ZIP32_ORCHARD_PERSONALIZATION: &[u8; 16] = b"ZcashIP32Orchard"; +/// Personalization for the master extended issuance key +pub const ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE: &[u8; 16] = b"ZIP32ZSAIssue_V1"; /// Errors produced in derivation of extended spending keys #[derive(Debug, PartialEq, Eq)] @@ -117,8 +120,12 @@ impl ExtendedSpendingKey { /// # Panics /// /// Panics if seed results in invalid spending key. - pub fn from_path(seed: &[u8], path: &[ChildIndex]) -> Result { - let mut xsk = Self::master(seed)?; + pub fn from_path( + seed: &[u8], + path: &[ChildIndex], + personalization: &[u8; 16], + ) -> Result { + let mut xsk = Self::master(seed, personalization)?; for i in path { xsk = xsk.derive_child(*i)?; } @@ -134,13 +141,13 @@ impl ExtendedSpendingKey { /// # Panics /// /// Panics if the seed is shorter than 32 bytes or longer than 252 bytes. - fn master(seed: &[u8]) -> Result { + fn master(seed: &[u8], personalization: &[u8; 16]) -> Result { assert!(seed.len() >= 32 && seed.len() <= 252); // I := BLAKE2b-512("ZcashIP32Orchard", seed) let I: [u8; 64] = { let mut I = Blake2bParams::new() .hash_length(64) - .personal(ZIP32_ORCHARD_PERSONALIZATION) + .personal(personalization) .to_state(); I.update(seed); I.finalize().as_bytes().try_into().unwrap() @@ -213,7 +220,7 @@ mod tests { #[test] fn derive_child() { let seed = [0; 32]; - let xsk_m = ExtendedSpendingKey::master(&seed).unwrap(); + let xsk_m = ExtendedSpendingKey::master(&seed, ZIP32_ORCHARD_PERSONALIZATION).unwrap(); let i_5 = 5; let xsk_5 = xsk_m.derive_child(i_5.try_into().unwrap()); @@ -224,20 +231,28 @@ mod tests { #[test] fn path() { let seed = [0; 32]; - let xsk_m = ExtendedSpendingKey::master(&seed).unwrap(); + let xsk_m = ExtendedSpendingKey::master(&seed, ZIP32_ORCHARD_PERSONALIZATION).unwrap(); let xsk_5h = xsk_m.derive_child(5.try_into().unwrap()).unwrap(); assert!(bool::from( - ExtendedSpendingKey::from_path(&seed, &[5.try_into().unwrap()]) - .unwrap() - .ct_eq(&xsk_5h) + ExtendedSpendingKey::from_path( + &seed, + &[5.try_into().unwrap()], + ZIP32_ORCHARD_PERSONALIZATION + ) + .unwrap() + .ct_eq(&xsk_5h) )); let xsk_5h_7 = xsk_5h.derive_child(7.try_into().unwrap()).unwrap(); assert!(bool::from( - ExtendedSpendingKey::from_path(&seed, &[5.try_into().unwrap(), 7.try_into().unwrap()]) - .unwrap() - .ct_eq(&xsk_5h_7) + ExtendedSpendingKey::from_path( + &seed, + &[5.try_into().unwrap(), 7.try_into().unwrap()], + ZIP32_ORCHARD_PERSONALIZATION + ) + .unwrap() + .ct_eq(&xsk_5h_7) )); } } diff --git a/tests/zsa.rs b/tests/zsa.rs index f0ee62c28..649d5e8cf 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -13,7 +13,10 @@ use orchard::{ builder::Builder, bundle::Flags, circuit::{ProvingKey, VerifyingKey}, - keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, + keys::{ + FullViewingKey, IssuanceKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, + SpendingKey, + }, value::NoteValue, Address, Anchor, Bundle, Note, }; @@ -58,7 +61,8 @@ fn prepare_keys() -> Keychain { let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); - let isk = IssuanceAuthorizingKey::from(&sk); + let sk_iss = IssuanceKey::from_bytes([0; 32]).unwrap(); + let isk = IssuanceAuthorizingKey::from(&sk_iss); let ik = IssuanceValidatingKey::from(&isk); Keychain { pk, From daf6269e89562c130b3d3d2ef90980994b5e2da4 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Wed, 21 Jun 2023 15:53:38 +0530 Subject: [PATCH 39/67] Preventing Asset Base from being the identity point on the Pallas curve (#71) As in the title, this is done in two portions: - A protection is added to `AssetBase::derive()`, which panics if the output is going to be the identity point. This panic will occur with negligible probability due to the properties of the hash. - The `verify_supply()` function now returns an error if the Asset Base of the notes involved is the identity point. - A number of tests are added to ensure the `verify_supply`, `verify_issue_bundle` functions raise errors appropriately, and also to confirm that the issue bundle cannot be signed when the asset base is the identity point. --------- Co-authored-by: Paul <3682187+PaulLaux@users.noreply.github.com> --- src/issuance.rs | 115 +++++++++++++++++++++++++++++++++++++---- src/note/asset_base.rs | 22 +++++--- 2 files changed, 122 insertions(+), 15 deletions(-) diff --git a/src/issuance.rs b/src/issuance.rs index e3c7e973b..c2fc7ca28 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -1,5 +1,6 @@ //! Structs related to issuance bundles and the associated logic. use blake2b_simd::Hash as Blake2bHash; +use group::Group; use nonempty::NonEmpty; use rand::{CryptoRng, RngCore}; use std::collections::HashSet; @@ -7,7 +8,7 @@ use std::fmt; use crate::bundle::commitments::{hash_issue_bundle_auth_data, hash_issue_bundle_txid_data}; use crate::issuance::Error::{ - IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, + AssetBaseCannotBeIdentityPoint, IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, IssueActionWithoutNoteNotFinalized, IssueBundleIkMismatchAssetBase, IssueBundleInvalidSignature, ValueSumOverflow, WrongAssetDescSize, }; @@ -134,6 +135,11 @@ impl IssueAction { .notes .iter() .try_fold(ValueSum::zero(), |value_sum, ¬e| { + //The asset base should not be the identity point of the Pallas curve. + if bool::from(note.asset().cv_base().is_identity()) { + return Err(AssetBaseCannotBeIdentityPoint); + } + // All assets should be derived correctly note.asset() .eq(&issue_asset) @@ -527,6 +533,8 @@ pub enum Error { WrongAssetDescSize, /// The `IssueAction` is not finalized but contains no notes. IssueActionWithoutNoteNotFinalized, + /// The `AssetBase` is the Pallas identity point, which is invalid. + AssetBaseCannotBeIdentityPoint, /// Verification errors: /// Invalid signature. @@ -561,6 +569,12 @@ impl fmt::Display for Error { "this `IssueAction` contains no notes but is not finalized" ) } + AssetBaseCannotBeIdentityPoint => { + write!( + f, + "the AssetBase is the identity point of the Pallas curve, which is invalid." + ) + } IssueBundleInvalidSignature(_) => { write!(f, "invalid signature") } @@ -581,10 +595,11 @@ impl fmt::Display for Error { mod tests { use super::{AssetSupply, IssueBundle, IssueInfo}; use crate::issuance::Error::{ - IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, - IssueBundleIkMismatchAssetBase, IssueBundleInvalidSignature, WrongAssetDescSize, + AssetBaseCannotBeIdentityPoint, IssueActionNotFound, + IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, + IssueBundleInvalidSignature, WrongAssetDescSize, }; - use crate::issuance::{verify_issue_bundle, IssueAction, Signed}; + use crate::issuance::{verify_issue_bundle, IssueAction, Signed, Unauthorized}; use crate::keys::{ FullViewingKey, IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey, Scope, SpendingKey, @@ -592,6 +607,9 @@ mod tests { use crate::note::{AssetBase, Nullifier}; use crate::value::{NoteValue, ValueSum}; use crate::{Address, Note}; + use group::{Group, GroupEncoding}; + use nonempty::NonEmpty; + use pasta_curves::pallas::{Point, Scalar}; use rand::rngs::OsRng; use rand::RngCore; use reddsa::Error::InvalidSignature; @@ -654,8 +672,49 @@ mod tests { ) } + // This function computes the identity point on the Pallas curve and returns an Asset Base with that value. + fn identity_point() -> AssetBase { + let identity_point = (Point::generator() * -Scalar::one()) + Point::generator(); + AssetBase::from_bytes(&identity_point.to_bytes()).unwrap() + } + + fn identity_point_test_params( + note1_value: u64, + note2_value: u64, + ) -> ( + OsRng, + IssuanceAuthorizingKey, + IssueBundle, + [u8; 32], + ) { + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let note1 = Note::new( + recipient, + NoteValue::from_raw(note1_value), + identity_point(), + Nullifier::dummy(&mut rng), + &mut rng, + ); + + let note2 = Note::new( + recipient, + NoteValue::from_raw(note2_value), + identity_point(), + Nullifier::dummy(&mut rng), + &mut rng, + ); + + let action = + IssueAction::from_parts("arbitrary asset_desc".into(), vec![note1, note2], false); + + let bundle = IssueBundle::from_parts(ik, NonEmpty::new(action), Unauthorized); + + (rng, isk, bundle, sighash) + } + #[test] - fn test_verify_supply_valid() { + fn verify_supply_valid() { let (ik, test_asset, action) = setup_verify_supply_test_params(10, 20, "Asset 1", None, false); @@ -671,7 +730,17 @@ mod tests { } #[test] - fn test_verify_supply_finalized() { + fn verify_supply_invalid_for_asset_base_as_identity() { + let (_, _, bundle, _) = identity_point_test_params(10, 20); + + assert_eq!( + bundle.actions.head.verify_supply(&bundle.ik), + Err(AssetBaseCannotBeIdentityPoint) + ); + } + + #[test] + fn verify_supply_finalized() { let (ik, test_asset, action) = setup_verify_supply_test_params(10, 20, "Asset 1", None, true); @@ -687,7 +756,7 @@ mod tests { } #[test] - fn test_verify_supply_incorrect_asset_base() { + fn verify_supply_incorrect_asset_base() { let (ik, _, action) = setup_verify_supply_test_params(10, 20, "Asset 1", Some("Asset 2"), false); @@ -698,7 +767,7 @@ mod tests { } #[test] - fn test_verify_supply_ik_mismatch_asset_base() { + fn verify_supply_ik_mismatch_asset_base() { let (_, _, action) = setup_verify_supply_test_params(10, 20, "Asset 1", None, false); let (_, _, ik, _, _) = setup_params(); @@ -1273,7 +1342,35 @@ mod tests { } #[test] - fn test_finalize_flag_serialization() { + fn issue_bundle_cannot_be_signed_with_asset_base_identity_point() { + let (rng, isk, bundle, sighash) = identity_point_test_params(10, 20); + + assert_eq!( + bundle.prepare(sighash).sign(rng, &isk).unwrap_err(), + AssetBaseCannotBeIdentityPoint + ); + } + + #[test] + fn issue_bundle_verify_fail_asset_base_identity_point() { + let (mut rng, isk, bundle, sighash) = identity_point_test_params(10, 20); + + let signed = IssueBundle { + ik: bundle.ik, + actions: bundle.actions, + authorization: Signed { + signature: isk.sign(&mut rng, &sighash), + }, + }; + + assert_eq!( + verify_issue_bundle(&signed, sighash, &HashSet::new()).unwrap_err(), + AssetBaseCannotBeIdentityPoint + ); + } + + #[test] + fn finalize_flag_serialization() { let mut rng = OsRng; let (_, _, note) = Note::dummy(&mut rng, None, AssetBase::native()); diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index 500d84210..41a284a8a 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -1,5 +1,5 @@ use blake2b_simd::{Hash as Blake2bHash, Params}; -use group::GroupEncoding; +use group::{Group, GroupEncoding}; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; use rand::RngCore; @@ -54,10 +54,13 @@ impl AssetBase { /// /// # Panics /// - /// Panics if `asset_desc` is empty or greater than `MAX_ASSET_DESCRIPTION_SIZE`. + /// Panics if `asset_desc` is empty or greater than `MAX_ASSET_DESCRIPTION_SIZE` or if the derived Asset Base is the identity point. #[allow(non_snake_case)] pub fn derive(ik: &IssuanceValidatingKey, asset_desc: &str) -> Self { - assert!(is_asset_desc_of_valid_size(asset_desc)); + assert!( + is_asset_desc_of_valid_size(asset_desc), + "The asset_desc string is not of valid size" + ); // EncodeAssetId(ik, asset_desc) = version_byte || ik || asset_desc let version_byte = [0x00]; @@ -65,10 +68,17 @@ impl AssetBase { let asset_digest = asset_digest(encode_asset_id); + let asset_base = + pallas::Point::hash_to_curve(ZSA_ASSET_BASE_PERSONALIZATION)(asset_digest.as_bytes()); + + // this will happen with negligible probability. + assert!( + bool::from(!asset_base.is_identity()), + "The Asset Base is the identity point, which is invalid." + ); + // AssetBase = ZSAValueBase(AssetDigest) - AssetBase( - pallas::Point::hash_to_curve(ZSA_ASSET_BASE_PERSONALIZATION)(asset_digest.as_bytes()), - ) + AssetBase(asset_base) } /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. From 477f949bd29f1c758b33f1d0ce4b779144f87789 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Fri, 23 Jun 2023 11:40:27 +0200 Subject: [PATCH 40/67] Update random nullifier for split notes and circuit (#76) To be secure against roadblock attacks, we update the process to obtain a random nullifier for split notes. Now we have the following formula to evaluate nf_old - for non split_notes, nf_old = Extract_P([PRF^{nfOrchard}_{nk}(rho_old) + psi_nf) mod q_P] NullifierK + cm_old) - for split notes, nf_old = Extract_P([PRF^{nfOrchard}_{nk}(rho_old) + psi_nf) mod q_P] NullifierK + cm_old + NullifierL) where psi_nf is equal to - psi_old for non split notes - a random pallas Base element for split notes The following constraints have been updated into the circuit - nf_old = nf_old_pub for all notes - derived_pk_d_old = pk_d_old for all notes - if split_flag=0, then psi_old = psi_new --- src/builder.rs | 18 +- src/bundle.rs | 1 - src/circuit.rs | 192 ++++---- src/circuit/gadget.rs | 60 ++- src/circuit_description | 746 ++++++++++++-------------------- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes src/note.rs | 42 +- src/note/nullifier.rs | 12 +- 8 files changed, 472 insertions(+), 599 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 70cd3dc77..eb20033b2 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -167,26 +167,20 @@ impl SpendInfo { } } - /// Creates a split spend, which is identical to origin normal spend except that we use a random - /// fvk to generate a different nullifier. In addition, the split_flag is raised. + /// Creates a split spend, which is identical to origin normal spend except that + /// `rseed_split_note` contains a random seed. In addition, the split_flag is raised. /// /// Defined in [Transfer and Burn of Zcash Shielded Assets ZIP-0226 § Split Notes (DRAFT PR)][TransferZSA]. /// /// [TransferZSA]: https://qed-it.github.io/zips/zip-0226.html#split-notes fn create_split_spend(&self, rng: &mut impl RngCore) -> Self { - let note = self.note; - let merkle_path = self.merkle_path.clone(); - - let sk = SpendingKey::random(rng); - let fvk: FullViewingKey = (&sk).into(); - SpendInfo { - dummy_sk: Some(sk), - fvk, + dummy_sk: None, + fvk: self.fvk.clone(), // We use external scope to avoid unnecessary derivations scope: Scope::External, - note, - merkle_path, + note: self.note.create_split_note(rng), + merkle_path: self.merkle_path.clone(), split_flag: true, } } diff --git a/src/bundle.rs b/src/bundle.rs index f6265761d..2e5d5a034 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -141,7 +141,6 @@ pub struct Bundle { /// This is the sum of Orchard spends minus the sum of Orchard outputs. value_balance: V, /// Assets intended for burning - /// TODO We need to add a consensus check to make sure that it is impossible to burn ZEC. burn: Vec<(AssetBase, V)>, /// The root of the Orchard commitment tree that this bundle commits to. anchor: Anchor, diff --git a/src/circuit.rs b/src/circuit.rs index 67833b013..99a35b1d9 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -21,7 +21,7 @@ use self::{ commit_ivk::{CommitIvkChip, CommitIvkConfig}, gadget::{ add_chip::{AddChip, AddConfig}, - assign_free_advice, assign_is_native_asset, + assign_free_advice, assign_is_native_asset, assign_split_flag, }, note_commit::{NoteCommitChip, NoteCommitConfig}, }; @@ -113,6 +113,7 @@ pub struct Circuit { pub(crate) psi_old: Value, pub(crate) rcm_old: Value, pub(crate) cm_old: Value, + pub(crate) psi_nf: Value, pub(crate) alpha: Value, pub(crate) ak: Value, pub(crate) nk: Value, @@ -164,6 +165,9 @@ impl Circuit { let psi_old = spend.note.rseed().psi(&rho_old); let rcm_old = spend.note.rseed().rcm(&rho_old); + let nf_rseed = spend.note.rseed_split_note().unwrap_or(*spend.note.rseed()); + let psi_nf = nf_rseed.psi(&rho_old); + let rho_new = output_note.rho(); let psi_new = output_note.rseed().psi(&rho_new); let rcm_new = output_note.rseed().rcm(&rho_new); @@ -178,6 +182,7 @@ impl Circuit { psi_old: Value::known(psi_old), rcm_old: Value::known(rcm_old), cm_old: Value::known(spend.note.commitment()), + psi_nf: Value::known(psi_nf), alpha: Value::known(alpha), ak: Value::known(spend.fvk.clone().into()), nk: Value::known(*spend.fvk.nk()), @@ -222,10 +227,9 @@ impl plonk::Circuit for Circuit { // Constrain v_old = 0 or calculated root = anchor (https://p.z.cash/ZKS:action-merkle-path-validity?partial). // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). - // Constrain split_flag = 1 or nf_old = nf_old_pub // Constrain is_native_asset to be boolean // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset - // Constraint split_flag = 1 or derived_pk_d_old = pk_d_old + // Constraint if split_flag = 0 then psi_old = psi_nf let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -242,14 +246,11 @@ impl plonk::Circuit for Circuit { let split_flag = meta.query_advice(advices[8], Rotation::cur()); - let nf_old = meta.query_advice(advices[9], Rotation::cur()); - let nf_old_pub = meta.query_advice(advices[0], Rotation::next()); - - let is_native_asset = meta.query_advice(advices[1], Rotation::next()); - let asset_x = meta.query_advice(advices[2], Rotation::next()); - let asset_y = meta.query_advice(advices[3], Rotation::next()); - let diff_asset_x_inv = meta.query_advice(advices[4], Rotation::next()); - let diff_asset_y_inv = meta.query_advice(advices[5], Rotation::next()); + let is_native_asset = meta.query_advice(advices[9], Rotation::cur()); + let asset_x = meta.query_advice(advices[0], Rotation::next()); + let asset_y = meta.query_advice(advices[1], Rotation::next()); + let diff_asset_x_inv = meta.query_advice(advices[2], Rotation::next()); + let diff_asset_y_inv = meta.query_advice(advices[3], Rotation::next()); let one = Expression::Constant(pallas::Base::one()); @@ -262,10 +263,8 @@ impl plonk::Circuit for Circuit { let diff_asset_x = asset_x - Expression::Constant(*native_asset.x()); let diff_asset_y = asset_y - Expression::Constant(*native_asset.y()); - let pk_d_old_x = meta.query_advice(advices[6], Rotation::next()); - let pk_d_old_y = meta.query_advice(advices[7], Rotation::next()); - let derived_pk_d_old_x = meta.query_advice(advices[8], Rotation::next()); - let derived_pk_d_old_y = meta.query_advice(advices[9], Rotation::next()); + let psi_old = meta.query_advice(advices[4], Rotation::next()); + let psi_nf = meta.query_advice(advices[5], Rotation::next()); Constraints::with_selector( q_orchard, @@ -289,10 +288,6 @@ impl plonk::Circuit for Circuit { "v_new = 0 or enable_outputs = 1", v_new * (one.clone() - enable_outputs), ), - ( - "split_flag = 1 or nf_old = nf_old_pub", - (one.clone() - split_flag.clone()) * (nf_old - nf_old_pub), - ), ( "bool_check is_native_asset", bool_check(is_native_asset.clone()), @@ -316,20 +311,9 @@ impl plonk::Circuit for Circuit { * (diff_asset_x * diff_asset_x_inv - one.clone()) * (diff_asset_y * diff_asset_y_inv - one.clone()), ), - // Constrain derived pk_d_old to equal witnessed pk_d_old - // - // This equality constraint is technically superfluous, because the assigned - // value of `derived_pk_d_old` is an equivalent witness. But it's nice to see - // an explicit connection between circuit-synthesized values, and explicit - // prover witnesses. We could get the best of both worlds with a write-on-copy - // abstraction (https://github.com/zcash/halo2/issues/334). ( - "split_flag = 1 or pk_d_old_x = derived_pk_d_old_x", - (one.clone() - split_flag.clone()) * (pk_d_old_x - derived_pk_d_old_x), - ), - ( - "split_flag = 1 or pk_d_old_y = derived_pk_d_old_y", - (one - split_flag) * (pk_d_old_y - derived_pk_d_old_y), + "(split_flag = 0) => (psi_old = psi_nf)", + (one - split_flag) * (psi_old - psi_nf), ), ], ) @@ -480,7 +464,14 @@ impl plonk::Circuit for Circuit { let ecc_chip = config.ecc_chip(); // Witness private inputs that are used across multiple checks. - let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, nf_old_pub) = { + let (psi_nf, psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset) = { + // Witness psi_nf + let psi_nf = assign_free_advice( + layouter.namespace(|| "witness psi_nf"), + config.advices[0], + self.psi_nf, + )?; + // Witness psi_old let psi_old = assign_free_advice( layouter.namespace(|| "witness psi_old"), @@ -545,25 +536,18 @@ impl plonk::Circuit for Circuit { self.asset.map(|asset| asset.cv_base().to_affine()), )?; - // Witness nf_old_pub - let nf_old_pub = layouter.assign_region( - || "load nf_old pub", - |mut region| { - region.assign_advice_from_instance( - || "load nf_old pub", - config.primary, - NF_OLD, - config.advices[0], - 1, - ) - }, - )?; - ( - psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, nf_old_pub, + psi_nf, psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, ) }; + // Witness split_flag + let split_flag = assign_split_flag( + layouter.namespace(|| "witness split_flag"), + config.advices[0], + self.split_flag, + )?; + // Witness is_native_asset which is equal to // 1 if asset is equal to native asset, and // 0 if asset is not equal to native asset. @@ -656,16 +640,21 @@ impl plonk::Circuit for Circuit { // Nullifier integrity (https://p.z.cash/ZKS:action-nullifier-integrity). let nf_old = { let nf_old = gadget::derive_nullifier( - layouter.namespace(|| "nf_old = DeriveNullifier_nk(rho_old, psi_old, cm_old)"), + layouter.namespace(|| "nf_old = DeriveNullifier_nk(rho_old, psi_nf, cm_old)"), config.poseidon_chip(), config.add_chip(), ecc_chip.clone(), + config.mux_chip(), rho_old.clone(), - &psi_old, + &psi_nf, &cm_old, nk.clone(), + split_flag.clone(), )?; + // Constrain nf_old to equal public input + layouter.constrain_instance(nf_old.inner().cell(), config.primary, NF_OLD)?; + nf_old }; @@ -690,7 +679,7 @@ impl plonk::Circuit for Circuit { } // Diversified address integrity (https://p.z.cash/ZKS:action-addr-integrity?partial). - let (derived_pk_d_old, pk_d_old) = { + let pk_d_old = { let ivk = { let ak = ak_P.extract_p().inner().clone(); let rivk = ScalarFixed::new( @@ -717,13 +706,22 @@ impl plonk::Circuit for Circuit { let (derived_pk_d_old, _ivk) = g_d_old.mul(layouter.namespace(|| "[ivk] g_d_old"), ivk)?; + // Constrain derived pk_d_old to equal witnessed pk_d_old + // + // This equality constraint is technically superfluous, because the assigned + // value of `derived_pk_d_old` is an equivalent witness. But it's nice to see + // an explicit connection between circuit-synthesized values, and explicit + // prover witnesses. We could get the best of both worlds with a write-on-copy + // abstraction (https://github.com/zcash/halo2/issues/334). let pk_d_old = NonIdentityPoint::new( ecc_chip.clone(), layouter.namespace(|| "witness pk_d_old"), self.pk_d_old.map(|pk_d_old| pk_d_old.inner().to_affine()), )?; + derived_pk_d_old + .constrain_equal(layouter.namespace(|| "pk_d_old equality"), &pk_d_old)?; - (derived_pk_d_old, pk_d_old) + pk_d_old }; // Old note commitment integrity (https://p.z.cash/ZKS:action-cm-old-integrity?partial). @@ -747,7 +745,7 @@ impl plonk::Circuit for Circuit { pk_d_old.inner(), v_old.clone(), rho_old, - psi_old, + psi_old.clone(), asset.inner(), rcm_old, is_native_asset.clone(), @@ -780,7 +778,7 @@ impl plonk::Circuit for Circuit { }; // ρ^new = nf^old - let rho_new = nf_old_pub.clone(); + let rho_new = nf_old.inner().clone(); // Witness psi_new let psi_new = assign_free_advice( @@ -864,41 +862,28 @@ impl plonk::Circuit for Circuit { 0, )?; - region.assign_advice( - || "split_flag", - config.advices[8], - 0, - || { - self.split_flag - .map(|split_flag| pallas::Base::from(split_flag as u64)) - }, - )?; - - nf_old - .inner() - .copy_advice(|| "nf_old", &mut region, config.advices[9], 0)?; - nf_old_pub.copy_advice(|| "nf_old", &mut region, config.advices[0], 1)?; + split_flag.copy_advice(|| "split_flag", &mut region, config.advices[8], 0)?; is_native_asset.copy_advice( || "is_native_asset", &mut region, - config.advices[1], - 1, + config.advices[9], + 0, )?; asset .inner() .x() - .copy_advice(|| "asset_x", &mut region, config.advices[2], 1)?; + .copy_advice(|| "asset_x", &mut region, config.advices[0], 1)?; asset .inner() .y() - .copy_advice(|| "asset_y", &mut region, config.advices[3], 1)?; + .copy_advice(|| "asset_y", &mut region, config.advices[1], 1)?; // `diff_asset_x_inv` and `diff_asset_y_inv` will be used to prove that // if is_native_asset = 0, then asset != native_asset. region.assign_advice( || "diff_asset_x_inv", - config.advices[4], + config.advices[2], 1, || { self.asset.map(|asset| { @@ -922,7 +907,7 @@ impl plonk::Circuit for Circuit { )?; region.assign_advice( || "diff_asset_y_inv", - config.advices[5], + config.advices[3], 1, || { self.asset.map(|asset| { @@ -945,30 +930,8 @@ impl plonk::Circuit for Circuit { }, )?; - pk_d_old.inner().x().copy_advice( - || "pk_d_old_x", - &mut region, - config.advices[6], - 1, - )?; - pk_d_old.inner().y().copy_advice( - || "pk_d_old_y", - &mut region, - config.advices[7], - 1, - )?; - derived_pk_d_old.inner().x().copy_advice( - || "derived_pk_d_old_x", - &mut region, - config.advices[8], - 1, - )?; - derived_pk_d_old.inner().y().copy_advice( - || "derived_pk_d_old_y", - &mut region, - config.advices[9], - 1, - )?; + psi_old.copy_advice(|| "psi_old", &mut region, config.advices[4], 1)?; + psi_nf.copy_advice(|| "psi_nf", &mut region, config.advices[5], 1)?; config.q_orchard.enable(&mut region, 0) }, @@ -1226,6 +1189,8 @@ mod tests { let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); + let psi_old = spent_note.rseed().psi(&spent_note.rho()); + ( Circuit { path: Value::known(path.auth_path()), @@ -1234,9 +1199,11 @@ mod tests { pk_d_old: Value::known(*sender_address.pk_d()), v_old: Value::known(spent_note.value()), rho_old: Value::known(spent_note.rho()), - psi_old: Value::known(spent_note.rseed().psi(&spent_note.rho())), + psi_old: Value::known(psi_old), rcm_old: Value::known(spent_note.rseed().rcm(&spent_note.rho())), cm_old: Value::known(spent_note.commitment()), + // For non split note, psi_nf is equal to psi_old + psi_nf: Value::known(psi_old), alpha: Value::known(alpha), ak: Value::known(ak), nk: Value::known(nk), @@ -1426,6 +1393,7 @@ mod tests { psi_old: Value::unknown(), rcm_old: Value::unknown(), cm_old: Value::unknown(), + psi_nf: Value::unknown(), alpha: Value::unknown(), ak: Value::unknown(), nk: Value::unknown(), @@ -1483,42 +1451,41 @@ mod tests { let fvk: FullViewingKey = (&sk).into(); let sender_address = fvk.address_at(0u32, Scope::External); let rho_old = Nullifier::dummy(&mut rng); - let spent_note = Note::new( + let note = Note::new( sender_address, NoteValue::from_raw(40), asset_base, rho_old, &mut rng, ); + let spent_note = if split_flag { + note.create_split_note(&mut rng) + } else { + note + }; (fvk, spent_note) }; let output_value = NoteValue::from_raw(10); - let (dummy_sk, fvk, scope, nf_old, v_net) = if split_flag { - let sk = SpendingKey::random(&mut rng); - let fvk: FullViewingKey = (&sk).into(); + let (scope, v_net) = if split_flag { ( - Some(sk), - fvk.clone(), Scope::External, - spent_note.nullifier(&fvk), // Split notes do not contribute to v_net. // Therefore, if split_flag is true, v_net = - output_value NoteValue::zero() - output_value, ) } else { ( - None, - spent_note_fvk.clone(), spent_note_fvk .scope_for_address(&spent_note.recipient()) .unwrap(), - spent_note.nullifier(&spent_note_fvk), spent_note.value() - output_value, ) }; - let ak: SpendValidatingKey = fvk.clone().into(); + + let nf_old = spent_note.nullifier(&spent_note_fvk); + let ak: SpendValidatingKey = spent_note_fvk.clone().into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); @@ -1539,8 +1506,8 @@ mod tests { let anchor = path.root(spent_note.commitment().into()); let spend_info = SpendInfo { - dummy_sk, - fvk, + dummy_sk: None, + fvk: spent_note_fvk, scope, note: spent_note, merkle_path: path, @@ -1623,6 +1590,7 @@ mod tests { psi_old: circuit.psi_old, rcm_old: circuit.rcm_old.clone(), cm_old: Value::known(random_note_commitment(&mut rng)), + psi_nf: circuit.psi_nf, alpha: circuit.alpha, ak: circuit.ak.clone(), nk: circuit.nk, diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 646bef288..919b2c10b 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -1,13 +1,16 @@ //! Gadgets used in the Orchard circuit. use ff::Field; +use group::Curve; +use pasta_curves::arithmetic::CurveExt; use pasta_curves::pallas; use super::{commit_ivk::CommitIvkChip, note_commit::NoteCommitChip}; +use crate::circuit::gadget::mux_chip::{MuxChip, MuxInstructions}; use crate::constants::{NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}; use crate::note::AssetBase; use halo2_gadgets::{ - ecc::{chip::EccChip, EccInstructions, FixedPointBaseField, Point, X}, + ecc::{chip::EccChip, chip::EccPoint, EccInstructions, FixedPointBaseField, Point, X}, poseidon::{ primitives::{self as poseidon, ConstantLength}, Hash as PoseidonHash, PoseidonSpongeInstructions, Pow5Chip as PoseidonChip, @@ -128,6 +131,28 @@ where ) } +/// Witnesses split_flag. +pub(in crate::circuit) fn assign_split_flag( + layouter: impl Layouter, + column: Column, + split_flag: Value, +) -> Result, plonk::Error> +where + Assigned: for<'v> From<&'v pasta_curves::Fp>, +{ + assign_free_advice( + layouter, + column, + split_flag.map(|split_flag| { + if split_flag { + pallas::Base::one() + } else { + pallas::Base::zero() + } + }), + ) +} + /// `DeriveNullifier` from [Section 4.16: Note Commitments and Nullifiers]. /// /// [Section 4.16: Note Commitments and Nullifiers]: https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers @@ -138,6 +163,7 @@ pub(in crate::circuit) fn derive_nullifier< EccChip: EccInstructions< pallas::Affine, FixedPoints = OrchardFixedBases, + Point = EccPoint, Var = AssignedCell, >, >( @@ -145,10 +171,12 @@ pub(in crate::circuit) fn derive_nullifier< poseidon_chip: PoseidonChip, add_chip: AddChip, ecc_chip: EccChip, + mux_chip: MuxChip, rho: AssignedCell, psi: &AssignedCell, cm: &Point, nk: AssignedCell, + split_flag: AssignedCell, ) -> Result, plonk::Error> { // hash = poseidon_hash(nk, rho) let hash = { @@ -173,17 +201,37 @@ pub(in crate::circuit) fn derive_nullifier< // `product` = [poseidon_hash(nk, rho) + psi] NullifierK. // let product = { - let nullifier_k = FixedPointBaseField::from_inner(ecc_chip, NullifierK); + let nullifier_k = FixedPointBaseField::from_inner(ecc_chip.clone(), NullifierK); nullifier_k.mul( layouter.namespace(|| "[poseidon_output + psi] NullifierK"), scalar, )? }; - // Add cm to multiplied fixed base to get nf - // cm + [poseidon_output + psi] NullifierK - cm.add(layouter.namespace(|| "nf"), &product) - .map(|res| res.extract_p()) + // Add cm to multiplied fixed base + // nf = cm + [poseidon_output + psi] NullifierK + let nf = cm.add(layouter.namespace(|| "nf"), &product)?; + + // Add NullifierL to nf + // split_note_nf = NullifierL + nf + let nullifier_l = Point::new_from_constant( + ecc_chip.clone(), + layouter.namespace(|| "witness NullifierL constant"), + pallas::Point::hash_to_curve("z.cash:Orchard")(b"L").to_affine(), + )?; + let split_note_nf = nullifier_l.add(layouter.namespace(|| "split_note_nf"), &nf)?; + + // Select the desired nullifier according to split_flag + Ok(Point::from_inner( + ecc_chip, + mux_chip.mux( + layouter.namespace(|| "mux on nf"), + &split_flag, + nf.inner(), + split_note_nf.inner(), + )?, + ) + .extract_p()) } pub(in crate::circuit) use crate::circuit::commit_ivk::gadgets::commit_ivk; diff --git a/src/circuit_description b/src/circuit_description index ffb19ab6f..8078e15f1 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -447,97 +447,6 @@ PinnedVerificationKey { ), ), ), - Product( - Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - ), - Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 10, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - ), Product( Product( Product( @@ -596,10 +505,10 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 11, - column_index: 1, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, Sum( @@ -608,10 +517,10 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 11, - column_index: 1, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -676,16 +585,16 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 11, - column_index: 1, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, Sum( Advice { - query_index: 12, - column_index: 2, + query_index: 10, + column_index: 0, rotation: Rotation( 1, ), @@ -756,16 +665,16 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 11, - column_index: 1, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, Sum( Advice { - query_index: 13, - column_index: 3, + query_index: 11, + column_index: 1, rotation: Rotation( 1, ), @@ -842,10 +751,10 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 11, - column_index: 1, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -854,8 +763,8 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 12, - column_index: 2, + query_index: 10, + column_index: 0, rotation: Rotation( 1, ), @@ -867,8 +776,8 @@ PinnedVerificationKey { ), ), Advice { - query_index: 14, - column_index: 4, + query_index: 12, + column_index: 2, rotation: Rotation( 1, ), @@ -885,8 +794,8 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 13, - column_index: 3, + query_index: 11, + column_index: 1, rotation: Rotation( 1, ), @@ -898,8 +807,8 @@ PinnedVerificationKey { ), ), Advice { - query_index: 15, - column_index: 5, + query_index: 13, + column_index: 3, rotation: Rotation( 1, ), @@ -986,107 +895,16 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - Negated( - Advice { - query_index: 18, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - ), - Product( - Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - ), - Sum( - Advice { - query_index: 17, - column_index: 7, + query_index: 14, + column_index: 4, rotation: Rotation( 1, ), }, Negated( Advice { - query_index: 19, - column_index: 9, + query_index: 15, + column_index: 5, rotation: Rotation( 1, ), @@ -1239,7 +1057,7 @@ PinnedVerificationKey { Product( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -1248,7 +1066,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000400, ), Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -1272,20 +1090,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1295,12 +1113,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1310,12 +1128,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1390,20 +1208,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1413,12 +1231,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1428,12 +1246,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -1515,7 +1333,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -1639,7 +1457,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -1803,7 +1621,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -1953,7 +1771,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2079,7 +1897,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2218,7 +2036,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2362,7 +2180,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2506,7 +2324,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2648,7 +2466,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2790,7 +2608,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2890,7 +2708,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2990,7 +2808,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -3090,7 +2908,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -3190,7 +3008,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -3319,7 +3137,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -3410,8 +3228,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -3422,8 +3240,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -3437,8 +3255,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -3452,8 +3270,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -3857,7 +3675,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -3883,7 +3701,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4101,7 +3919,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4662,7 +4480,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4688,7 +4506,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -4906,7 +4724,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -5405,7 +5223,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -5421,7 +5239,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -5432,14 +5250,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -5448,7 +5266,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -5740,7 +5558,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -5766,7 +5584,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -5968,7 +5786,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -6089,7 +5907,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -6241,7 +6059,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -6328,7 +6146,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -6344,7 +6162,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -6355,14 +6173,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -6371,7 +6189,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -6497,7 +6315,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -6523,7 +6341,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -6741,7 +6559,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -6878,7 +6696,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -7046,7 +6864,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -7130,7 +6948,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -7230,7 +7048,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7242,7 +7060,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -7258,7 +7076,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7270,7 +7088,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -7375,7 +7193,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7387,7 +7205,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -7406,7 +7224,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 22, + query_index: 21, column_index: 1, rotation: Rotation( -1, @@ -7423,7 +7241,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -7435,7 +7253,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 20, + query_index: 17, column_index: 9, rotation: Rotation( -1, @@ -7455,7 +7273,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 21, column_index: 1, rotation: Rotation( -1, @@ -7650,7 +7468,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -7850,7 +7668,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -7960,7 +7778,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -7971,7 +7789,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -8070,7 +7888,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -8096,7 +7914,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -8211,7 +8029,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -8246,7 +8064,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -8380,7 +8198,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -8415,7 +8233,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -10777,7 +10595,7 @@ PinnedVerificationKey { }, Sum( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -10883,7 +10701,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -10892,7 +10710,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -10909,7 +10727,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -10918,7 +10736,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -11014,7 +10832,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -11434,7 +11252,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -11802,7 +11620,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -12147,7 +11965,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -12492,7 +12310,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -13032,7 +12850,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -13042,7 +12860,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -13053,7 +12871,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -13188,7 +13006,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -13198,7 +13016,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -13209,7 +13027,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -13344,7 +13162,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -13354,7 +13172,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -13365,7 +13183,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -13452,7 +13270,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 21, + query_index: 20, column_index: 6, rotation: Rotation( -1, @@ -13468,7 +13286,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -13568,7 +13386,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -13659,7 +13477,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -15249,14 +15067,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -15276,14 +15094,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -15302,7 +15120,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -15343,7 +15161,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -15860,7 +15678,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -15979,7 +15797,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -15991,7 +15809,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -16105,7 +15923,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -16223,7 +16041,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -16232,7 +16050,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -16240,7 +16058,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -17636,7 +17454,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -17766,7 +17584,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -17872,7 +17690,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -18082,7 +17900,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -18094,7 +17912,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -18224,7 +18042,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -18235,7 +18053,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -18591,7 +18409,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -18602,7 +18420,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -18953,7 +18771,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -18964,7 +18782,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -19297,7 +19115,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -19326,7 +19144,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -19792,7 +19610,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -19922,7 +19740,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -20021,7 +19839,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -20126,7 +19944,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -20231,14 +20049,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -20373,7 +20191,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -20531,7 +20349,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -20646,7 +20464,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -20767,14 +20585,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -21056,7 +20874,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -21214,7 +21032,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -21329,7 +21147,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -21450,14 +21268,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -21593,7 +21411,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -21604,7 +21422,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -21762,7 +21580,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -21877,14 +21695,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -21998,7 +21816,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -22119,14 +21937,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -22397,7 +22215,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -22682,7 +22500,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -22925,7 +22743,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -23046,7 +22864,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -23288,7 +23106,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -23300,7 +23118,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -23446,7 +23264,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -23457,7 +23275,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -23861,7 +23679,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -23872,7 +23690,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -24271,7 +24089,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -24282,7 +24100,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -24663,7 +24481,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -24692,7 +24510,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -25222,7 +25040,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -25368,7 +25186,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -25483,7 +25301,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -25604,7 +25422,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -25725,14 +25543,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -25867,7 +25685,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -26025,7 +25843,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -26140,7 +25958,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -26261,14 +26079,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -26502,7 +26320,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -26612,7 +26430,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -26679,7 +26497,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -26752,14 +26570,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -26847,7 +26665,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -26858,7 +26676,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -26968,7 +26786,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -27035,14 +26853,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -27108,7 +26926,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -27181,14 +26999,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -27363,7 +27181,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 16, + query_index: 22, column_index: 6, rotation: Rotation( 1, @@ -27552,7 +27370,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 8, rotation: Rotation( 1, @@ -27699,7 +27517,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -27772,7 +27590,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -28037,7 +27855,7 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 9, column_type: Advice, }, Rotation( @@ -28046,16 +27864,16 @@ PinnedVerificationKey { ), ( Column { - index: 7, + index: 9, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( Column { - index: 8, + index: 7, column_type: Advice, }, Rotation( @@ -28064,7 +27882,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 8, column_type: Advice, }, Rotation( @@ -28073,7 +27891,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 6, column_type: Advice, }, Rotation( @@ -28082,7 +27900,7 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 1, column_type: Advice, }, Rotation( @@ -28091,11 +27909,11 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 6, column_type: Advice, }, Rotation( - -1, + 1, ), ), ( @@ -28495,7 +28313,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 19, + query_index: 16, column_index: 9, rotation: Rotation( 1, @@ -28855,7 +28673,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 17, + query_index: 18, column_index: 7, rotation: Rotation( 1, @@ -29069,48 +28887,48 @@ PinnedVerificationKey { (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), - (0x23d190a42430492732de147e7560ae1387a0e8c6b0dc405b893c99c34d124152, 0x0f7f1cb9cd7c701f22270a68d9cb484b4fffdc6144c8ce3f4eca5b646f8a939f), - (0x2b0f9d7b69e1f353868a4d542b7a23f24f39335b16c3a46fca1edb12a69bb350, 0x1e4ac9f6f6d4ba4fa4cd21e669b8293e3be8c143c795d2eb31503a9389ad4314), - (0x28f1ed28efc008bcec444c440ddbe60a8e58fe5b9a6047f0bf4d8abf599cc4ed, 0x180eef569a332ec094a76dd55de8f8ef4f087465bb2abc8dd5f7a265e048e84f), - (0x36608273abc0c47131ee4cb410b4e936fe693e9e034c686e188438d5eab134cd, 0x304e3ffef142c51a5a081a977f9c2581fa18a356e080d20cf10a044e46a3c802), - (0x355228aaa5e1134d08305d64d86cca7abac7c4114252a2a71df6a40d6a3633a9, 0x2d492e1c28cf94f9a074b14cb4cfd0cabd46121faa034d887c5f07cb743464e2), - (0x31fe923865ff58a9e59393bf64ebff3f25831371afbd2de5ddf147519ad6160a, 0x30449e9123aee5a61d3ed4c9e5822e2f60184a6c4234cfd61575e9f9572f370e), - (0x0e24cddb59a4615d0595e5439fca547a3f1ed39c4a2b0879d7e8603306d9e4b5, 0x35ab4acd6912b9bc66c19ebc9845886a4828bac17246137e36f924df2f9be175), - (0x3bd9f4407fcbb3e4ec812de2c53e70fb9203381f5a1c0f4c5e5fa52b932f5ac1, 0x06d8356f6b642427ddfad6e3642e40c0b29034baf9adb19c8a3ab251b16f39ef), - (0x21e3606f857180611036daa84bee713ff0b360b6282adc5bbaa40a5f6f7e6bc7, 0x3bff3cd61a5ae314f5eead93e3084c60a31e8b794186061a24ffa5a5dcd7e0f5), + (0x20700a506e3d86a64a39b130676dddce5f1b2bf0334fec71ed2551c204822c67, 0x3b6942d1884ab8af10fad654411308e22b2cd04efc964b92fd921678436c0c98), + (0x01050032408d33b1dfaede46b04fa62672309dd6068c0833589f4c8080e829a2, 0x0e3f605da6ff82b3aa6ad00dcf43b9478f05ff876599522bf6e560d3d014fc34), + (0x3de6d72fbecfa7c79cc390c6a7d5f80f1bcdb6ec66967002c0f003890ca6e1fb, 0x188d7336a6662b8e16e4b3a279958e60dbe1f86bfdbc1dca253db40235430f44), + (0x1581f8e414673d197d0cd5730da9bb65faae27e4a7aa70055f1c92d70fa31f7d, 0x3262ae14b4137e321618661aa7a5f4b817ff8b2846d9362813da34512c6bd965), + (0x21c96b5ae31bc87ecc34afaeb56d6c155b624b22f23f474ea80fc0bc7312735d, 0x123f4ffff944155267ab11f68de7573cb27a78b30d96ad315756086adfc75137), + (0x17a4fffca31db428439c483107a7b92f8b81451bb66892f2e8b2e4a3f2181083, 0x31f214f9e19e6282a502fd0984b81b9f7c761d66236e7600049e45ec7acfe778), + (0x31efd1ed8ab3ef69dd0a927b9c371fc0e9a2dfbd3586c5f596133f2605445850, 0x28da702b4e3f6df487b6530829a48751c10557127d11b0056c7c581091a8e03e), + (0x098c8a506a6d33d2744d0e1810c2b5070d49f597c8b87fcef67ee008da94f56c, 0x3d7dd49111a5e9834dbd5c1fee58ceae6ac758ee167522843fbb50bd95715cab), + (0x17c91b96eabea3a9ff280ae99e74bb96e80e14d770cf5d0a35814500c08159ac, 0x021d68cbd102f26c8c1b849312c3970f06d0e8c4733d325c5247137da3f940eb), (0x3c0f3f0d7b2306490dac7d578d4846c63adcc76988ce322d8691c3b8b5b0f623, 0x12d81ca672a1c18f6e0d9b7eb8fbabdbe450fae6667cf349c1a0e63ca9a0824e), (0x27d13b33003ffddcd36efb731fe94db93d181bd994e0c057e945402bc8501789, 0x0e1dde94ea3b35e0d0a66350163ba2ff9dd5070500912b7d076747816965ffd2), - (0x3049e9c8a3e6c7fe628660121f04915e03546b7a2dcb8a3e59fa99546e4f7f86, 0x2dcebc740917584f788b776f4cf1e3cd96b4a29e9df7224fd8e5f428d4112546), + (0x3fdc611a96e66e8f5c21c211bff2006204c4884b2c6df9b55d92420af8e32d15, 0x0a525125d5a85a579cbc8e4862b88800d7dbaf8a8adc18bd0181bbbab9434b8d), (0x245ebb4ccefa7c4e2d5a9d7b1746b8277abc25f74cd11b2dbb752d49612f248e, 0x145f605111205a7c3e4620ac035b3cccb6375f8d3c3469b7900e427607c401c9), (0x1751912a19fa0009ece61b686342d6b4385415e942159e8db3f174ad24d612b9, 0x0f31114ef566211d46914d0bc2d1a27a0e34eeda04dab53a0af7a37024f057a1), (0x091c6c4854fa5d9ed8a966f2a1c4946b41f6872de6c19fa8b521a0a8eb2bd899, 0x29100b4e15344d750fae4a81c82faca1e8e0573336b1f54b394946e95e7baad0), - (0x1a5bb6ffd1af2165203df63414021a531f0f2bfcec85443a180993cc222b40af, 0x0d6b8b0d2363607d15746434b670008845ed0524406c1d8a221cb6f58ee2d4ed), - (0x0e3ead6853e036099146875357a97c73327ac7aac89df7af91e8e126cf1adb3d, 0x16e19a920aa5d52ec2bb18e595b12cc3f65ae6703af8c088c3741ec59acdde8a), + (0x0f1d83f1dd2f4ba4d92cae2a2f40fc6d5d66fb2b6d1f1a2e981931cfc7c751af, 0x385ae95bb483cc65bb507d8418e447a7ad8346bc52b5114913d1e2c25c0fd11d), + (0x070664e70f0b48311a30b833a6b93cdf4ab06b872f28a723b935c88802275bd0, 0x1a3c22a9ff9d9d5434b8b979d6635d135d909b143927bc90a96cde88c6e93331), (0x34c8b83a2cc924f1b0237978c8f911e6a54375c509ba46456a011fbb74c8698c, 0x260cc681c222535c0030f702172ee8855b681c16d706b1b9a786165e06705de6), - (0x3dcb136a22551e524212c0325331a9dae5ad6ff356175e6b82a54039475be1ef, 0x3bbbd0d20ea0ebb0f36d740910947d1934bcb93ba16325ea42f124ec0cde7a81), + (0x1b7a61e8a9b32fe558433feec9aaf51204e5486aa468d7215087ed35fd6ecbe5, 0x1f36dc6852f92c141ba800f721d079ffc553c7449b85d16e7487e0c3009c7835), (0x3bb657ca32617e6242b6c6a0b166a1db205024d0441d091b8d45fb478cd4782c, 0x3189ce1b97103345fc0eafd287eed80ab186151171f22af2c9befc71a0957529), (0x25578b0a6d546cf38dc84329fad41e59690a2bd94a0db5fddb42e0db8c267827, 0x03448e4552625dda62a96318bcafcc305deafd6a028f8379d8c8d9ffa0f86e64), - (0x30d1828d7463255ad75b39ee4c718de05a762c45c5d717d059496fe05d1575b4, 0x0a8eb70a9b252ee9ee57b29e4dab191cbb29665821830b2ab60fdd5d3414de45), - (0x1bdd262015bc4b15fd90dcb6dea748cb9032fed094df3edfc0ca96c419c6ea9f, 0x28bad5ad4461b66303cb84925b54258e27953e8ef5e67c1057c823091a8562b9), - (0x09e15af05d50016fd1c475fbd3ae0be95289f239f13962f755f8b39732c73feb, 0x03760949d5057f33c30391474cbc3d447858da57e8b72487a98827b339993e60), - (0x0460fc7f74c9808eea035e8df3ac031c2d05ecafd8f0189f2d6ddac3274752fb, 0x2bc99ad7317625f1a1d6bca1781557b87e8b9976cdcaf994c827a0087d1ce182), - (0x31b7012d949d0668d34cb20200d4e159262aa0dd92114d3aa5e8aa84af51a802, 0x2eb9c55ed473e18e62dc273a8606f955690a984551fbc38e80d65199ab8d0c3d), - (0x33dced988c6a1d40aff3da1710a0e36a6b787fd6dae51ebe3dda7835c2dbea15, 0x3b54a967115d43feccf77c385dcfc6e89f30343457bc8921e017c930a381b5b0), + (0x3eab58caf9fc2aa3fee6d649cf087fe9bca284c27f57c08410b0f8a7e09d634c, 0x04b350dc56fe19a25da0882d2acb6622bdad1c4b3e2200d35acf689782c20da7), + (0x37e00880dbfd31f1c3f86201583025a666bf48745428ac39caa1d0a0acaa0bd9, 0x0ff8ef43177aa324665a296a9a444fb4a6666e250930a039a687e53acc43eddc), + (0x0934479f5c328fdb235ac47bf94cb8551784068de4fc26f0dcdca078138cb71d, 0x213f745ff2233ec74c310b142665e4e223643eb72607fc50b98aae5c7149c78f), + (0x1a98842473bddb61c943296a39cc0a8a41cec5aa02696bd0a97569ca9f839186, 0x08291ab77b541973368946a0d14c85c69a142bfda31f9021328c98b69be25e3c), + (0x34a41b2fa64d913ddc6df62a3b881658ee29bd5c69154dc30bee28d64acee443, 0x1d88f6fd73525eeb4e8b0531297edcd107bf3c2303dd615f34732d7fb01a9b16), + (0x0a6e085a051cab2808d58f29990b4ba83ed49fba5f363f67b78c329514ac79e5, 0x20b236e5722f4cff16ee1607ffa3bf60c63e9f866b27d85e85a0b06b0b8c58ec), ], permutation: VerifyingKey { commitments: [ - (0x01b2f977b5e96e2d00052aa77013b4a7522b714ed1265e5b761a90add04a677d, 0x06ae5604d2abf710e3720ab4ca37bc7a75cec4772624973990fe7acb95d2b90e), - (0x3487595fd169aea1e2055c38daf7b83a923600084a12f6beb068e9ef0886884b, 0x2094e9bc4aead08e32eb63939e7b365f7c4dbe7bb9e4fe439fe7855da2a8ef59), - (0x34b7b5583a32b3a2a188214b041b0402948759fbdf47b4b50421905728b78148, 0x10fafdf7f63a938d87eb031cbe61c6dd5915612ecb71865e94a7d7fdcb96f9c8), - (0x38b9b1352ef7da340b69e7d152d86c26abaa7eb8da2b2049c75eb908bc42dae1, 0x2b7880c4c7790b2bd4f603a95561e7e1f4fba95eba4096f6d44b89e4b0a16519), - (0x08b55ac77535aa391210533786aa9a62215fe2cb6950b60dde6563f8c4f47d58, 0x1ca42aafc1ae6e8554a933225daae97222e08a59c866024a936f66e45455c47b), - (0x3b23fca8ae9ee4f186c654428419b16169777a1b5cf7e959f73de3fd21cf1403, 0x3ff330b5247e4a88c38452e3bbaf20c79cff67a4a5b91c5ac3c6614d8cc17119), - (0x39c00327041f3b0a21cc10acacd55a94f968770121fb55e8bee01e146ea024a1, 0x38c3af47f4278d74e808aeecaf9407b17757384e9d50b59500604c7bb86687cd), - (0x0fe245acf5779d18b38c28fd4f6d921bb5487579d1fd257b7ea48f8d6de2db2f, 0x1f8a5b90451fa159c9c517a0b7250787d86c63555659298bb7ca10c537e94e12), - (0x13f4c48990bdcadf99fc60d63b04eb82f26dc2c59b515f265a66c2732abd0205, 0x20dbafa9a43baccfc5ee6947bc408b1e8974af2f5c141f3f704a747e194f04f0), - (0x16d8e8e787a2dfde1ec419ce969aa5a6c23b9d703a7440a6f085cb1fbbb21a57, 0x217624d76f302eb4f3a4f9bd3968fa79f66e4b06b5bc72048b979fb58b1f29d7), - (0x0f74011b79a40415b90f8f22db1a1433b7336307801cfe97b84f60bf7cb15d44, 0x10f2a0765e05ab426d0b183ad84616438187efbfb6122540d768895324d42667), - (0x2139a7b9a8c74648139b556ae77015620edcc81cf0a89cc960a57e16c4346a0b, 0x0295889e3496dac3174b2ba3c5399b78d9ecf042730cede62d37f6f0bfc021b6), + (0x3b61bede3f87e9208caf3626fbe7a645e1b9f9b241a96160c68b708196e86cbb, 0x0932e9c67d6bb593c9b3d6bd9697efe79bb2f81bee35abeaa8a2a0a828d8fcc6), + (0x07800024b352149368405f222a8dfbf373bd4603df89929a5d00f7ac9ffac504, 0x250be8a84de9a8ded91e85860f1b1751f6bd2c0aba96329ee2d6f0e377f4679f), + (0x3384b0dbfa6553ad5adf0b218df2cbe6243c33102a97774b4e023ec1dc2d83e9, 0x2873fe49458cd70b9d72419e0d6a6ceadb8070f4b62a0bb47c58a89269e0b583), + (0x38def0fd8f233ef8651a28ffb7ae6f1e4eaeb0acec19453a3e5a0d70b2058782, 0x0512c67736284a225f0b6617cabd76ac2e4a6805940af4480798ca884e02d277), + (0x26b6d69fd8c13013c6ab5fb74bd3fbe85d01b0abb57e149ff53e77a535c6bf40, 0x05ae4f52e4ab72ff3cf2b64df6d371fda270f4f78ed0bccce8e3138d4e30e4a0), + (0x3f1b6f3ea5a2b24646dbe1c6f7c7dbf797fe6602a344bed59668ba5413519631, 0x0401a6f6ed893aa112f234127f8c30ee6e09b45f75993351aea9974389b261d6), + (0x2f34843015cfc9c9ff59c7ecab3cbb6aea69dcf6f5af79e166f25d90f70353d5, 0x2bcfde5880412d171705b41124b404a323697c4d1008b2e8b2bf9966e5809d3d), + (0x1241f0e0058575ff769809aa569ab0ff12d5b2d7d840eae76912c16433be00ff, 0x33339365e1edbdb387b0a0b7dc5a9212c0313bb0a131c9302bc57db36174f3b0), + (0x240a361e73afa04a2e5cc578680e54bf28e3375dbb35a8918c3cdbc91f1bc25b, 0x161c53e65c1b6500b576d8fa982e2565dbe35954840b0bab8a3d912158b9dbe7), + (0x32f883bbd63b0700f0150ea8d71f6f5d7cdcc4463289983d71e9bc104d4a5c28, 0x33aeb42bec794138b8db28696bd7cef4946a8a89edcbf3f8289655ff9f9129ee), + (0x03f33d3064517ab1a8e538444013bd0d6b011f9923f8cb964763a88d6d7409e0, 0x16f534b6d12d9e011b951e374982f048f0bed808099fd3ed97cd827360f6fb65), + (0x0ee42598f7ed2c349d720bdcbe34f85d6650e1b3f2add5a71ab0bf330fcd4f51, 0x346a2c51d2895839bb3e556eb20e6af8f5248f2d538a1407622c9d69bde1448a), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9d541d63f1f5e947978137c33c8705bebd8de2b4..695d163d99d1571649c59a9557e1362a49f391a5 100644 GIT binary patch literal 5250 zcmV-|6n*Q>=*>gpSm06wtae#yYpwF`?{_#70dkip!bJ#dc;^sdRgzE`xqr+W)n)J! z*ra;dR>1)_>_q0w?Aa(5blH-tOXvcHO_3Ag0q`~p=W)t_fjBxiatVm-%?~nd=Xx=6 z36q?5Z-he(hrma=Opl!S+RrRYaey?qC&oBW8W%mU=P%EP@-75&)PR12f6-Y}Ufj-( zxBUjr%jjr;{nQ)*0Y9L;ZJO0KJp;4=x0NiieaQMChKJL48~GL;9zj|VxJMOClpD!W z4c0GN2zHu;y;VV9tTnW54(UaEJs+vUwdrcEAM-FNkUOA}W>=ZxnpufWXE;MGuphZdC>G0G*&CD;$vOM-cxB z)Npl)U8k|zvX7kHTQI7Uoxh%cKc$?m@rPxH0 zu!(T>1znO;Vt%`Jrx)j7wHHl=E2BBrtU()>Q2H>pm9qkR_f&5uA;icW(pGL3|I47U z7Z~p`A%3hilm1&q7RY;8Q+(&*?UPiHu>>%DYdE4jhFU<{#ME_SK!j(ZAZ-Xx(9J`G z1yWD~_wUiyJ2`g}mN%m}g|vuY`vUK1FV~qkoOE=B^%5^DB~Ll$c;kd56}dxQKViXm zD!zC*ktb#a`L~U-e*Dk|f?H$YyS=Jh0Ce5i&ugMBE#YIAV*0z}`|A(e1(pTZ5ZBXk-yvf@5OlcL7KnIYMlOuIjJ6F-8K zXNrRxoBXw5BX0}rCUwUZ_@donm1j#bMhB?t8H$5S_5)WzQKv<#fuo9Er@AzL4t&fu zBUzLj-xM+DpxPZ4p!B!97@kswC3>_u3S52M8{|qV$uMsma9OQxS%|AuEBa`M>UqTkN2$ z(16e{khvMsN1)d$De}q@`dL-{dr1XT@hsmAJy5)>sE}tNt}d(S67Bf6rSbEwWY#}G zmE~eShNdg$bn|f_Ine$a=+gh7oQ|!yW-F5Yhs3Yy|IrVLAl0JoF*qwKkWTk zhl*u~6+}pI9Rre89o-C_1-S|OM?`~m62?RMD{^is_23`pMFJ{gIj_wWY9G<~7^;m} zUiU=fiA>FRA~SS|JE`PH)Ctne0|+hghz&hFN`!}M@CHUNh>$mDFN)N!c9F6jWA`*d z$65Ner{f?IBi>oI)C%)0^%AQ~4pR0BEA@#%Vr!@3{YzE%x6-kk#K8RXBwWKJZK0AL_v~~(B@$&tIz?%oPMVq*I_YXEzqKt7Eu1a?nA0X)$8u_m zHda$cjx=;C6zt4rG@KqOC6lDQ`rRl> zjqrcm3|k9~=Vqkyy7&+aOn`>o(sE0k=fT%fY2 z&s|9UO+k4vcx7UU>fzOtJbprT2z8BN&2LN6;^Z7%3)NnJr{OtuO{j#c;8$AkhBUb1 z5=1N&W#CsMPH748&hu+L&U^&YwX7 zUk(Mq+YDvlO@4M={o2z!Jqp+H@7$52?p52KD}g*#q|n=t0uHf0v(<%Tj94@rGkG;Z zAnnv?T23+o_0LwM7ya|1%3z|!FVN+ zb{@x6-O9lAKCIJV62ah+L%n3JX1B_z8cX~Rlh{qlZhY)an(7qs2@z{>a{v(SRb9{- zG}Fx$;^n%cIPd-NUQB9*3z2ifC5H@Yc<^kjG4%z4FvcFfBu&j(S#^1;wwt0los3k; z1t#z$7*!>^IPL%#hhE@)@l_?AC)>zq^VWZr;2p@019Md+L|`&jhBUF+EC)#eG%oK34NO?t;%A2%$>ODAGqzgPl&tmw(}U z8QZ4wQcs@{&dVpXRQ%Qe0FH+`E-Dwr>mBm09w|gl@kW6`$^_5r>F#9VTxPQY1Og#*1B zEICYPf(CH5LNN~-eAiIcHKZq6WIAd&54@r(b9bVr0y7uFuot?<`!L4zp4^4`hps~p z!GC)!yBs!7cF;mk7oT-~@bKn&0{^`Bb2Dl7jHNAgcyLW!9DW8G+{?E6H0Yq)yFrK7 zwq@V|gi=b}|KE72H&Y{9RvlFHwf0?n1~BB1*1px`QKXw)mSL$tbLsd>!Y>?Hj=GO{ zZt`w_512$(SY*l7^j8^Tq=O;b$o%+zD_rFZ@mc+?V^4r2AFIpDr^M*p^IV`q+6@u@Chmn}PthVgOWQe7kbl_SrXa)51kF*Lu~ z6@7o@2JC|MA7EXkbx6{>E0d(m4>C3e%YaQI9K&q(62|nOkRj=O%ziz);q24fM#!d> z&UQse9VG<*KeC+hnuE-f#V&an3ocEL#)B)eb9FgA^O_2-lX*Xj2vZExn1-}tJEP`5 z!5MaEVAIh}6P;O`si7Up7ce=Zc#! zH1l}fW&B{VuD*U&`e$7^F)$94biDsEV+%N=vcbw z9dKpr-^2%{O_3f+5Tj}T66m{8-8z5r_{LnX+&x;YHAB6Ry?h1&5MDLO4K-C1Z}8&? zM&t*{5D7^U0~kT@2bLALA=c1mm2A}s4N_5LtFdXa;ZeBpMrvMGL$qD|$R$=Cg*A_$ z-)y@A9fL#S@e=&wt!!i9GKLkTO%7N6sIm;pY#XbA*QR0n4VfQL6yP$pZHe?82QAIT zk&E5G+$7{jH;-6}G%&u*C*a1Q^l}o5cI#LxA6gEXm~3i7J61vQKxJxiCE7L@A%I3Zy9^HvjRGlPGv=K2zL9vOlG^G^l+C-t?gV&2Fd}nBn9I> zY3MMw9IEb(to3(<^h9FW2$%z4O;nfa=X%Ftt#}(T0K8sHLi#+D?KI^O^o~i!7hb1HmTQ z1wpA$?W$@WwsP`O^M>#=_f9y5Jjxf|1*sU`Ay}(BLNm;PB;pO%iV}U_SNY-4<+4Hu z=%WDrRK{EH8sXrcJqIUe)*VL8Q=Ayl2e8tX_Piokv$P-FNrOBAB~xa7^Gf-8au9j* zU*7ZCG6EP{kBZw#=r4sJrz#JrEk%P#V6pW`4y|8VW}xzhRkW%+l^#(t305Dlp4Hi3 zH(!oR1yHv(L3E{^FSlMKi#y0I5-aB7rry-t@e`X{63v~<^5FrQetkq%Myudw^d!8M zUtsrMu~a$Lwnlxk6T1GwV1n@h_u`MNk+Me)Fa9~DNa%6VgNyGK)}>}`F&f<-b7{=R zuWo9RFCw|(*R-5<;0Kc{c;ZFR`R}8<1a{bDAvTStOBv%3rkO8=+Fso$f z-G_9=qTEZH23dhO46pLg%mqEx*{Iifx=caA6I`D;U;qhidKOVHx|L+*!Rlnn>eAL8o~Z-1-s|d_GBUmB|LQB*KSDFuUhhn{z9*UlFU*5vfjjuZ-489_Qj8_SqCTrhn6vtemLrOZp zUBWxBR%tvmvmycSQBB#VkbvFZIAEkgzjs;5dXfXJCA#6*jK4?TnY=#xa857j5Dz(7 zKExbdtH|X>rgrnim~i~~nbwUHE@y($4$`%Kxj`Z`Jho&_gV7Oov1>UkTT;(QkxSVh zmC1rO;hn?`dJKFswuC&k+@H3u@5|_l`c9IU4gLL2pcB$o(z z(e#7MKYW>WNNWFe$A!ItudKpparIle((R2OYf+#jlyFhhp8DuP)gX@(W(ri~;MOIn zo0|~G(44N={t{gYEm|=Qq*&kNTWw@*O^fUFuv|-BChmN93k;!*A}!mI?L%~InFd7i z?D?OwnBH2`qAAzm+g)T_q@_VQ{q?sD4^)8V8RJq45Qp3pSx)2@kOk|g1BZt;5IpBe zz%daARTkc>SUQ<}G=dEHh}Nn~lM_hFt6C3c-0+4sT5d8d@07KK#{ z1h%cR(ZeI3GG#7Nh7I02Z&^XEV|Uv5Lsrb0`xtxH9M%qB3F}g$-Clzt9s%6phS->p znPJacLTce7Y|2;ak72C2JG&3Qc7~TUVCNjn-_lPkkq3G_V2fHHiX#=m1juuZLbe|+ zZYR%gB6`=(T2i7tg8c~6;<&LnQ7(sXIekNdTv8GdqCAJ~TsR1cSy*&UNFj8A-zZS~ IYufqsJ*i3!z5oCK literal 5250 zcmV-|6n*PS;&7n9DkUC6Y5LQ`LXSFN{j7NH5!tWn%C}8*PI4t@{Mt+z7fxD)exhI@ z=?%44roo8`i!t2mP@Vu~k+mWq^V>jfW;rKH=Epq8kLj0AZz>qFw0$1!c&uo8A?qQi z+1bRJKS*&QF1F#$`#0_YM8~W1XL*v^al|b_L-{7cpT|Py0yv{=o;Z=DEVBnQrM>NY zB9j%gK8I4fO-K>}0bo>md-Ri__uxP1z9`H=SM0aPnf!0hWot*pvNmr!ql5xA?dr^Z z8a+3+t)JaVl%;AwB!c}D-uq!UBO0ifGIa-;bJ0P{H)d_d$|9cfbmd03><15Hsp88L zK26J^2g0ypp-d1&_2e^~#?or?N6w?U$(%CU7zs@myo(jz>I4IQW z=)URFeLO3?-P^BZ(g^vSt@=pK60x4THWg)^0k5Gjtzl3kPNb=}+ajPSnc~26)0|92 z=kB0Bo9pp_50=_aMuodugvotCdv3dcjl}o<9PnO702Vo+H6`((yzf#YF4w~=Q)xNj0 znehoz!k&&Ne1kqs)U#JWusul!)<#$8>mFBb^a99+cT~vq*=1R?^BpL3-XNjHjU!Ev z^qF{?kwU__o6?Cwr3o2;PiAAHt;GTz3_Tx$lffv*%cp*i6t1K+sIIbQZS23eHsPfk z77t*JISVX~gPmv^UzD9i$YJTND)Jb5qoai%CC6;aa$GJ1@!ULctiirZGkr4lr^C6E z7OVd50vhm5;^{YnT_b=|^SwVKsV7@r-~kX!CAP$g!S*Kmh_s3);LkE|D;oxzf9y9l zoIGqliY(qdJ?;Q{D1vqDtLK5hYnv3R14?&VpAX{p*^vPEjn&n<^mib4LR6r-YF(5H6UG-DYs(O znzD0roC!#w`As(7RjXz*h)88y+*N=RJ2Kj_c!7g|UZN07junLJ0J7e!x-G3n4zA9w z?pKG9>>zH@ceXP0U5LJ-UtW)VJ{^g-#OgQV(Y1%Q z9kmmT0>%-M>?gKN-zgKI6Q*n+8lW^!Y{1n+u`H-|WbSv?)E+E6Tb?;Ne((7ze-FY?g-Xf_cASFRd5z#*o#+ z)+uB$iLr1&DtQe|XZ+IlYhRPtl5&t`F67Y+OLPlScz;Xk|2D%kW?4YrPF|6l>fPt8 zS(hTkEWWU0r-_%6rZ^0yGltnh0xN-&Rn17GGn2INPf{TdGHwJKDV7&I+{gAS+PR{3 zGeoe*6{9P??lc+%SO!t195h*miAb2=^psNg=MPO$w89YMH&$9-jw2DulX(hE6lI#b z7xXYK+0a=u?efC}<53t&I6nL(gZL-JiUT#DZ3DGco`$-~%2q@7<~xAsmg9t(njJSnY;? zp&?O_@t@JD<`g3-~@iI9p|Ley*7pI|L#$C2Msh zYyQOyk4S0NxKL-7JH^0&cHGY7zRmloI+`b`2G=SP{3x(hk)(3LNrGlL1XRImkLjs- zQ))eZ9XQ#lt!GUg%WJUl$diiG@l?g|P1qnGrsHjNfIatKr>CD1RBD zWS+3%-LyPC0R=Y;LGAXEvI|oeJ6!Mk#d$?3FYG^)P7E;_h`DgUz?GL6)I7wC!f{B@?hH%1$&nJ zwApu&za?^#pZYo|&r@$SRE6pj7aPZ2kP|*uSIuft=NwDO>t&G}-?S)<`Y`Z9hUfJ% zA$hf*j+AZ$(->Ws6OZ75j8f8T0)9As`zBgvlHOPo7)PYduhbk_DPYJ4ufoi%sc5dP zYdNC~_le2>7Q$>x6>E#P%adB$MbZdkgw| zYWO|&Y0-Cmk+-}RLjGi|5;q-wmVJRyq6ek4iCqhmbC6kV4(h|5eFaY%oP;i+CoxZM zB(j^W_P^#s_Hfectp z{{{zjTO~Z$J!cc4UEL8fU?4TNoY*)v>e&&UQ)f#399h5q1nwt8IDzKNrA#y`lPcNS z_S`B8*1Vd~O{n;Hjzs0Bm=tchGKCYJY`GC!HPsH~as>|BKf77`MP&>U3MCG(G2Ca0 z0*FFnva48ra8hZtjShXLC$Eiqc7lI`W!8R*wS0aW=G5>TWB_KodsErUwu z7RPF_9aV_CgJb7g8g@ZjT_?lE%$2{-DM-XG_BST{lz8N11YpNSlQMQKBCuH*Sm7_& zfo;YGdl`sCdU(HI2z;GV>=PhHUCkp)7%t5Rykj4v4@j`6S`;G}(iBXD^C|Q4VK8>} z6#T(G3H&_(jYbQe)ng{Yiqu6!xKnfvbR9>RVm`96EzK9 zUc~OJRb;Sx|{>P(JRi&mr*BqAOwe}&G`E5)t8 zDZ4w%Xdb^3shCB28!_2v4pJ*?@B9J_e$B@@AP}r1~c() zMTASt=tIxY0%P=yjk1#yX7>Ih4(V_hl3lE#0!Fuk#AGYd>K3r#Dx>2_b=p!Bp^HJv z^P-Cn>e!3_^>6vK;TzSN`kmp5j7VY>QYWH#Io*1rCR0naJ-U?2hx7SV^aG ze7_hFoc7ZY8nHy3^G|}QF$E5~;2%tIRz&?WS_(-FgA5Rip30;=gP-n)aqgWIEhDhH zH(kZ?g6!fC_AI?|B1YOLP$~c(N@8E_{ zQm|R@TT^uG3=*$iqYx8V#o~WkJaVU{r4zB)FBkWhVDOAPj$`TL1qrl<{6nI6Hg*O> z;~6zIYLXbwiF%MV)tt9tNG#P9BIGnv%UJ^WDfaPWZ_Z5Q_@fqF42jUuHd?`D(92w< zJ0cuRwPbfgS4R#f%o!;rw0p}Rr!~A)b z`$5Uo^pk@(TU9@Q>`i)s`d9Y&+a2U{68WFC*K13Az#r*OJSuMcp8#trVNvzF7={Iu2CVA8Rf$FBPOSWp9H;8>+E`&>y&(8r`D&gBJMjE>VLrEiNgERdZ4- z3#viQ?gx`*L!L_Om%l%f@+rI82PK)wqZz0jt+uB0ryKRj2zTV z`}zBIOtebEhK1>dB0$$z%`BnnzZ;-^mpxbk8Q?jsVLG`Z@ZNV50`Wr<0=KtcjK%_C`6Yirz$i;^*2V7(0wvC zT+b=v0l9$+`cfF#AHVPjKU_BcOq@_!zT)UX5o#-Va=$@$=Mhb8m7GkVmaEU>6cj!- z?Q639xDS02+C-c(lpP>>28mA*L)}j^i8G&8CD{)>3=L9y;klY?tX9%u!~NJIyGKwH z6(-=!nmQ&!sh{$Bq8s4`nf8F&i|>LWQyw@T6NXc9@w+<&L}= z6TAK+&9|+18|l`NCIpV&l1lqVvNy^?BN@iLSds{p z9*Mtx;u>7&g}ofm)~1dtpZ(2MbX(6lF2nMO~y=WA0Wb4-KvW;H0M&b zE9SOkglRvy;#xQOtskgK8Z%^gF`G`Uwkb+=1|;s5h@^SS*t$uMmbh9G|LSF zr)9&cpg^~wu8M|c`PQ-!G7uio6DhF0cgo1K_w`u8H~p3er#Zt5mb|m%bHRC267Na4 z{Ie%Bqn!`O=Q?e_ra74^3R;C4o_eQ%Olm#3 zvq*RD@w16-0GAp*r zLiYgay~UJLIRFerN@xlJ Self { + let result: Vec = + a.0.iter() + .zip(b.0.iter()) + .map(|(a_i, b_i)| u8::conditional_select(a_i, b_i, choice)) + .collect(); + RandomSeed(<[u8; 32]>::try_from(result).unwrap()) + } +} + /// A discrete amount of funds received by an address. #[derive(Debug, Copy, Clone)] pub struct Note { @@ -104,6 +115,10 @@ pub struct Note { rho: Nullifier, /// The seed randomness for various note components. rseed: RandomSeed, + /// The seed randomness for split notes. + /// + /// If it is not a split note, this field is `None`. + rseed_split_note: CtOption, } impl PartialEq for Note { @@ -144,6 +159,7 @@ impl Note { asset, rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), }; CtOption::new(note, note.commitment_inner().is_some()) } @@ -219,6 +235,11 @@ impl Note { &self.rseed } + /// Returns the rseed_split_note value of this note. + pub fn rseed_split_note(&self) -> CtOption { + self.rseed_split_note + } + /// Derives the ephemeral secret key for this note. pub(crate) fn esk(&self) -> EphemeralSecretKey { EphemeralSecretKey(self.rseed.esk(&self.rho)) @@ -264,13 +285,25 @@ impl Note { /// Derives the nullifier for this note. pub fn nullifier(&self, fvk: &FullViewingKey) -> Nullifier { + let selected_rseed = self.rseed_split_note.unwrap_or(self.rseed); + Nullifier::derive( fvk.nk(), self.rho.0, - self.rseed.psi(&self.rho), + selected_rseed.psi(&self.rho), self.commitment(), + self.rseed_split_note.is_some(), ) } + + /// Create a split note which has the same values than the input note except for + /// `rseed_split_note` which is equal to a random seed. + pub fn create_split_note(self, rng: &mut impl RngCore) -> Self { + Note { + rseed_split_note: CtOption::new(RandomSeed::random(rng, &self.rho), 1u8.into()), + ..self + } + } } /// An encrypted note. @@ -308,6 +341,8 @@ pub mod testing { address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, }; + use subtle::CtOption; + use super::{Note, RandomSeed}; prop_compose! { @@ -331,6 +366,7 @@ pub mod testing { asset, rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), } } } @@ -349,6 +385,7 @@ pub mod testing { asset: AssetBase::native(), rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()) } } } @@ -367,6 +404,7 @@ pub mod testing { asset, rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), } } } diff --git a/src/note/nullifier.rs b/src/note/nullifier.rs index a18e77fef..51769fdbf 100644 --- a/src/note/nullifier.rs +++ b/src/note/nullifier.rs @@ -3,7 +3,7 @@ use halo2_proofs::arithmetic::CurveExt; use memuse::DynamicUsage; use pasta_curves::pallas; use rand::RngCore; -use subtle::CtOption; +use subtle::{Choice, ConditionallySelectable, CtOption}; use super::NoteCommitment; use crate::{ @@ -55,10 +55,18 @@ impl Nullifier { rho: pallas::Base, psi: pallas::Base, cm: NoteCommitment, + is_split_note: Choice, ) -> Self { let k = pallas::Point::hash_to_curve("z.cash:Orchard")(b"K"); + let l = pallas::Point::hash_to_curve("z.cash:Orchard")(b"L"); - Nullifier(extract_p(&(k * mod_r_p(nk.prf_nf(rho) + psi) + cm.0))) + let nullifier = k * mod_r_p(nk.prf_nf(rho) + psi) + cm.0; + let split_note_nullifier = nullifier + l; + + let selected_nullifier = + pallas::Point::conditional_select(&nullifier, &split_note_nullifier, is_split_note); + + Nullifier(extract_p(&(selected_nullifier))) } } From 21d7273e49ea5f82f2def32916c390aa039af9b6 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Fri, 23 Jun 2023 13:06:48 +0200 Subject: [PATCH 41/67] Use tag instead of branch for zcash_note_encryption (librustzcash) ref in root Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 006f98c3a..484210f8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,4 +92,4 @@ debug = true debug = true [patch.crates-io] -zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", branch = "upgrade_for_orchard_v05_new" } +zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", tag = "O.5_compatible" } From 62d4ae70aede0632bc9a6a6e226a55c3204aa23b Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Fri, 23 Jun 2023 14:08:23 +0200 Subject: [PATCH 42/67] Change tag name for zcash_note_encryption in root Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 484210f8d..0e7f64ea6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,4 +92,4 @@ debug = true debug = true [patch.crates-io] -zcash_note_encryption = { git = "https://github.com/QED-it/librustzcash.git", tag = "O.5_compatible" } +zcash_note_encryption = { version = "0.4", git = "https://github.com/QED-it/librustzcash.git", tag = "orchard_zsa_0.5.0_compatible" } From ff2ac96b247f5879b15ebbf09d0bd8fb36a69770 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Thu, 29 Jun 2023 13:03:27 +0200 Subject: [PATCH 43/67] Circuit: Add constraints (#77) Add the constraint: (split_flag=1) => (is_native_asset=0) Replace the constraint: (v_old=0) or (root=anchor) by the constraint: (v_old=0 and split_flag=0) or (root=anchor) Limit the version of half (< 2.3) because recent half versions required at least rust version 1.70. --- Cargo.toml | 1 + src/circuit.rs | 79 +++++++++++++++++++------- src/circuit_description | 96 +++++++++++++++++++++++++++++--- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes 4 files changed, 149 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0e7f64ea6..3ad6adfb9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] bridgetree = "0.3" +half = ">= 1.8, < 2.3" criterion = "0.3" halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" diff --git a/src/circuit.rs b/src/circuit.rs index 99a35b1d9..a8164c7bc 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -224,12 +224,13 @@ impl plonk::Circuit for Circuit { // Constrain split_flag to be boolean // Constrain v_old * (1 - split_flag) - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). - // Constrain v_old = 0 or calculated root = anchor (https://p.z.cash/ZKS:action-merkle-path-validity?partial). + // Constrain (v_old = 0 and split_flag = 0) or (calculated root = anchor) (https://p.z.cash/ZKS:action-merkle-path-validity?partial). // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). // Constrain is_native_asset to be boolean // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset // Constraint if split_flag = 0 then psi_old = psi_nf + // Constraint if split_flag = 1, then is_native_asset = 0 let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -276,9 +277,13 @@ impl plonk::Circuit for Circuit { - v_new.clone() - magnitude * sign, ), + // We already checked that + // * split_flag is boolean (just above), and + // * v_old is a 64 bit integer (in the note commitment evaluation). + // So, split_flag + v_old = 0 only when (split_flag = 0 and v_old = 0), no overflow can occur. ( - "v_old = 0 or root = anchor", - v_old.clone() * (root - anchor), + "(v_old = 0 and split_flag = 0) or (root = anchor)", + (v_old.clone() + split_flag.clone()) * (root - anchor), ), ( "v_old = 0 or enable_spends = 1", @@ -307,13 +312,17 @@ impl plonk::Circuit for Circuit { // is not equal to zero, we will prove that it is invertible. ( "(is_native_asset = 0) => (asset != native_asset)", - (one.clone() - is_native_asset) + (one.clone() - is_native_asset.clone()) * (diff_asset_x * diff_asset_x_inv - one.clone()) * (diff_asset_y * diff_asset_y_inv - one.clone()), ), ( "(split_flag = 0) => (psi_old = psi_nf)", - (one - split_flag) * (psi_old - psi_nf), + (one - split_flag.clone()) * (psi_old - psi_nf), + ), + ( + "(split_flag = 1) => (is_native_asset = 0)", + split_flag * is_native_asset, ), ], ) @@ -1550,9 +1559,11 @@ mod tests { let (circuit, instance) = generate_circuit_instance(is_native_asset, split_flag, &mut rng); - check_proof_of_orchard_circuit(&circuit, &instance, true); + let should_pass = !(matches!((is_native_asset, split_flag), (true, true))); + + check_proof_of_orchard_circuit(&circuit, &instance, should_pass); - // Set cv_net to zero + // Set cv_net to be zero // The proof should fail let instance_wrong_cv_net = Instance { anchor: instance.anchor, @@ -1565,7 +1576,7 @@ mod tests { }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_cv_net, false); - // Set rk_pub to dummy VerificationKey + // Set rk_pub to be a dummy VerificationKey // The proof should fail let instance_wrong_rk = Instance { anchor: instance.anchor, @@ -1578,7 +1589,7 @@ mod tests { }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_rk, false); - // Set cm_old to random NoteCommitment + // Set cm_old to be a random NoteCommitment // The proof should fail let circuit_wrong_cm_old = Circuit { path: circuit.path, @@ -1606,7 +1617,7 @@ mod tests { }; check_proof_of_orchard_circuit(&circuit_wrong_cm_old, &instance, false); - // Set cmx_pub to random NoteCommitment + // Set cmx_pub to be a random NoteCommitment // The proof should fail let instance_wrong_cmx_pub = Instance { anchor: instance.anchor, @@ -1619,19 +1630,47 @@ mod tests { }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_cmx_pub, false); - // If split_flag=0, set nf_old_pub to random Nullifier + // Set nf_old_pub to be a random Nullifier + // The proof should fail + let instance_wrong_nf_old_pub = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: Nullifier::dummy(&mut rng), + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_nf_old_pub, false); + + // If split_flag = 0 , set psi_nf to be a random Pallas base element // The proof should fail if !split_flag { - let instance_wrong_nf_old_pub = Instance { - anchor: instance.anchor, - cv_net: instance.cv_net, - nf_old: Nullifier::dummy(&mut rng), - rk: instance.rk, - cmx: instance.cmx, - enable_spend: instance.enable_spend, - enable_output: instance.enable_output, + let circuit_wrong_psi_nf = Circuit { + path: circuit.path, + pos: circuit.pos, + g_d_old: circuit.g_d_old, + pk_d_old: circuit.pk_d_old, + v_old: circuit.v_old, + rho_old: circuit.rho_old, + psi_old: circuit.psi_old, + rcm_old: circuit.rcm_old.clone(), + cm_old: circuit.cm_old.clone(), + psi_nf: Value::known(pallas::Base::random(&mut rng)), + alpha: circuit.alpha, + ak: circuit.ak.clone(), + nk: circuit.nk, + rivk: circuit.rivk, + g_d_new: circuit.g_d_new, + pk_d_new: circuit.pk_d_new, + v_new: circuit.v_new, + psi_new: circuit.psi_new, + rcm_new: circuit.rcm_new.clone(), + rcv: circuit.rcv, + asset: circuit.asset, + split_flag: circuit.split_flag, }; - check_proof_of_orchard_circuit(&circuit, &instance_wrong_nf_old_pub, false); + check_proof_of_orchard_circuit(&circuit_wrong_psi_nf, &instance, false); } } } diff --git a/src/circuit_description b/src/circuit_description index 8078e15f1..863c4e1e2 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -260,13 +260,22 @@ PinnedVerificationKey { ), ), Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), Sum( Advice { query_index: 4, @@ -913,6 +922,79 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), Product( Product( Product( diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 695d163d99d1571649c59a9557e1362a49f391a5..5a8711554131107aeac547f3b033c40a9fc21d75 100644 GIT binary patch literal 5250 zcmV-|6n*Qe)T~;XOCbpz{vZe|sLxf+!-&0h$Dv4Sr%`ZLE{iTJM1N6jUPO~ zJK!xG1I!als(TRu0Sp!*vzpbhZl^`y8q}iuW zgeuMEoCfPGy9hgvxGpNMM9i$FaO)1LnSHj*S&g{IP$s~z3U&(T3`~59G;XxmAavO`v{b)%8B1yRe)$!s_{*%y0dz?%7WRzN`L|e>zMH{ul$9K^tNqFm)Pntl zWdD!>YlL8~0>XMsK$)2gag=8+n+Qz?tLIB)KU3qt{3a#D@;L)|j`=o138hwMtA8al zUSbjyX19Lx*R`F@%JyBiGUejGB^mdI@Z3=H7TKOHNQv`KR;+*C3yhXIe1NCPWU6(; zv3MkvRDa85ueu$b!?Xj9T0U*d)ArPIYa_J$ET#Th9SmXaF7}-q7X8D$FsCelCG+Iw zogNv`Y2=$*4_hYrumBUVGMHsCk+dUj2G1fMq~3Ql(%ikr$Q-w<9Trz1mz7yZ9ncnN zP{xMJg22q3uu8kM0ZT?M_YgWtebMjK7`FE#o8VT7bOqFxUNL^@~sV$*bj zFlu6&iJl&1B)_JRV8oJB*QLug#N`l($UK_U%G70f6n|TkmL^vE7pk`M!UH4Ic!2 zd;@>b!46={??gNe;dV5{p(nyHH}4Lru4gy8g?)8LWIi$HItMt^Q>K`ml9`WfJQX@q z_&IiNvrj~DHaUYzg8QA$>zru{@v8Xe?^|hU?K+Ii8%m&(1gRC^h8xL=tN5pHo;4$? ztUf`7sJ7jcaA21>N>ORj-w%jm7tW=&R8L#Ma<<4QeBIT-EkBSU^6934AQFMPErP21 zyNO{VLqDY=Xk99$em2DXnB4@303yjclkyiFU^%LWy)o-Lx0CqbLp2_LQrov@EfXx5 zZ~;0%=+$f$qPfC0DYvfW3u5AnF??pIKQ6LC6-+z$#~SRQ)F*vIE@*>8iqs!;=I(eG zTam9tnE*i1Ryf4QtN3IhvHr$qu1k+*0T$%@&ON9HImlrxX4nHF zX+n!eDrxP=K0TZ7D4%2SR)e9q2?z1#IqXXfYp}R>EwN$Mv>rk>YTTq|6ngNvrqxh9 zMBH}DR+D1k`8Oi;MGFa3sw!jo=6&+^@WFX;IU*#Tmg&s^QbXqWw*Sk-^7ix&4z@(t zt4@_IN5ou76nRi>HPk}=TQBPPd9IzVxl<8W5Ro9uFP{*rKHpC(2g#pl1JA65X=By5 zog3qEE&==ND>6c>B*0~tgUHl-)7cY(!M9WS#!et@E*KOuts1R87&j3NI4YMN$b5Ul z(03jm3lzKxgvxe2iJW?2qRY~J7bz_bu8{5`{2524itAM!W-0 zHLEIt7|Wr8PCP#WH@=z_?qk&fpFoY-gsy{(*47PMv&J$|EF@%?Ocy=y0D0=ctnoI# z^32`C_?OSLk~iYv;u0Ei4`R|=pGiq1A>scM!R_x-6N5eTbtA<=$TD?-om!wMCzvrx zbBtOCDPBK&V>@`7`M`an*w8)$@Ffw*Pu4dN<~HApEdkYG5mBzdms2{c7`~c^?)u=4 z>CITyh3Sq&FJxyDve#CQEQ$CU(GP6kr7k*Hg$&`cTUes$?W|$N>xXuGoder+EN^e} zN^^NI(>RKlHIpSyQ55G$n5lGw&_txvNimCq1@N@edU*FW;F=9ABtn&0rmKnieY42o z4JBy0{HujB2l`9XC%n@B4ie#e9nb-%W#QSAD4Q}+g~WdoFAWf`3-T@0zZr%z_q~)K zHowOj`^}85V8z&L6-wUH*Q~6&4gK)<1T11(6)&MbSZrR1ASUYTlG~PZX%oSs7J@}t zEb)HAQ*l8U;!4csj;>hfU}4C9F8lW|O$B5$gkfrL5_6os+q*^#oMUThP@cH*qRE$iOt&FfJD;J0vG=m&V%zWkFnbqvk z%M?!R45+Vm66a{d-B4~Jz8zzrCS;w65qNm7C-2juT^fvsDcC+tt|_v%_yl#M*VO%R zq!{h5St0Mt_jsk}e4ord4{ggqJC9?Cx$Wt#F{p^LM1|c(hV9yJRov>zJh`HqD+|m; z#=Js>{-plob9r5Pm5cvQxmL)#5)!G!TSZr<9PGwZmnkGhNmczt3J-n! zc4FKYD9ZVP>x33aLS>oeTP2F<6yE^N3YpTAwEB9YA|$w&$|=;U8pP=klTTEX1zwHV z0z*$emq5}KZCMcG;}^gVLN*^ zGNam#n=DhG7DSCp3T8w0lVgE}Y3y$AJ=U!Ao6{Q%l$&iI%Zo5V?D-*$I){uMDT?|E zz1CEOw%qL&t(?7t1$HvN;z-q0C;`i}Ap1!vB=Fc4Yg=)`X3u=+6hcV=adqTMHVWtA zZBY}h3Fzz~?1E`p$7V)I~Ed@}4c#=wzTPmJ6OQwl7*feElB6np2 zWhN_T45Nj4VgHct!C32-XO73jTg@K7Rga<6bAY=Lq`C6d}NSPiVObLE;V4 zXKdcfx2^8zAN&>Rqo6jj_lhBmu>`gI0U%T`OlA4k;IxT45AUP4BsnlJOKz3s@ET+9 z^Bh42YbY2omj+oC(LqsHY1?rcD*riu`q*(8GN}3a4NJT9FKTkMMp)mq8ktq&4@E`$ zC=Vcas+b{ZM$%R!3I|;$OL_SV6_gaS?UD75;veJj3`C47D>vp&2eGEW^&@R30}re| zkoj!XP~OMiVK_W;5W0X_02gS_Dom=tG7R0u8@K~@&<3UxR7ZOg{G&bXGk6TMP53&0 zgFtRb&n@C>KN|t%BH|6B7Emob3pD6OYImbU(mEiB{dnr)%J<#TvSL z?3-k#0%*_t=Q6A@28GRszk`RdeXEIHWechPsrom0#~J~@0Aes#8C$(}S^GZ#-u~%zF{Kj>!N1uz?_MhO z1^~l~`Yzd5A@xg!Y@cxIZy8LNG@Mg_EiZpJV@vt=&|<~5hc{Pb6oR<^E+RYX7}!-5 zG9&ZDT+*zPIq;hIgELH5mwmqxCSMPwoZHN9ED;;s8yyZ|N?M3T%`ObAeFUhA$8ofE zClmLk@|iOCQHAmp(50^y39j0jpV{9lVZYjnRLp>bCLhNOL1sYoHbvZO%!*({pQt2t zUl5YfPOdrrp@fMpJ!5Ep687`2Pn(3j4WT?Oh}d88%yZ#_u+~Pv*&aG-3x%rWb6N7_ zFsY1)$vJnxuNNnoS5mWA4&eW~DLGEFEt1SXQ_6(e(r{GN{?dZN&hKxD!~Q$%*%J|~;XC|`P+7LO=?Tf}Fdo9T z+>p;7ABMZKjRhR!Hm0S6ay)C@?--~)faFoRDcjAAC=U9{(z>5p9Z!#%jqC20!}KrH zbX2Lpev6ryEAwWP`5_&lyWi;K7r#}IY6=FkxbsKd-f^&GtxNF*BuY>WP54)ajwKS4_|u z6zxm|+cwrR_eG@-BGIDpq#4Gvv;2^%A^jjsj8H__e>0X7q5gnw5Wdch*64=0u^np%yq ztMni};#r7Mp>h}1N|7mF3Mh;xv-hku4gC4KEaf~`Qc;C>xK%t@w2U^I)6-JIWR&0m zm0Y<*J>vU?n7sht6bPGm)cv{r1fml2fBguW%psb=T3n2~JQw)B0iZdLg_8>fS53lD zdR(G-HjYnVsS|*C1Sn2V1>U}7LEb9vho@RIZBLl(j8|nGo_MKoGF+3$D@|{SDM*d87pE1Tq@%uWW=%jKTV>T*_hj?J|5f<>jCv242vldx# z_I0KjIbPZW>|z{7R;z*W;<0=D9iFllk43jOO`ve?sM?VCohNxH87@J&v8dM@0!|K! zA}C)xQ0tMDQg04_T>C#9bDHZ`-oVmwE8#3+R9>uq9|N;_4kb9Ok^4Ngc1m%D$I7D0 zd{R}jNO{wQa&_!;5TBZV&E~Z%&d2lYg}Nv^cK$Yu4<3UX2PXj|rs7Z}ByRiH!1aHz zZMelC#7Y6{V7dR?=&uIb$K$48F1C{G97fNGp>FuZ(Q2CN>4wQLBS;FIY2?jj8Pivt zwbMZk0n6#f<$s1+sPu|sjj!4yPHpR>biC!jXjF9bg&B0u8Pc`eDrsPGo^dnzl-kav zVWbnXQ-F*}YHh?qynfC43d!J#xcWsZ?>fv+r@^D{R|bJL(>T>m#rW?#BJr8Tfm`D5 zA4g8wbfG~$OT7rT?eSm}``w}EnB4N>)A*rb-_|$OBe3yi5q{Du)-AM3Ud%+c^G`u< z+j>y3A-Mh;gVk4FL z{|sOrX%+rt&YTYJS3Xa)7=ml zZKHzY!jf!B8C|zFAwk~$1>w&#TQ%H1Z@myQHFHU^ zQ|D^T{}H>8C-f zK$O_*wz{t2Jbz0ai^2ce1oEAgBocZ!^}MO|t2YvbdWM7Jsx6FCbyj2_#Eh$MTLew1 zWjoOlyf_FW?_cdMz&@s}f`-*6r;WY;i>LSgbB zv)XjQ+WNJcw%tUNO6NFjM~lap>sUxhOn_@UR*;`Tq_@+J$Ff#3u0K!@juyyTj#fv- zU~D9v))~eGlEc4>LBb8mM~N-8t8P3;g3b|g@1xQJCkTYXS4FkhDZKV%xM#cve>j_` zwOiI%p5zz~Ji-3U^SGMYcorHK|5?075;f*1Bkk^@1aDOXd-2|+Zh$mV_VOBou+NI? zy4u7i{h{~w53;f?0n9n5T*$IGy=#J%v#tjCEtNnmdS`$J|10TL^OiGCvy~u#<06&G zhYAU#Ob3jrZ^Ibe@B1w%ygvsO(&~mn4&&o-S>;+XSbZqH&;r;PSE#CW<+InBr^G(7 IeX+H@0}cNf+yDRo literal 5250 zcmV-|6n*Q>=*>gpSm06wtae#yYpwF`?{_#70dkip!bJ#dc;^sdRgzE`xqr+W)n)J! z*ra;dR>1)_>_q0w?Aa(5blH-tOXvcHO_3Ag0q`~p=W)t_fjBxiatVm-%?~nd=Xx=6 z36q?5Z-he(hrma=Opl!S+RrRYaey?qC&oBW8W%mU=P%EP@-75&)PR12f6-Y}Ufj-( zxBUjr%jjr;{nQ)*0Y9L;ZJO0KJp;4=x0NiieaQMChKJL48~GL;9zj|VxJMOClpD!W z4c0GN2zHu;y;VV9tTnW54(UaEJs+vUwdrcEAM-FNkUOA}W>=ZxnpufWXE;MGuphZdC>G0G*&CD;$vOM-cxB z)Npl)U8k|zvX7kHTQI7Uoxh%cKc$?m@rPxH0 zu!(T>1znO;Vt%`Jrx)j7wHHl=E2BBrtU()>Q2H>pm9qkR_f&5uA;icW(pGL3|I47U z7Z~p`A%3hilm1&q7RY;8Q+(&*?UPiHu>>%DYdE4jhFU<{#ME_SK!j(ZAZ-Xx(9J`G z1yWD~_wUiyJ2`g}mN%m}g|vuY`vUK1FV~qkoOE=B^%5^DB~Ll$c;kd56}dxQKViXm zD!zC*ktb#a`L~U-e*Dk|f?H$YyS=Jh0Ce5i&ugMBE#YIAV*0z}`|A(e1(pTZ5ZBXk-yvf@5OlcL7KnIYMlOuIjJ6F-8K zXNrRxoBXw5BX0}rCUwUZ_@donm1j#bMhB?t8H$5S_5)WzQKv<#fuo9Er@AzL4t&fu zBUzLj-xM+DpxPZ4p!B!97@kswC3>_u3S52M8{|qV$uMsma9OQxS%|AuEBa`M>UqTkN2$ z(16e{khvMsN1)d$De}q@`dL-{dr1XT@hsmAJy5)>sE}tNt}d(S67Bf6rSbEwWY#}G zmE~eShNdg$bn|f_Ine$a=+gh7oQ|!yW-F5Yhs3Yy|IrVLAl0JoF*qwKkWTk zhl*u~6+}pI9Rre89o-C_1-S|OM?`~m62?RMD{^is_23`pMFJ{gIj_wWY9G<~7^;m} zUiU=fiA>FRA~SS|JE`PH)Ctne0|+hghz&hFN`!}M@CHUNh>$mDFN)N!c9F6jWA`*d z$65Ner{f?IBi>oI)C%)0^%AQ~4pR0BEA@#%Vr!@3{YzE%x6-kk#K8RXBwWKJZK0AL_v~~(B@$&tIz?%oPMVq*I_YXEzqKt7Eu1a?nA0X)$8u_m zHda$cjx=;C6zt4rG@KqOC6lDQ`rRl> zjqrcm3|k9~=Vqkyy7&+aOn`>o(sE0k=fT%fY2 z&s|9UO+k4vcx7UU>fzOtJbprT2z8BN&2LN6;^Z7%3)NnJr{OtuO{j#c;8$AkhBUb1 z5=1N&W#CsMPH748&hu+L&U^&YwX7 zUk(Mq+YDvlO@4M={o2z!Jqp+H@7$52?p52KD}g*#q|n=t0uHf0v(<%Tj94@rGkG;Z zAnnv?T23+o_0LwM7ya|1%3z|!FVN+ zb{@x6-O9lAKCIJV62ah+L%n3JX1B_z8cX~Rlh{qlZhY)an(7qs2@z{>a{v(SRb9{- zG}Fx$;^n%cIPd-NUQB9*3z2ifC5H@Yc<^kjG4%z4FvcFfBu&j(S#^1;wwt0los3k; z1t#z$7*!>^IPL%#hhE@)@l_?AC)>zq^VWZr;2p@019Md+L|`&jhBUF+EC)#eG%oK34NO?t;%A2%$>ODAGqzgPl&tmw(}U z8QZ4wQcs@{&dVpXRQ%Qe0FH+`E-Dwr>mBm09w|gl@kW6`$^_5r>F#9VTxPQY1Og#*1B zEICYPf(CH5LNN~-eAiIcHKZq6WIAd&54@r(b9bVr0y7uFuot?<`!L4zp4^4`hps~p z!GC)!yBs!7cF;mk7oT-~@bKn&0{^`Bb2Dl7jHNAgcyLW!9DW8G+{?E6H0Yq)yFrK7 zwq@V|gi=b}|KE72H&Y{9RvlFHwf0?n1~BB1*1px`QKXw)mSL$tbLsd>!Y>?Hj=GO{ zZt`w_512$(SY*l7^j8^Tq=O;b$o%+zD_rFZ@mc+?V^4r2AFIpDr^M*p^IV`q+6@u@Chmn}PthVgOWQe7kbl_SrXa)51kF*Lu~ z6@7o@2JC|MA7EXkbx6{>E0d(m4>C3e%YaQI9K&q(62|nOkRj=O%ziz);q24fM#!d> z&UQse9VG<*KeC+hnuE-f#V&an3ocEL#)B)eb9FgA^O_2-lX*Xj2vZExn1-}tJEP`5 z!5MaEVAIh}6P;O`si7Up7ce=Zc#! zH1l}fW&B{VuD*U&`e$7^F)$94biDsEV+%N=vcbw z9dKpr-^2%{O_3f+5Tj}T66m{8-8z5r_{LnX+&x;YHAB6Ry?h1&5MDLO4K-C1Z}8&? zM&t*{5D7^U0~kT@2bLALA=c1mm2A}s4N_5LtFdXa;ZeBpMrvMGL$qD|$R$=Cg*A_$ z-)y@A9fL#S@e=&wt!!i9GKLkTO%7N6sIm;pY#XbA*QR0n4VfQL6yP$pZHe?82QAIT zk&E5G+$7{jH;-6}G%&u*C*a1Q^l}o5cI#LxA6gEXm~3i7J61vQKxJxiCE7L@A%I3Zy9^HvjRGlPGv=K2zL9vOlG^G^l+C-t?gV&2Fd}nBn9I> zY3MMw9IEb(to3(<^h9FW2$%z4O;nfa=X%Ftt#}(T0K8sHLi#+D?KI^O^o~i!7hb1HmTQ z1wpA$?W$@WwsP`O^M>#=_f9y5Jjxf|1*sU`Ay}(BLNm;PB;pO%iV}U_SNY-4<+4Hu z=%WDrRK{EH8sXrcJqIUe)*VL8Q=Ayl2e8tX_Piokv$P-FNrOBAB~xa7^Gf-8au9j* zU*7ZCG6EP{kBZw#=r4sJrz#JrEk%P#V6pW`4y|8VW}xzhRkW%+l^#(t305Dlp4Hi3 zH(!oR1yHv(L3E{^FSlMKi#y0I5-aB7rry-t@e`X{63v~<^5FrQetkq%Myudw^d!8M zUtsrMu~a$Lwnlxk6T1GwV1n@h_u`MNk+Me)Fa9~DNa%6VgNyGK)}>}`F&f<-b7{=R zuWo9RFCw|(*R-5<;0Kc{c;ZFR`R}8<1a{bDAvTStOBv%3rkO8=+Fso$f z-G_9=qTEZH23dhO46pLg%mqEx*{Iifx=caA6I`D;U;qhidKOVHx|L+*!Rlnn>eAL8o~Z-1-s|d_GBUmB|LQB*KSDFuUhhn{z9*UlFU*5vfjjuZ-489_Qj8_SqCTrhn6vtemLrOZp zUBWxBR%tvmvmycSQBB#VkbvFZIAEkgzjs;5dXfXJCA#6*jK4?TnY=#xa857j5Dz(7 zKExbdtH|X>rgrnim~i~~nbwUHE@y($4$`%Kxj`Z`Jho&_gV7Oov1>UkTT;(QkxSVh zmC1rO;hn?`dJKFswuC&k+@H3u@5|_l`c9IU4gLL2pcB$o(z z(e#7MKYW>WNNWFe$A!ItudKpparIle((R2OYf+#jlyFhhp8DuP)gX@(W(ri~;MOIn zo0|~G(44N={t{gYEm|=Qq*&kNTWw@*O^fUFuv|-BChmN93k;!*A}!mI?L%~InFd7i z?D?OwnBH2`qAAzm+g)T_q@_VQ{q?sD4^)8V8RJq45Qp3pSx)2@kOk|g1BZt;5IpBe zz%daARTkc>SUQ<}G=dEHh}Nn~lM_hFt6C3c-0+4sT5d8d@07KK#{ z1h%cR(ZeI3GG#7Nh7I02Z&^XEV|Uv5Lsrb0`xtxH9M%qB3F}g$-Clzt9s%6phS->p znPJacLTce7Y|2;ak72C2JG&3Qc7~TUVCNjn-_lPkkq3G_V2fHHiX#=m1juuZLbe|+ zZYR%gB6`=(T2i7tg8c~6;<&LnQ7(sXIekNdTv8GdqCAJ~TsR1cSy*&UNFj8A-zZS~ IYufqsJ*i3!z5oCK From 081513b3635e1bbec9de2424a3069898a23362ca Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 24 Jul 2023 16:53:10 +0200 Subject: [PATCH 44/67] Circuit: Fix balance violation (#78) To prevent balance violations, we have replaced the constraint "(v_old = 0 and split_flag = 0) or (root = anchor)" with the constraint "(v_old = 0 and is_native_asset = 1) or (root = anchor)". Previously, an adversary could use a zero-valued ZSA note to violate balance by setting v_old=0, v_new!=0, is_native_asset=0, split_flag=0. Limit the version of dashmap (< 5.5) because recent dashmap versions required rust version 1.64 or newer Limit the version of hashbrown (<0.13) because recent hashbrown versions required rust version 1.64 or newer --- Cargo.toml | 2 ++ src/circuit.rs | 12 ++++++------ src/circuit_description | 33 +++++++++++++++++++------------- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3ad6adfb9..a0929100c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,8 @@ zcash_note_encryption = { version = "0.4", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.4", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] +hashbrown = ">= 0.12, <0.13" +dashmap = ">= 5.4, <5.5" inferno = ">= 0.11, < 0.11.15" pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 diff --git a/src/circuit.rs b/src/circuit.rs index a8164c7bc..9d550e5d2 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -224,7 +224,7 @@ impl plonk::Circuit for Circuit { // Constrain split_flag to be boolean // Constrain v_old * (1 - split_flag) - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). - // Constrain (v_old = 0 and split_flag = 0) or (calculated root = anchor) (https://p.z.cash/ZKS:action-merkle-path-validity?partial). + // Constrain (v_old = 0 and is_native_asset = 1) or (calculated root = anchor) (https://p.z.cash/ZKS:action-merkle-path-validity?partial). // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). // Constrain is_native_asset to be boolean @@ -278,12 +278,12 @@ impl plonk::Circuit for Circuit { - magnitude * sign, ), // We already checked that - // * split_flag is boolean (just above), and - // * v_old is a 64 bit integer (in the note commitment evaluation). - // So, split_flag + v_old = 0 only when (split_flag = 0 and v_old = 0), no overflow can occur. + // * is_native_asset is boolean (just below), and + // * v_old is a 64 bit unsigned integer (in the note commitment evaluation). + // So, 1 - is_native_asset + v_old = 0 only when (is_native_asset = 1 and v_old = 0), no overflow can occur. ( - "(v_old = 0 and split_flag = 0) or (root = anchor)", - (v_old.clone() + split_flag.clone()) * (root - anchor), + "(v_old = 0 and is_native_asset = 1) or (root = anchor)", + (v_old.clone() + one.clone() - is_native_asset.clone()) * (root - anchor), ), ( "v_old = 0 or enable_spends = 1", diff --git a/src/circuit_description b/src/circuit_description index 863c4e1e2..7a9d35f07 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -261,20 +261,27 @@ PinnedVerificationKey { ), Product( Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), ), Sum( Advice { diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 5a8711554131107aeac547f3b033c40a9fc21d75..9005e06bc0beb164cc041c00bd0ac8707ebe8da9 100644 GIT binary patch literal 5250 zcmV-|6n*O$b%uAr8c1>lt|YxRlS%)5inZ>xx&|y34|KR0(y}7Xq`pT9lNC7?GDP7s z+^*;IT!_k_)U!zZsRdo76lbsRA~k~!qsWFg8PUqbz?e% z`}K;frG46z7Qk{r4+V!4Vc2zVj?4Gl3pTC~oO|9st&1c{JXrQ=EwEPC8P z%jf>txRKAlb)TqtwmJ{K4Z_y}?C5tjLb{;MgxXy^dlh=lyeP`cPsmgGSnae(VB4QO)T`V zunAM0n4M>?x7xSpIyTql!VSxp0FfMw+n+(|r}0J_uEoI2mQSS)09G^h^jC@;x2 zlBCnq(MUnXv?xK-kLYBn%$0qsN7xhp9rDGE_w@hLWIM{dRk0|&iebihon1+XM@T5J z%hQqr$u7r4xmA+HB2i}8v~9R@_R%$$mz4(D$vVb9AjJPRUW^Kdr7=LTYb^)Ac97+K`0vi%{%jGOP59sjKM+DS|&+8Xl2^%XBg@Xi{s@k*`Y6%`48>wFhCsP$Dpw z6C(=@jBRd|>fCi0mizdj6~qNyNs`6>Jujc&Whu|UF=mh;tdhJO`E zJ&M7y%1Kgt7b+`3#X=|1}lga2RHsuK{!3*cr+B?lACg|wNL#{_<5r*Sq@ zgn8;KL%-NsHdDN)3tP(fiF}I2qC_mF!9_;OH2vlT$a`0QcfY4N-(A13VjGSa(%2s_gq%A$CzZ z123v+tU+a^F9b&^1`<|{92=No9CzNKp3&8r;FN(nR#U`mF;oO+DGI){oaZ=5Bzd-% zyGj&LX#ob4%WuxC@?zddG6s{t7}H876xn(XVLY+W+tT+gkOIG*tJ9bs20I3m9iX#> zJUdNq|8FpXq}4Hc!d^h!-5dS`C2oQ)X-ds+zEV*>7=VDdH5P7V?d=g*;^G4l+!L*) zr8psb0S`#uH#HrLHO6`Wy2(-AMrz%y64OHhvB5-@j@#4oY}r3*r-n{GGM9zQ+kWwk zJ-tVLLh-#%235@YBsRac-Dt!ddmMK}FWfG{7Jf8;tUV^XeI6D|O*UaIJnT~vP73Vo zbq0y{J>FsL%&b`x)0jz%!*&!REsnJG{5`IAd-BY>q8(F9JGuJmiomYZgJ;{ws^TyN z2&$n>C8c_eS~J<}D48KcH8pEmJb>(l)SW3LYu7wwjxqZsCP#AHPovu(EkIPN z07oHo1@t6Op7ro8=s=0$xO?_?2x94*N)C{VDsv&hw5+geV15SdcNVmC>C)fqCO>og zWhi-H=)`0B16@a;lHXvn_` zZ6DAJusP?<>(>|)WPoJ()!h2)Ec-vlIbKNmsOfKLzdH);24 zP$tmaX4ADGp^UH8JL(}M)U;Vb2wl7826>9H#5+F}L|pMM71T`aw(MNlGzo})!7i60 z*$J@yp$(C<0$vTaLOi(N2o327rT`=tGz9`rIRl$?ME|K&zXWQ@WD}lV>e=4%{&isO z@y~W1G1t=+ag5mi3gE5T{PwM-i?Wj*)3ehom_Yi}^T7-2D=&a_B+dLVD-*>bQ}D@u{QbU-tvL>SR`y#6x)Q+INhsc%DHS)xc=26QE16MG)= z5AM}liHl9EA@7kZF85nVEJUPiHnuowF9&PwAxOUk=4E&ON9(-O3mat%L=mVB}{B_v+Dd(7=ABSY&#Ravs& z0bZ%2GuAt5ljEEuPoKJ_ZnfnrU02m+3nj~`$E+k*7PlJeZ$iQ#R1Y-WP1%uGw>%a< zyj_@eMebv+0+Aq{Bw62PzLU~w231;9IvTflm$Tp}YKDE;fQunqjiC+8DvRze*cEi3 z!Xa{^|KRG%XLt2daj?Mx0Y-SV7&gU(0%67%*F{m8Ii^($!4Ch}_Pcy(;xdc&f6MaB zY#L9CFAWM2%qVN+j||cUB1>C=A&&m`E)Qpf;w2H1VvsX4ibnF7k0=O4b zsP^b=MF2gSf2_^O79N7pdHWniq!Ji~ujUXX8J`0|;s=2wHXiYVCy(4+kwVwd+;^ct zXL`Fhl9eRsB;aDUC>FmLgb~p^tV2N)Tu&OWwWh>hL$|DftGoJ^T>!W&%83+-Ej5gc^Sw&T;3mP8alk~Q|xEfU6#fU~`May`&brCrd@ z7`Cg&g~7oB}d6IJ2$O{vyKUg;@$tMUS!@5nmS8E zS1-UOdm_YbV4A0rD6N+{|KL8X_}+KMERk0o~N7f5?W5Uu!w(lE?fcLprR*{BJeXJE6~ z8_HKUW|#a~J$Vxjp_{#SZm^Aw8oZ*e7>FbD(QtBGLKZL6Z~^>R3UZQRV?8`oz3`&x=GsK7(1Fv32rB&*fqhU?EGN;@Ui-b4Apuy*q|m1?FOY zANhD~6)p4x_|E`%#_>DPIQM94(oR8W_s05K|EyRaE)Btp+(%zK&&chl(9<(6ur}xt zK5|`V04exHWXGQ~03T^v$3`6#$AL4v=! zM@#$N5%4%RzrNA<#k(5#A>!N!bSNdRQ^ecec=ICTQ=YP-=2I5P#Wi0K-ZI(u9P)t7 z$vTk}g1u83M?i)R9FVO*KdpXd!Oa0G=h2)A3j+>8P&lI^iZ0Tb-hVmERZdJM_|le7 zgQXyFblLrOFndO{O58l=P?fHU|BQp9qWMZotAaW&ij>fiSbEVB4Fx>Qcd%Ljm6{!# z@Ti&In2~yox7?<2Z7Oe))Cy354=uO9PfB#lyB(6{?QK42Gndr*&tDSAWzt0- z7V5EQfbeu~6tLPR0ubLJKBv$x)W$(`W3Zrt32p>x4I2q5pP&Fmr>q$t3UmW>)>o~_ ztYK@lB9bY$iV6p0K25G95GZl;Sa&?ci;}6PcX1#C70|qARJBIn5~C{Z59A^>eP1X&rU?KjE{t0xD2Kszo;xX7YWr~;L*rl5+w zfxRhM5RnjBZz9J~IF!RxYy8rJDF$(mfxYA7X9@(AhJNt^CjoYg!IwjFh(bvG^{=dc zNwxrmr!_P1{4Yj8X;aa)09t~Ecm8SKE(mxUH`p`0=@BUe!tTbz|cqz|Ze z(MK4*`I@>lO*fBwn67VL)g%~K16wd3mx_9$xIjJDi{V80&!gTUSGhyGFzSL6om`Yl z0|p1xFO+|opS!B&eF{Ojl%p005U+LZxq1 zg_(?FF#nsDYdlI5a^WWXdIG}2C=6X=6h%G6)0C;1eBgl+xZL~ucU&-!c?~3AZzW&D zXDPM{05}1Rqov_HJp4|J6JRV7)i?S$!sG;6c#Dw zaMe`=Smv}W*H@F7s?7p7;9Y#a={r`fldj{z0Jw)ZZz~d+NAgRXI+!br!>jwK576)0 z`@}84*ErfwD3-(v6gMQoMqL01^0-DToAQH$jh0+lWQscmaN>s~A%|KqkaJr~-MYY* z!-&LNwIP|DGj>Udy`Jet=HBlbSuXL^K80|{oo#y08x*34#@U>@wXs~d8KHwJS z8tm$<@MN!2S&#K{e!uDdj_>~7z=2DbVA0E{f9=bu8D%k68k4saeiAm<=jqz}Nfz zq`o#;E*l|4qN6`vk)c7u3rM(1^aLRp7{uqasWHlATh=SDln~bTtmI+hyi!a1a~SK( z(*K2?sFY$05kS|}VIPx!rB$iGdPSyi%mo$`oE`6lEeL@N1s8DOw0EaUHBgcqcFS%shst|T0vEMWCLpYflMVa(#_jSHILZO@pfji=^ZlYjF+^M z)VIU2%hKfZ*TxB7Gbxk3jx%!HHWx1cclAW?p#0*popH5a1FHhkwZC~ZWOZPcIeReg z!Nvn&hpUU{(&jy;=ejwy#QMsW?0htpr2FseYxaZXj1D^^=tf+~AWk~dt z({@lsY-&a(7H6*1h_pIR#Orkv^TJt~vmf^t-ki(!dju{avi_Q4(VI~n^n5Fu_y`xt zuV=*@w1>OLAxRDULV4Peiv{nOyhZ~4zl7thoBL${smQ8OyiQ6W-EX)Y?LCo{EiSnn zxdw|8F9~;aG6tK55+rjAF5~s2|aqomAcl*NKf9h6#eu>H&3V&pCWQ`pAkxpKi{>q>XZ@HARd*wMy$$DOE(dnmWfwY0U@RD;cCw&snIp#nnu|q0g4`jY2%TYUtmtx=N6@d1;M`X87Z)Fu{?09PN%?I7^zDnYf$;_XO I+uWQkC`hXiNdN!< literal 5250 zcmV-|6n*Qe)T~;XOCbpz{vZe|sLxf+!-&0h$Dv4Sr%`ZLE{iTJM1N6jUPO~ zJK!xG1I!als(TRu0Sp!*vzpbhZl^`y8q}iuW zgeuMEoCfPGy9hgvxGpNMM9i$FaO)1LnSHj*S&g{IP$s~z3U&(T3`~59G;XxmAavO`v{b)%8B1yRe)$!s_{*%y0dz?%7WRzN`L|e>zMH{ul$9K^tNqFm)Pntl zWdD!>YlL8~0>XMsK$)2gag=8+n+Qz?tLIB)KU3qt{3a#D@;L)|j`=o138hwMtA8al zUSbjyX19Lx*R`F@%JyBiGUejGB^mdI@Z3=H7TKOHNQv`KR;+*C3yhXIe1NCPWU6(; zv3MkvRDa85ueu$b!?Xj9T0U*d)ArPIYa_J$ET#Th9SmXaF7}-q7X8D$FsCelCG+Iw zogNv`Y2=$*4_hYrumBUVGMHsCk+dUj2G1fMq~3Ql(%ikr$Q-w<9Trz1mz7yZ9ncnN zP{xMJg22q3uu8kM0ZT?M_YgWtebMjK7`FE#o8VT7bOqFxUNL^@~sV$*bj zFlu6&iJl&1B)_JRV8oJB*QLug#N`l($UK_U%G70f6n|TkmL^vE7pk`M!UH4Ic!2 zd;@>b!46={??gNe;dV5{p(nyHH}4Lru4gy8g?)8LWIi$HItMt^Q>K`ml9`WfJQX@q z_&IiNvrj~DHaUYzg8QA$>zru{@v8Xe?^|hU?K+Ii8%m&(1gRC^h8xL=tN5pHo;4$? ztUf`7sJ7jcaA21>N>ORj-w%jm7tW=&R8L#Ma<<4QeBIT-EkBSU^6934AQFMPErP21 zyNO{VLqDY=Xk99$em2DXnB4@303yjclkyiFU^%LWy)o-Lx0CqbLp2_LQrov@EfXx5 zZ~;0%=+$f$qPfC0DYvfW3u5AnF??pIKQ6LC6-+z$#~SRQ)F*vIE@*>8iqs!;=I(eG zTam9tnE*i1Ryf4QtN3IhvHr$qu1k+*0T$%@&ON9HImlrxX4nHF zX+n!eDrxP=K0TZ7D4%2SR)e9q2?z1#IqXXfYp}R>EwN$Mv>rk>YTTq|6ngNvrqxh9 zMBH}DR+D1k`8Oi;MGFa3sw!jo=6&+^@WFX;IU*#Tmg&s^QbXqWw*Sk-^7ix&4z@(t zt4@_IN5ou76nRi>HPk}=TQBPPd9IzVxl<8W5Ro9uFP{*rKHpC(2g#pl1JA65X=By5 zog3qEE&==ND>6c>B*0~tgUHl-)7cY(!M9WS#!et@E*KOuts1R87&j3NI4YMN$b5Ul z(03jm3lzKxgvxe2iJW?2qRY~J7bz_bu8{5`{2524itAM!W-0 zHLEIt7|Wr8PCP#WH@=z_?qk&fpFoY-gsy{(*47PMv&J$|EF@%?Ocy=y0D0=ctnoI# z^32`C_?OSLk~iYv;u0Ei4`R|=pGiq1A>scM!R_x-6N5eTbtA<=$TD?-om!wMCzvrx zbBtOCDPBK&V>@`7`M`an*w8)$@Ffw*Pu4dN<~HApEdkYG5mBzdms2{c7`~c^?)u=4 z>CITyh3Sq&FJxyDve#CQEQ$CU(GP6kr7k*Hg$&`cTUes$?W|$N>xXuGoder+EN^e} zN^^NI(>RKlHIpSyQ55G$n5lGw&_txvNimCq1@N@edU*FW;F=9ABtn&0rmKnieY42o z4JBy0{HujB2l`9XC%n@B4ie#e9nb-%W#QSAD4Q}+g~WdoFAWf`3-T@0zZr%z_q~)K zHowOj`^}85V8z&L6-wUH*Q~6&4gK)<1T11(6)&MbSZrR1ASUYTlG~PZX%oSs7J@}t zEb)HAQ*l8U;!4csj;>hfU}4C9F8lW|O$B5$gkfrL5_6os+q*^#oMUThP@cH*qRE$iOt&FfJD;J0vG=m&V%zWkFnbqvk z%M?!R45+Vm66a{d-B4~Jz8zzrCS;w65qNm7C-2juT^fvsDcC+tt|_v%_yl#M*VO%R zq!{h5St0Mt_jsk}e4ord4{ggqJC9?Cx$Wt#F{p^LM1|c(hV9yJRov>zJh`HqD+|m; z#=Js>{-plob9r5Pm5cvQxmL)#5)!G!TSZr<9PGwZmnkGhNmczt3J-n! zc4FKYD9ZVP>x33aLS>oeTP2F<6yE^N3YpTAwEB9YA|$w&$|=;U8pP=klTTEX1zwHV z0z*$emq5}KZCMcG;}^gVLN*^ zGNam#n=DhG7DSCp3T8w0lVgE}Y3y$AJ=U!Ao6{Q%l$&iI%Zo5V?D-*$I){uMDT?|E zz1CEOw%qL&t(?7t1$HvN;z-q0C;`i}Ap1!vB=Fc4Yg=)`X3u=+6hcV=adqTMHVWtA zZBY}h3Fzz~?1E`p$7V)I~Ed@}4c#=wzTPmJ6OQwl7*feElB6np2 zWhN_T45Nj4VgHct!C32-XO73jTg@K7Rga<6bAY=Lq`C6d}NSPiVObLE;V4 zXKdcfx2^8zAN&>Rqo6jj_lhBmu>`gI0U%T`OlA4k;IxT45AUP4BsnlJOKz3s@ET+9 z^Bh42YbY2omj+oC(LqsHY1?rcD*riu`q*(8GN}3a4NJT9FKTkMMp)mq8ktq&4@E`$ zC=Vcas+b{ZM$%R!3I|;$OL_SV6_gaS?UD75;veJj3`C47D>vp&2eGEW^&@R30}re| zkoj!XP~OMiVK_W;5W0X_02gS_Dom=tG7R0u8@K~@&<3UxR7ZOg{G&bXGk6TMP53&0 zgFtRb&n@C>KN|t%BH|6B7Emob3pD6OYImbU(mEiB{dnr)%J<#TvSL z?3-k#0%*_t=Q6A@28GRszk`RdeXEIHWechPsrom0#~J~@0Aes#8C$(}S^GZ#-u~%zF{Kj>!N1uz?_MhO z1^~l~`Yzd5A@xg!Y@cxIZy8LNG@Mg_EiZpJV@vt=&|<~5hc{Pb6oR<^E+RYX7}!-5 zG9&ZDT+*zPIq;hIgELH5mwmqxCSMPwoZHN9ED;;s8yyZ|N?M3T%`ObAeFUhA$8ofE zClmLk@|iOCQHAmp(50^y39j0jpV{9lVZYjnRLp>bCLhNOL1sYoHbvZO%!*({pQt2t zUl5YfPOdrrp@fMpJ!5Ep687`2Pn(3j4WT?Oh}d88%yZ#_u+~Pv*&aG-3x%rWb6N7_ zFsY1)$vJnxuNNnoS5mWA4&eW~DLGEFEt1SXQ_6(e(r{GN{?dZN&hKxD!~Q$%*%J|~;XC|`P+7LO=?Tf}Fdo9T z+>p;7ABMZKjRhR!Hm0S6ay)C@?--~)faFoRDcjAAC=U9{(z>5p9Z!#%jqC20!}KrH zbX2Lpev6ryEAwWP`5_&lyWi;K7r#}IY6=FkxbsKd-f^&GtxNF*BuY>WP54)ajwKS4_|u z6zxm|+cwrR_eG@-BGIDpq#4Gvv;2^%A^jjsj8H__e>0X7q5gnw5Wdch*64=0u^np%yq ztMni};#r7Mp>h}1N|7mF3Mh;xv-hku4gC4KEaf~`Qc;C>xK%t@w2U^I)6-JIWR&0m zm0Y<*J>vU?n7sht6bPGm)cv{r1fml2fBguW%psb=T3n2~JQw)B0iZdLg_8>fS53lD zdR(G-HjYnVsS|*C1Sn2V1>U}7LEb9vho@RIZBLl(j8|nGo_MKoGF+3$D@|{SDM*d87pE1Tq@%uWW=%jKTV>T*_hj?J|5f<>jCv242vldx# z_I0KjIbPZW>|z{7R;z*W;<0=D9iFllk43jOO`ve?sM?VCohNxH87@J&v8dM@0!|K! zA}C)xQ0tMDQg04_T>C#9bDHZ`-oVmwE8#3+R9>uq9|N;_4kb9Ok^4Ngc1m%D$I7D0 zd{R}jNO{wQa&_!;5TBZV&E~Z%&d2lYg}Nv^cK$Yu4<3UX2PXj|rs7Z}ByRiH!1aHz zZMelC#7Y6{V7dR?=&uIb$K$48F1C{G97fNGp>FuZ(Q2CN>4wQLBS;FIY2?jj8Pivt zwbMZk0n6#f<$s1+sPu|sjj!4yPHpR>biC!jXjF9bg&B0u8Pc`eDrsPGo^dnzl-kav zVWbnXQ-F*}YHh?qynfC43d!J#xcWsZ?>fv+r@^D{R|bJL(>T>m#rW?#BJr8Tfm`D5 zA4g8wbfG~$OT7rT?eSm}``w}EnB4N>)A*rb-_|$OBe3yi5q{Du)-AM3Ud%+c^G`u< z+j>y3A-Mh;gVk4FL z{|sOrX%+rt&YTYJS3Xa)7=ml zZKHzY!jf!B8C|zFAwk~$1>w&#TQ%H1Z@myQHFHU^ zQ|D^T{}H>8C-f zK$O_*wz{t2Jbz0ai^2ce1oEAgBocZ!^}MO|t2YvbdWM7Jsx6FCbyj2_#Eh$MTLew1 zWjoOlyf_FW?_cdMz&@s}f`-*6r;WY;i>LSgbB zv)XjQ+WNJcw%tUNO6NFjM~lap>sUxhOn_@UR*;`Tq_@+J$Ff#3u0K!@juyyTj#fv- zU~D9v))~eGlEc4>LBb8mM~N-8t8P3;g3b|g@1xQJCkTYXS4FkhDZKV%xM#cve>j_` zwOiI%p5zz~Ji-3U^SGMYcorHK|5?075;f*1Bkk^@1aDOXd-2|+Zh$mV_VOBou+NI? zy4u7i{h{~w53;f?0n9n5T*$IGy=#J%v#tjCEtNnmdS`$J|10TL^OiGCvy~u#<06&G zhYAU#Ob3jrZ^Ibe@B1w%ygvsO(&~mn4&&o-S>;+XSbZqH&;r;PSE#CW<+InBr^G(7 IeX+H@0}cNf+yDRo From 139ecca07939f5fec2c66a4cf452d8bd6765c8d6 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Thu, 31 Aug 2023 09:23:44 +0200 Subject: [PATCH 45/67] Circuit: Add enable_zsa flag (#79) When enable_zsa flag is set to false, it is not possible to perform ZSA transactions (the circuit will fail). Fix the version of reddsa (=0.5.0) because recent versions required rust version 1.65 or newer Fix the version of tempfile (=3.5.0) because recent versions required rust version 1.63 or newer Limit the version of flate2 (<1.0.27) because recent versions raise some clippy issues --- Cargo.toml | 4 +- benches/circuit.rs | 2 +- benches/note_decryption.rs | 2 +- src/builder.rs | 4 +- src/bundle.rs | 28 +- src/circuit.rs | 70 ++++- src/circuit_description | 441 +++++++++++++++++++------------- src/circuit_proof_test_case.bin | Bin 5250 -> 5251 bytes tests/builder.rs | 4 +- tests/zsa.rs | 4 +- 10 files changed, 359 insertions(+), 200 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a0929100c..efcc06945 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,9 +35,10 @@ hex = "0.4" lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } pasta_curves = "0.5" +tempfile = "= 3.5.0" # Last version required rust 1.63 proptest = { version = "1.0.0", optional = true } rand = "0.8" -reddsa = "0.5" +reddsa = "=0.5.0" # Last version required rust 1.65 nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" @@ -49,6 +50,7 @@ tracing = "0.1" # Developer tooling dependencies image = { version = ">= 0.24, < 0.24.5", optional = true } # 0.24.5 has MSRV 1.61 +flate2 = ">= 1.0, <1.0.27" # Clippy issues in last version plotters = { version = "0.3.0", optional = true } [dev-dependencies] diff --git a/benches/circuit.rs b/benches/circuit.rs index 03868a418..f26cc3507 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -28,7 +28,7 @@ fn criterion_benchmark(c: &mut Criterion) { let create_bundle = |num_recipients| { let mut builder = Builder::new( - Flags::from_parts(true, true), + Flags::from_parts(true, true, false), Anchor::from_bytes([0; 32]).unwrap(), ); for _ in 0..num_recipients { diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 6bd6fa10f..ce051cf03 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -47,7 +47,7 @@ fn bench_note_decryption(c: &mut Criterion) { let bundle = { let mut builder = Builder::new( - Flags::from_parts(true, true), + Flags::from_parts(true, true, false), Anchor::from_bytes([0; 32]).unwrap(), ); // The builder pads to two actions, and shuffles their order. Add two recipients diff --git a/src/builder.rs b/src/builder.rs index 06b8a431a..bae73569b 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -947,7 +947,7 @@ pub mod testing { /// Create a bundle from the set of arbitrary bundle inputs. fn into_bundle + Copy + Into>(mut self) -> Bundle { let fvk = FullViewingKey::from(&self.sk); - let flags = Flags::from_parts(true, true); + let flags = Flags::from_parts(true, true, true); let mut builder = Builder::new(flags, self.anchor); for (note, path) in self.notes.into_iter() { @@ -1068,7 +1068,7 @@ mod tests { let recipient = fvk.address_at(0u32, Scope::External); let mut builder = Builder::new( - Flags::from_parts(true, true), + Flags::from_parts(true, true, false), EMPTY_ROOTS[MERKLE_DEPTH_ORCHARD].into(), ); diff --git a/src/bundle.rs b/src/bundle.rs index 2e5d5a034..23beb4a86 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -38,6 +38,7 @@ impl Action { cmx: *self.cmx(), enable_spend: flags.spends_enabled, enable_output: flags.outputs_enabled, + enable_zsa: flags.zsa_enabled, } } } @@ -57,18 +58,25 @@ pub struct Flags { /// guaranteed to be dummy notes. If `true`, the created notes may be either real or /// dummy notes. outputs_enabled: bool, + /// Flag denoting whether ZSA transaction is enabled. + /// + /// If `false`, all notes within [`Action`]s in the transaction's [`Bundle`] are + /// guaranteed to be notes with native asset. + zsa_enabled: bool, } const FLAG_SPENDS_ENABLED: u8 = 0b0000_0001; const FLAG_OUTPUTS_ENABLED: u8 = 0b0000_0010; -const FLAGS_EXPECTED_UNSET: u8 = !(FLAG_SPENDS_ENABLED | FLAG_OUTPUTS_ENABLED); +const FLAG_ZSA_ENABLED: u8 = 0b0000_0100; +const FLAGS_EXPECTED_UNSET: u8 = !(FLAG_SPENDS_ENABLED | FLAG_OUTPUTS_ENABLED | FLAG_ZSA_ENABLED); impl Flags { /// Construct a set of flags from its constituent parts - pub fn from_parts(spends_enabled: bool, outputs_enabled: bool) -> Self { + pub fn from_parts(spends_enabled: bool, outputs_enabled: bool, zsa_enabled: bool) -> Self { Flags { spends_enabled, outputs_enabled, + zsa_enabled, } } @@ -90,6 +98,14 @@ impl Flags { self.outputs_enabled } + /// Flag denoting whether ZSA transaction is enabled. + /// + /// If `false`, all notes within [`Action`]s in the transaction's [`Bundle`] are + /// guaranteed to be notes with native asset. + pub fn zsa_enabled(&self) -> bool { + self.zsa_enabled + } + /// Serialize flags to a byte as defined in [Zcash Protocol Spec § 7.1: Transaction /// Encoding And Consensus][txencoding]. /// @@ -102,6 +118,9 @@ impl Flags { if self.outputs_enabled { value |= FLAG_OUTPUTS_ENABLED; } + if self.zsa_enabled { + value |= FLAG_ZSA_ENABLED; + } value } @@ -116,6 +135,7 @@ impl Flags { Some(Self::from_parts( value & FLAG_SPENDS_ENABLED != 0, value & FLAG_OUTPUTS_ENABLED != 0, + value & FLAG_ZSA_ENABLED != 0, )) } else { None @@ -607,8 +627,8 @@ pub mod testing { prop_compose! { /// Create an arbitrary set of flags. - pub fn arb_flags()(spends_enabled in prop::bool::ANY, outputs_enabled in prop::bool::ANY) -> Flags { - Flags::from_parts(spends_enabled, outputs_enabled) + pub fn arb_flags()(spends_enabled in prop::bool::ANY, outputs_enabled in prop::bool::ANY, zsa_enabled in prop::bool::ANY) -> Flags { + Flags::from_parts(spends_enabled, outputs_enabled, zsa_enabled) } } diff --git a/src/circuit.rs b/src/circuit.rs index 9d550e5d2..d88bfa2a8 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -27,6 +27,7 @@ use self::{ }; use crate::{ builder::SpendInfo, + bundle::Flags, circuit::gadget::mux_chip::{MuxChip, MuxConfig}, constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, @@ -79,6 +80,7 @@ const RK_Y: usize = 5; const CMX: usize = 6; const ENABLE_SPEND: usize = 7; const ENABLE_OUTPUT: usize = 8; +const ENABLE_ZSA: usize = 9; /// Configuration needed to use the Orchard Action circuit. #[derive(Clone, Debug)] @@ -231,6 +233,7 @@ impl plonk::Circuit for Circuit { // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset // Constraint if split_flag = 0 then psi_old = psi_nf // Constraint if split_flag = 1, then is_native_asset = 0 + // Constraint if enable_zsa = 0, then is_native_asset = 1 let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -267,6 +270,8 @@ impl plonk::Circuit for Circuit { let psi_old = meta.query_advice(advices[4], Rotation::next()); let psi_nf = meta.query_advice(advices[5], Rotation::next()); + let enable_zsa = meta.query_advice(advices[6], Rotation::next()); + Constraints::with_selector( q_orchard, [ @@ -318,11 +323,15 @@ impl plonk::Circuit for Circuit { ), ( "(split_flag = 0) => (psi_old = psi_nf)", - (one - split_flag.clone()) * (psi_old - psi_nf), + (one.clone() - split_flag.clone()) * (psi_old - psi_nf), ), ( "(split_flag = 1) => (is_native_asset = 0)", - split_flag * is_native_asset, + split_flag * is_native_asset.clone(), + ), + ( + "(enable_zsa = 0) => (is_native_asset = 1)", + (one.clone() - enable_zsa) * (one - is_native_asset), ), ], ) @@ -942,6 +951,14 @@ impl plonk::Circuit for Circuit { psi_old.copy_advice(|| "psi_old", &mut region, config.advices[4], 1)?; psi_nf.copy_advice(|| "psi_nf", &mut region, config.advices[5], 1)?; + region.assign_advice_from_instance( + || "enable zsa", + config.primary, + ENABLE_ZSA, + config.advices[6], + 1, + )?; + config.q_orchard.enable(&mut region, 0) }, )?; @@ -999,6 +1016,7 @@ pub struct Instance { pub(crate) cmx: ExtractedNoteCommitment, pub(crate) enable_spend: bool, pub(crate) enable_output: bool, + pub(crate) enable_zsa: bool, } impl Instance { @@ -1015,8 +1033,7 @@ impl Instance { nf_old: Nullifier, rk: VerificationKey, cmx: ExtractedNoteCommitment, - enable_spend: bool, - enable_output: bool, + flags: Flags, ) -> Self { Instance { anchor, @@ -1024,13 +1041,14 @@ impl Instance { nf_old, rk, cmx, - enable_spend, - enable_output, + enable_spend: flags.spends_enabled(), + enable_output: flags.outputs_enabled(), + enable_zsa: flags.zsa_enabled(), } } - fn to_halo2_instance(&self) -> [[vesta::Scalar; 9]; 1] { - let mut instance = [vesta::Scalar::zero(); 9]; + fn to_halo2_instance(&self) -> [[vesta::Scalar; 10]; 1] { + let mut instance = [vesta::Scalar::zero(); 10]; instance[ANCHOR] = self.anchor.inner(); instance[CV_NET_X] = self.cv_net.x(); @@ -1048,6 +1066,7 @@ impl Instance { instance[CMX] = self.cmx.inner(); instance[ENABLE_SPEND] = vesta::Scalar::from(u64::from(self.enable_spend)); instance[ENABLE_OUTPUT] = vesta::Scalar::from(u64::from(self.enable_output)); + instance[ENABLE_ZSA] = vesta::Scalar::from(u64::from(self.enable_zsa)); [instance] } @@ -1167,6 +1186,7 @@ mod tests { use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; use crate::builder::SpendInfo; + use crate::bundle::Flags; use crate::note::commitment::NoteCommitTrapdoor; use crate::note::{AssetBase, Nullifier}; use crate::primitives::redpallas::VerificationKey; @@ -1234,6 +1254,7 @@ mod tests { cmx, enable_spend: true, enable_output: true, + enable_zsa: false, }, ) } @@ -1314,6 +1335,7 @@ mod tests { w.write_all(&[ if instance.enable_spend { 1 } else { 0 }, if instance.enable_output { 1 } else { 0 }, + if instance.enable_zsa { 1 } else { 0 }, ])?; w.write_all(proof.as_ref())?; @@ -1344,8 +1366,15 @@ mod tests { crate::note::ExtractedNoteCommitment::from_bytes(&read_32_bytes(&mut r)).unwrap(); let enable_spend = read_bool(&mut r); let enable_output = read_bool(&mut r); - let instance = - Instance::from_parts(anchor, cv_net, nf_old, rk, cmx, enable_spend, enable_output); + let enable_zsa = read_bool(&mut r); + let instance = Instance::from_parts( + anchor, + cv_net, + nf_old, + rk, + cmx, + Flags::from_parts(enable_spend, enable_output, enable_zsa), + ); let mut proof_bytes = vec![]; r.read_to_end(&mut proof_bytes)?; @@ -1533,6 +1562,7 @@ mod tests { cmx, enable_spend: true, enable_output: true, + enable_zsa: true, }, ) } @@ -1573,6 +1603,7 @@ mod tests { cmx: instance.cmx, enable_spend: instance.enable_spend, enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_cv_net, false); @@ -1586,6 +1617,7 @@ mod tests { cmx: instance.cmx, enable_spend: instance.enable_spend, enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_rk, false); @@ -1627,6 +1659,7 @@ mod tests { cmx: random_note_commitment(&mut rng).into(), enable_spend: instance.enable_spend, enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_cmx_pub, false); @@ -1640,6 +1673,7 @@ mod tests { cmx: instance.cmx, enable_spend: instance.enable_spend, enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, }; check_proof_of_orchard_circuit(&circuit, &instance_wrong_nf_old_pub, false); @@ -1672,6 +1706,22 @@ mod tests { }; check_proof_of_orchard_circuit(&circuit_wrong_psi_nf, &instance, false); } + + // If asset is not equal to the native asset, set enable_zsa = 0 + // The proof should fail + if !is_native_asset { + let instance_wrong_enable_zsa = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: false, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_enable_zsa, false); + } } } } diff --git a/src/circuit_description b/src/circuit_description index 7a9d35f07..cffc54ff8 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -1002,6 +1002,93 @@ PinnedVerificationKey { }, ), ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), Product( Product( Product( @@ -1146,7 +1233,7 @@ PinnedVerificationKey { Product( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -1155,7 +1242,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000400, ), Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -3764,7 +3851,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -3790,7 +3877,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -4008,7 +4095,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -4569,7 +4656,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -4595,7 +4682,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -4813,7 +4900,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -5312,7 +5399,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -5328,7 +5415,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5339,14 +5426,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -5355,7 +5442,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5647,7 +5734,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5673,7 +5760,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5875,7 +5962,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5996,7 +6083,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6148,7 +6235,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6235,7 +6322,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -6251,7 +6338,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6262,14 +6349,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -6278,7 +6365,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6404,7 +6491,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6430,7 +6517,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6648,7 +6735,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6785,7 +6872,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6953,7 +7040,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -7037,7 +7124,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -7137,7 +7224,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7149,7 +7236,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -7165,7 +7252,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7177,7 +7264,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -7282,7 +7369,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7294,7 +7381,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -7313,7 +7400,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -7330,7 +7417,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7342,7 +7429,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 17, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -7362,7 +7449,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -7557,7 +7644,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -7757,7 +7844,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -7867,7 +7954,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -7878,7 +7965,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -7977,7 +8064,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -8003,7 +8090,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -8118,7 +8205,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -8153,7 +8240,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -8287,7 +8374,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -8322,7 +8409,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -10684,7 +10771,7 @@ PinnedVerificationKey { }, Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -10790,7 +10877,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -10799,7 +10886,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -10816,7 +10903,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -10825,7 +10912,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -10921,7 +11008,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -11341,7 +11428,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -11709,7 +11796,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12054,7 +12141,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12399,7 +12486,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -12939,7 +13026,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12949,7 +13036,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12960,7 +13047,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -13095,7 +13182,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13105,7 +13192,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -13116,7 +13203,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -13251,7 +13338,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13261,7 +13348,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -13272,7 +13359,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -13359,7 +13446,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -13375,7 +13462,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -13475,7 +13562,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -13566,7 +13653,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -15156,14 +15243,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -15183,14 +15270,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -15209,7 +15296,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -15250,7 +15337,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -15767,7 +15854,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -15886,7 +15973,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -15898,7 +15985,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -16012,7 +16099,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -16130,7 +16217,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -16139,7 +16226,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -16147,7 +16234,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -17543,7 +17630,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -17673,7 +17760,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -17779,7 +17866,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -17989,7 +18076,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -18001,7 +18088,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -18131,7 +18218,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -18142,7 +18229,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -18498,7 +18585,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -18509,7 +18596,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -18860,7 +18947,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -18871,7 +18958,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -19204,7 +19291,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -19233,7 +19320,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -19699,7 +19786,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -19829,7 +19916,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -19928,7 +20015,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -20033,7 +20120,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -20138,14 +20225,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -20280,7 +20367,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -20438,7 +20525,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -20553,7 +20640,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -20674,14 +20761,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -20963,7 +21050,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -21121,7 +21208,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -21236,7 +21323,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -21357,14 +21444,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -21500,7 +21587,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -21511,7 +21598,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -21669,7 +21756,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -21784,14 +21871,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -21905,7 +21992,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -22026,14 +22113,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -22304,7 +22391,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -22589,7 +22676,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -22832,7 +22919,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -22953,7 +23040,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -23195,7 +23282,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23207,7 +23294,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23353,7 +23440,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23364,7 +23451,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -23768,7 +23855,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23779,7 +23866,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -24178,7 +24265,7 @@ PinnedVerificationKey { }, Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -24189,7 +24276,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -24570,7 +24657,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -24599,7 +24686,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25129,7 +25216,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25275,7 +25362,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -25390,7 +25477,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25511,7 +25598,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25632,14 +25719,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -25774,7 +25861,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25932,7 +26019,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -26047,7 +26134,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -26168,14 +26255,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -26409,7 +26496,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -26519,7 +26606,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -26586,7 +26673,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -26659,14 +26746,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -26754,7 +26841,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -26765,7 +26852,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -26875,7 +26962,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -26942,14 +27029,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -27015,7 +27102,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -27088,14 +27175,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -27270,7 +27357,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -27459,7 +27546,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -27606,7 +27693,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -27679,7 +27766,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -27942,6 +28029,15 @@ PinnedVerificationKey { 1, ), ), + ( + Column { + index: 6, + column_type: Advice, + }, + Rotation( + 1, + ), + ), ( Column { index: 9, @@ -27996,15 +28092,6 @@ PinnedVerificationKey { -1, ), ), - ( - Column { - index: 6, - column_type: Advice, - }, - Rotation( - 1, - ), - ), ( Column { index: 7, @@ -28402,7 +28489,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 16, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -28762,7 +28849,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -29006,14 +29093,14 @@ PinnedVerificationKey { ], permutation: VerifyingKey { commitments: [ - (0x3b61bede3f87e9208caf3626fbe7a645e1b9f9b241a96160c68b708196e86cbb, 0x0932e9c67d6bb593c9b3d6bd9697efe79bb2f81bee35abeaa8a2a0a828d8fcc6), + (0x26d7150d98acf5efa7739440641d97629e2d6553547920432e43d747b998d49e, 0x3223285fb44e1736e7216cd51276087bce39f7e5c0fdb1ef49ab4c6de26b256d), (0x07800024b352149368405f222a8dfbf373bd4603df89929a5d00f7ac9ffac504, 0x250be8a84de9a8ded91e85860f1b1751f6bd2c0aba96329ee2d6f0e377f4679f), (0x3384b0dbfa6553ad5adf0b218df2cbe6243c33102a97774b4e023ec1dc2d83e9, 0x2873fe49458cd70b9d72419e0d6a6ceadb8070f4b62a0bb47c58a89269e0b583), (0x38def0fd8f233ef8651a28ffb7ae6f1e4eaeb0acec19453a3e5a0d70b2058782, 0x0512c67736284a225f0b6617cabd76ac2e4a6805940af4480798ca884e02d277), (0x26b6d69fd8c13013c6ab5fb74bd3fbe85d01b0abb57e149ff53e77a535c6bf40, 0x05ae4f52e4ab72ff3cf2b64df6d371fda270f4f78ed0bccce8e3138d4e30e4a0), (0x3f1b6f3ea5a2b24646dbe1c6f7c7dbf797fe6602a344bed59668ba5413519631, 0x0401a6f6ed893aa112f234127f8c30ee6e09b45f75993351aea9974389b261d6), (0x2f34843015cfc9c9ff59c7ecab3cbb6aea69dcf6f5af79e166f25d90f70353d5, 0x2bcfde5880412d171705b41124b404a323697c4d1008b2e8b2bf9966e5809d3d), - (0x1241f0e0058575ff769809aa569ab0ff12d5b2d7d840eae76912c16433be00ff, 0x33339365e1edbdb387b0a0b7dc5a9212c0313bb0a131c9302bc57db36174f3b0), + (0x082e9af26adc31f97c38ce587ffde9af5d8238d16ad61a236bbd3c805515f144, 0x051d36eb85b6402dfb2a55ae1507b358319d016483d7ecf6be49793bbb64e79e), (0x240a361e73afa04a2e5cc578680e54bf28e3375dbb35a8918c3cdbc91f1bc25b, 0x161c53e65c1b6500b576d8fa982e2565dbe35954840b0bab8a3d912158b9dbe7), (0x32f883bbd63b0700f0150ea8d71f6f5d7cdcc4463289983d71e9bc104d4a5c28, 0x33aeb42bec794138b8db28696bd7cef4946a8a89edcbf3f8289655ff9f9129ee), (0x03f33d3064517ab1a8e538444013bd0d6b011f9923f8cb964763a88d6d7409e0, 0x16f534b6d12d9e011b951e374982f048f0bed808099fd3ed97cd827360f6fb65), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9005e06bc0beb164cc041c00bd0ac8707ebe8da9..83ca7c0535ed0da94d2aca22e3f9553b7fad9eed 100644 GIT binary patch literal 5251 zcmV-}6nyKj1esTLWzo`!#FWW>`$LZ4Zb8Ft$j$i9+^b#cX+$C{=(0V3(pxTqGUp`C z>IpUrx8Yw#5{=jwx6#p`URpGV&GB__Owr2y@|vyzXK9-ll8?qe5nqoKT>P{qF*}D`00RVJ=;WN#A5~J{u70pKhVyG}`5|FJ!C-qV1+K8D8x+$#hM6+0+ zIB4nLyta7FBKlnl*65=p^NyCT_<(HI5S10rJjMqG+?(oT&PS~MFUW_&Z$Ft|uEKllV$au8!$mhh#rl_fQv}Vgv)m1GuP*1LhkW69~*xs1_X1mKKJP`(HaBe zMffwL=Tq2da*hW4LNJ8}PIP8LCNCzN=d5J@^^jH?SP)9*?D%XWA{(GF)<)sB6Tw*lihy5+Nv zwNoy(`!dtlKf6lyAJbKEN&RWHgteu!aL>P6>NxVJsfx3M2+b4`KZxP)k3PbqO7^(I z(>WPi(NfB2#yf_|SUNPraBCsOv`hg8*D7Whx|x<4oQAsMa7}A9$qwgs{T7(0Xc&m3 za@=dth4V0Lx9U?l)-=WtV0ds>_Y6N9Pdu)QvBf1>TLe)gQepo2+jAO>l7-113ZYo3 zKluK~p;D?{8QmzHT`n7xn6N|Ow{jpjDxFm|B&c96ApDDJ=*2ncCVZGKjkoc=%b-&$ z*VVaM^$%ti)q05+MzzlVb*$3!sq;=PhlxbqZYs~QF@MzC#gPlnNFmJ6C>Hv;KD&Hql;40_Bmb@vQ5tY2Ur3G@_A56Up$9b_BBAwj zbGcj?)(Z%+vug1RP}{tF7kQyTp$QfUtlThyoMm8CT=@T&S>MR9IPOHRNIr zf2kU(>}u;C>kdN$?VO&s-FmYVwq+jP@}>`L4=R?46<%G?-?w8bSy?akDEuhQHd2*G!-a$TEIwlaf0PSy?Qz05k`5r zCz-!FiQd_B_N`9c;j>t=@#<$m@T_4nI>JX*OS^ks-MDls=#`!bh|5`SxPloD#XHH# zAdXm$tNviKxtP|mkpjJN+=5mt2l+YE^Z?&^x!7XiF<&mpS`d&_h+DpT6*=*5boMIF zPC4zwOiI>It3g9Dn1E@EGVs$onNTb5$TtjMS%!$#2IdunoG)^W`d6C+H@n`T18zBn zSm7Hi_z&i+b&l1%^k2r3F(huq^CJBLd^6h-383(Ye9=bo4<{VoGq}>Z_d$ zHHg8#EYt9A&_|5E*x~Raw6cp{8M}bo@2D-R8NQ-Ob8SWXrHRaOCI(AWt%XABr#m&T zNh~KFWkY~H;m|(8TaYX@faA&~qGL~ZE5!lq4Fj@ungYm%dd>FXG_>!V^7-PoI=MmM z9`9_Wnv{RcL@*epT(@}@!Z{ljt>kbWo%w{SNp$`zIMU6rdwP(~w=Kp}>EKNT+fI6_GQeUyldm2YFC9p57e_@Ae#V8QCa z@E`&-BgL~oi!7zID*jTbpe_0YM|&6+j!Jb#jdI8V)&Z=-p;MvUJgq!_F{e%3?MS=1 zNruucRuFC;(4KtD&=jV}g`KbSFf<)B*e!~#Zye~kRhFbi7FY_AI1DQ8bM&KXVfu9MSr0p>L2K{2eU^IG|ahN_Mz>Ic{? zLmvAW&L>KiE$m0=Smo@={131G+We6qpLP{H!b1@B@t`pLSwCjTb0~0-wr^qL4?E|% zUv#JdbXlx6ngS-#&<27{@c;VBU`+rujeNbqW)ssdY4iLb2z|~kX@LFZ$oTis=28U> z_eV15I>hnH=^~I4)=e3+2x|(Cx%c^-7+;KB1u%gr^&Mk^I#di({4M4>0ZsNc%3OYa zt`-Sa=b>EsPtD%$iIE?5Re=LdDO0TqR1nk@OtG2HY-YY}~TLd+%lS z=kAQH5db>_-L=Gg3oE6tB%TA0M1XLCDKS96N%~xbf`i$-j|7?-=7O!%r6<=O?@lMv zj^b(S?!n9;A!51L zU1pD&P#mCnh81B(rEUmAPW@CtLH)!k#m%z%Tgl=fuDX8z zoW!WPUVKz=;06*0{093NP9Su+b+j4=(jC&GX*I-F?pjrcb0ub+rwIm78wCaZEi$T8p9?9!ELIoK*N}qVp@$^silKLM2F*divX`7j|Aa`n?opMxg za0ETg=>IQiS1EcM&G8KkCxoG}Ycim$FX4LH(hLz_NB|b=Po7~utnxdCL>tVeInt!+ zxmmw&#Jd`Mnxk>@dMySDsv<=HH|A-vZduK$Ir|5ftK`FZ4a?}U5X!LS9uxJ1ho<~L zjZc99b)(exOUBep5^UZ(EbQgDw}rDeBOUnT9@sK4hV0nfVWtLwq+g5T6*p=v)Tm`T zUC6LLDmp__K4`;cR*Gp*4<^}n3RbW{b_RF_SpkuWr1;2Yi3=(IDD1)cQWh(ZR-7qWO~U@(W#>ku_DPQRVBVSkbUhB=CP#4C>xukUr;! z=_X$nyYp8l<0G+PGg53_e(?AU^d#o7uml0x*PQEDrZsL*#W>~F`xpCP7}0s^Yi(zd zyxft9IrR%#J2A6v@TLiL3KZObwmi7Fnnr$Tdvl77+kCOISW^)db~kT+>aLO36*(bQ zY$Dj$FM9ljk3Rvj>O9&&n3Z6pS6qky985?ns?DKtb}!uq4IY5A_!Mt~>%ykC&OEun zt$4q5F$a~el+e=dIy`mr4tA0&!lZmfB6p-gx<89vpCIw;KtanxcCvxRS1P{ojr9hv zjByDL@zX|Q?`6`!e{Z={aiBEkU;*#18a&;WGKNeb{t$Bjj_wId`CcL{r>^s%HGkoK zWjDim!9V1Utmp%kaq28$hxlpbErpyeWvd*(!4JkKv(8qt^)(!h*z93R7^MmqgbA!_ zcIhaK@+y|9T-@$!s3g%j!xhe#>k|)5}eZ_ z59*L}S?UHE)T%SY2Jz8UZ4}lfO&=uXd({p-#+7@sJA~E|CpKSfTP#%>49l1v2sNdr z`6T=(ja`LnOB1rlxc6i+tT`U{ET_o}urnkCPM;dU)e!^)HBCNMU3Mzo<7d>wI^B(= zAqa(Vx{}M`6I=BMZ6BqIgCK%dFUT3rRCMm?BZ5(XRJuMR2YY?z-H7Ek~jp>~uA!OHAbw8VfMzY_;)w*$R^j-4cDi z!-j_Z+_3J^DtKSr*Tn5@ROsI;hI;aWIjs5R*n z#JQiViDu7nSuQO*lLWrZ62coO<@!>d>dv?gWT1-a_IM#q(jTGPbQefd7n}l8jl+x} zht8wSN{EAn7y^r(8_>OxiL(Gt=N|UmHEID=VriHQbsRAPQqG0vq+=J{-#xxmJTYL{ zd^MOkxKcg{23T6u+zqhen&deUFE)vBIs&E|uE}4lS_K;BixvY z_9kl=Ocj*HmDNCamX`Ds zxWPeS8{m1!hv)Ani6Q%eG#~$=I2HcF|F^3IwIJK4Aavoc%7fgd^UfBbs3++&`JF~w z+N-Mq;z&|9)KKy5GHaUKM>Zj8>WIg5w6f4ft2^rgi?6^u9t7p;}3^P>@@HXLMO+f zOi85<-JAYIp5PhQf_YZ8TZG$%_4<7jhrkLJSR?dA|4k7KIP>{Va7t(_(xSQ%|EtY$ zvrwgaBME-tMGnM?66tm2jYZ??GeqLHJ4M@HMKQ5^zs7%W$2Tm7Mjx{KXKME^Tw%mhkXtl9$m#VuV({mE=@ zPQ)lU+zXJ`Raw5iFPmcQ#6om_x27oQ>-<2e^`(m47c5fK7z*%5@k;1(v%a~iIT?(+2O&W(yGwe101wcIMAM9$N@7%{$%8KJ9O|cD< ziwu}JW4E!bWi*SEX;|X_{_0owuIP^>1F@kSrlleejb~D#*)&3JBu%|ppNj{r&M138 zZqSYeFADKk?mk5R*s;jw?AUSDV(8L*`?=m-0)IkEI<%^?5x7aQl!K0VE~t8+Z3YCQ zkx5W`-IwG6pKSXS@50FQ69U~Z#mJ`q{oxrXr`VXiw27=TYbtZoYBJ*Xb5Q^lB(5kq z8_=D%4C~^mP>{GUFn-J}Vek|~X03w>S*XiFaH#B)7z$Wa&qMeR<-8ogJqKGCMMMfi zzZm6fRM7ErCl?v@fcG8z`*Obn-(9|-Q7lwnWXlT!nUF84eFZl zdNQ>kg(h%k*^TQdavqA6)qSZrOqBYN(`Q3hO%OQf5b?1ymZ)jr$YQy4x7gddqqH7O zH>4K~`FF$z!w-BM02$bAD`M+i`s0J+L8JIup!T=4|2f5s$RvbK;IUl5Crk`|cmajs z`LiC5IlDw8n=wrAA)KEe_rsl*3->}3Q;}mt{c-40VYVh5BE=(uU0yX_aw9^aSL(QL z-g$3=|En>#nH>i<>Y3u_c09nF#)G+E90qNTSL1%fL_Fv-V}W?_r4@XagKM|-u;#pA J7OYxF0|4IM93B7w literal 5250 zcmV-|6n*O$b%uAr8c1>lt|YxRlS%)5inZ>xx&|y34|KR0(y}7Xq`pT9lNC7?GDP7s z+^*;IT!_k_)U!zZsRdo76lbsRA~k~!qsWFg8PUqbz?e% z`}K;frG46z7Qk{r4+V!4Vc2zVj?4Gl3pTC~oO|9st&1c{JXrQ=EwEPC8P z%jf>txRKAlb)TqtwmJ{K4Z_y}?C5tjLb{;MgxXy^dlh=lyeP`cPsmgGSnae(VB4QO)T`V zunAM0n4M>?x7xSpIyTql!VSxp0FfMw+n+(|r}0J_uEoI2mQSS)09G^h^jC@;x2 zlBCnq(MUnXv?xK-kLYBn%$0qsN7xhp9rDGE_w@hLWIM{dRk0|&iebihon1+XM@T5J z%hQqr$u7r4xmA+HB2i}8v~9R@_R%$$mz4(D$vVb9AjJPRUW^Kdr7=LTYb^)Ac97+K`0vi%{%jGOP59sjKM+DS|&+8Xl2^%XBg@Xi{s@k*`Y6%`48>wFhCsP$Dpw z6C(=@jBRd|>fCi0mizdj6~qNyNs`6>Jujc&Whu|UF=mh;tdhJO`E zJ&M7y%1Kgt7b+`3#X=|1}lga2RHsuK{!3*cr+B?lACg|wNL#{_<5r*Sq@ zgn8;KL%-NsHdDN)3tP(fiF}I2qC_mF!9_;OH2vlT$a`0QcfY4N-(A13VjGSa(%2s_gq%A$CzZ z123v+tU+a^F9b&^1`<|{92=No9CzNKp3&8r;FN(nR#U`mF;oO+DGI){oaZ=5Bzd-% zyGj&LX#ob4%WuxC@?zddG6s{t7}H876xn(XVLY+W+tT+gkOIG*tJ9bs20I3m9iX#> zJUdNq|8FpXq}4Hc!d^h!-5dS`C2oQ)X-ds+zEV*>7=VDdH5P7V?d=g*;^G4l+!L*) zr8psb0S`#uH#HrLHO6`Wy2(-AMrz%y64OHhvB5-@j@#4oY}r3*r-n{GGM9zQ+kWwk zJ-tVLLh-#%235@YBsRac-Dt!ddmMK}FWfG{7Jf8;tUV^XeI6D|O*UaIJnT~vP73Vo zbq0y{J>FsL%&b`x)0jz%!*&!REsnJG{5`IAd-BY>q8(F9JGuJmiomYZgJ;{ws^TyN z2&$n>C8c_eS~J<}D48KcH8pEmJb>(l)SW3LYu7wwjxqZsCP#AHPovu(EkIPN z07oHo1@t6Op7ro8=s=0$xO?_?2x94*N)C{VDsv&hw5+geV15SdcNVmC>C)fqCO>og zWhi-H=)`0B16@a;lHXvn_` zZ6DAJusP?<>(>|)WPoJ()!h2)Ec-vlIbKNmsOfKLzdH);24 zP$tmaX4ADGp^UH8JL(}M)U;Vb2wl7826>9H#5+F}L|pMM71T`aw(MNlGzo})!7i60 z*$J@yp$(C<0$vTaLOi(N2o327rT`=tGz9`rIRl$?ME|K&zXWQ@WD}lV>e=4%{&isO z@y~W1G1t=+ag5mi3gE5T{PwM-i?Wj*)3ehom_Yi}^T7-2D=&a_B+dLVD-*>bQ}D@u{QbU-tvL>SR`y#6x)Q+INhsc%DHS)xc=26QE16MG)= z5AM}liHl9EA@7kZF85nVEJUPiHnuowF9&PwAxOUk=4E&ON9(-O3mat%L=mVB}{B_v+Dd(7=ABSY&#Ravs& z0bZ%2GuAt5ljEEuPoKJ_ZnfnrU02m+3nj~`$E+k*7PlJeZ$iQ#R1Y-WP1%uGw>%a< zyj_@eMebv+0+Aq{Bw62PzLU~w231;9IvTflm$Tp}YKDE;fQunqjiC+8DvRze*cEi3 z!Xa{^|KRG%XLt2daj?Mx0Y-SV7&gU(0%67%*F{m8Ii^($!4Ch}_Pcy(;xdc&f6MaB zY#L9CFAWM2%qVN+j||cUB1>C=A&&m`E)Qpf;w2H1VvsX4ibnF7k0=O4b zsP^b=MF2gSf2_^O79N7pdHWniq!Ji~ujUXX8J`0|;s=2wHXiYVCy(4+kwVwd+;^ct zXL`Fhl9eRsB;aDUC>FmLgb~p^tV2N)Tu&OWwWh>hL$|DftGoJ^T>!W&%83+-Ej5gc^Sw&T;3mP8alk~Q|xEfU6#fU~`May`&brCrd@ z7`Cg&g~7oB}d6IJ2$O{vyKUg;@$tMUS!@5nmS8E zS1-UOdm_YbV4A0rD6N+{|KL8X_}+KMERk0o~N7f5?W5Uu!w(lE?fcLprR*{BJeXJE6~ z8_HKUW|#a~J$Vxjp_{#SZm^Aw8oZ*e7>FbD(QtBGLKZL6Z~^>R3UZQRV?8`oz3`&x=GsK7(1Fv32rB&*fqhU?EGN;@Ui-b4Apuy*q|m1?FOY zANhD~6)p4x_|E`%#_>DPIQM94(oR8W_s05K|EyRaE)Btp+(%zK&&chl(9<(6ur}xt zK5|`V04exHWXGQ~03T^v$3`6#$AL4v=! zM@#$N5%4%RzrNA<#k(5#A>!N!bSNdRQ^ecec=ICTQ=YP-=2I5P#Wi0K-ZI(u9P)t7 z$vTk}g1u83M?i)R9FVO*KdpXd!Oa0G=h2)A3j+>8P&lI^iZ0Tb-hVmERZdJM_|le7 zgQXyFblLrOFndO{O58l=P?fHU|BQp9qWMZotAaW&ij>fiSbEVB4Fx>Qcd%Ljm6{!# z@Ti&In2~yox7?<2Z7Oe))Cy354=uO9PfB#lyB(6{?QK42Gndr*&tDSAWzt0- z7V5EQfbeu~6tLPR0ubLJKBv$x)W$(`W3Zrt32p>x4I2q5pP&Fmr>q$t3UmW>)>o~_ ztYK@lB9bY$iV6p0K25G95GZl;Sa&?ci;}6PcX1#C70|qARJBIn5~C{Z59A^>eP1X&rU?KjE{t0xD2Kszo;xX7YWr~;L*rl5+w zfxRhM5RnjBZz9J~IF!RxYy8rJDF$(mfxYA7X9@(AhJNt^CjoYg!IwjFh(bvG^{=dc zNwxrmr!_P1{4Yj8X;aa)09t~Ecm8SKE(mxUH`p`0=@BUe!tTbz|cqz|Ze z(MK4*`I@>lO*fBwn67VL)g%~K16wd3mx_9$xIjJDi{V80&!gTUSGhyGFzSL6om`Yl z0|p1xFO+|opS!B&eF{Ojl%p005U+LZxq1 zg_(?FF#nsDYdlI5a^WWXdIG}2C=6X=6h%G6)0C;1eBgl+xZL~ucU&-!c?~3AZzW&D zXDPM{05}1Rqov_HJp4|J6JRV7)i?S$!sG;6c#Dw zaMe`=Smv}W*H@F7s?7p7;9Y#a={r`fldj{z0Jw)ZZz~d+NAgRXI+!br!>jwK576)0 z`@}84*ErfwD3-(v6gMQoMqL01^0-DToAQH$jh0+lWQscmaN>s~A%|KqkaJr~-MYY* z!-&LNwIP|DGj>Udy`Jet=HBlbSuXL^K80|{oo#y08x*34#@U>@wXs~d8KHwJS z8tm$<@MN!2S&#K{e!uDdj_>~7z=2DbVA0E{f9=bu8D%k68k4saeiAm<=jqz}Nfz zq`o#;E*l|4qN6`vk)c7u3rM(1^aLRp7{uqasWHlATh=SDln~bTtmI+hyi!a1a~SK( z(*K2?sFY$05kS|}VIPx!rB$iGdPSyi%mo$`oE`6lEeL@N1s8DOw0EaUHBgcqcFS%shst|T0vEMWCLpYflMVa(#_jSHILZO@pfji=^ZlYjF+^M z)VIU2%hKfZ*TxB7Gbxk3jx%!HHWx1cclAW?p#0*popH5a1FHhkwZC~ZWOZPcIeReg z!Nvn&hpUU{(&jy;=ejwy#QMsW?0htpr2FseYxaZXj1D^^=tf+~AWk~dt z({@lsY-&a(7H6*1h_pIR#Orkv^TJt~vmf^t-ki(!dju{avi_Q4(VI~n^n5Fu_y`xt zuV=*@w1>OLAxRDULV4Peiv{nOyhZ~4zl7thoBL${smQ8OyiQ6W-EX)Y?LCo{EiSnn zxdw|8F9~;aG6tK55+rjAF5~s2|aqomAcl*NKf9h6#eu>H&3V&pCWQ`pAkxpKi{>q>XZ@HARd*wMy$$DOE(dnmWfwY0U@RD;cCw&snIp#nnu|q0g4`jY2%TYUtmtx=N6@d1;M`X87Z)Fu{?09PN%?I7^zDnYf$;_XO I+uWQkC`hXiNdN!< diff --git a/tests/builder.rs b/tests/builder.rs index 506ef1154..5d69209ab 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -62,7 +62,7 @@ fn bundle_chain() { // Use the empty tree. let anchor = MerkleHashOrchard::empty_root(32.into()).into(); - let mut builder = Builder::new(Flags::from_parts(false, true), anchor); + let mut builder = Builder::new(Flags::from_parts(false, true, false), anchor); assert_eq!( builder.add_recipient( None, @@ -96,7 +96,7 @@ fn bundle_chain() { let (merkle_path, anchor) = build_merkle_path(¬e); - let mut builder = Builder::new(Flags::from_parts(true, true), anchor); + let mut builder = Builder::new(Flags::from_parts(true, true, false), anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( builder.add_recipient( diff --git a/tests/zsa.rs b/tests/zsa.rs index 649d5e8cf..584b25b5b 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -189,7 +189,7 @@ fn create_native_note(keys: &Keychain) -> Note { // Use the empty tree. let anchor = MerkleHashOrchard::empty_root(32.into()).into(); - let mut builder = Builder::new(Flags::from_parts(false, true), anchor); + let mut builder = Builder::new(Flags::from_parts(false, true, false), anchor); assert_eq!( builder.add_recipient( None, @@ -244,7 +244,7 @@ fn build_and_verify_bundle( ) -> Result<(), String> { let rng = OsRng; let shielded_bundle: Bundle<_, i64> = { - let mut builder = Builder::new(Flags::from_parts(true, true), anchor); + let mut builder = Builder::new(Flags::from_parts(true, true, true), anchor); spends .iter() From 7937e5b25184652c8c56c5ee8fd7ec4deb0ab579 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Wed, 4 Oct 2023 15:23:57 +0300 Subject: [PATCH 46/67] Enhance and cleanup ivk-to-bytes-visibility-downgrade branch (#81) Added burn validation, fixes and minor additions. Bumped Rust version to 1.65 --------- Co-authored-by: alexeykoren <> Co-authored-by: Dmitry Demin Co-authored-by: Paul <3682187+PaulLaux@users.noreply.github.com> --- .circleci/config.yml | 2 +- .github/workflows/bench.yml | 2 +- .github/workflows/ci.yml | 10 +- .github/workflows/lints-stable.yml | 6 +- Cargo.toml | 28 +++--- README.md | 2 +- rust-toolchain.toml | 2 +- src/builder.rs | 8 +- src/bundle.rs | 1 + src/bundle/burn_validation.rs | 146 +++++++++++++++++++++++++++++ src/bundle/commitments.rs | 32 +++---- src/circuit.rs | 6 +- src/issuance.rs | 35 +++++-- src/primitives/redpallas.rs | 2 +- src/supply_info.rs | 4 +- tests/zsa.rs | 8 +- 16 files changed, 227 insertions(+), 67 deletions(-) create mode 100644 src/bundle/burn_validation.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 9dead1280..d95cffad9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ jobs: # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor docker: - - image: cimg/rust:1.61.0 + - image: cimg/rust:1.65.0 # Add steps to the job # See: https://circleci.com/docs/2.0/configuration-reference/#steps steps: diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index ba1ceea59..353f23ae4 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true - name: Run benchmark run: cargo bench -- --output-format bencher | tee output.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac8a974df..be39382b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true - name: Run tests uses: actions-rs/cargo@v1 @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -62,7 +62,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true - name: Setup mdBook uses: peaceiris/actions-mdbook@v1 @@ -106,7 +106,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -129,7 +129,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 diff --git a/.github/workflows/lints-stable.yml b/.github/workflows/lints-stable.yml index a000ab449..36ae77e06 100644 --- a/.github/workflows/lints-stable.yml +++ b/.github/workflows/lints-stable.yml @@ -5,19 +5,19 @@ on: pull_request jobs: clippy: - name: Clippy (1.61.0) + name: Clippy (1.65.0) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.61.0 + toolchain: 1.65.0 components: clippy override: true - name: Run Clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.61.0) + name: Clippy (1.65.0) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings diff --git a/Cargo.toml b/Cargo.toml index efcc06945..1ed0fb0f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ authors = [ "Kris Nuttycombe ", ] edition = "2021" -rust-version = "1.61.0" +rust-version = "1.65" description = "The Orchard shielded transaction protocol" license-file = "LICENSE-BOSL" repository = "https://github.com/zcash/orchard" @@ -25,7 +25,7 @@ rustdoc-args = ["--cfg", "docsrs", "--html-in-header", "katex-header.html"] [dependencies] aes = "0.8" bitvec = "1" -blake2b_simd = "1" +blake2b_simd = "=1.0.1" # Last version required rust 1.66 ff = "0.13" fpe = "0.6" group = { version = "0.13", features = ["wnaf-memuse"] } @@ -35,39 +35,35 @@ hex = "0.4" lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } pasta_curves = "0.5" -tempfile = "= 3.5.0" # Last version required rust 1.63 proptest = { version = "1.0.0", optional = true } rand = "0.8" -reddsa = "=0.5.0" # Last version required rust 1.65 +reddsa = "0.5" nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" zcash_note_encryption = "0.4" -incrementalmerkletree = "0.4" +incrementalmerkletree = "0.5" # Logging tracing = "0.1" # Developer tooling dependencies -image = { version = ">= 0.24, < 0.24.5", optional = true } # 0.24.5 has MSRV 1.61 -flate2 = ">= 1.0, <1.0.27" # Clippy issues in last version +image = { version = "0.24", optional = true } plotters = { version = "0.3.0", optional = true } [dev-dependencies] -bridgetree = "0.3" -half = ">= 1.8, < 2.3" -criterion = "0.3" +bridgetree = "0.4" +criterion = "0.4" # 0.5 depends on clap 4 which has MSRV 1.70 halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" zcash_note_encryption = { version = "0.4", features = ["pre-zip-212"] } -incrementalmerkletree = { version = "0.4", features = ["test-dependencies"] } +incrementalmerkletree = { version = "0.5", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] -hashbrown = ">= 0.12, <0.13" -dashmap = ">= 5.4, <5.5" -inferno = ">= 0.11, < 0.11.15" -pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 +inferno = "0.11" +clap = "=4.2.0" # Used by inferno. Last version required rust 1.70 +pprof = { version = "0.11", features = ["criterion", "flamegraph"] } [lib] bench = false @@ -97,4 +93,4 @@ debug = true debug = true [patch.crates-io] -zcash_note_encryption = { version = "0.4", git = "https://github.com/QED-it/librustzcash.git", tag = "orchard_zsa_0.5.0_compatible" } +zcash_note_encryption = { version = "0.4", git = "https://github.com/QED-it/librustzcash.git", branch = "zsa1-zebra" } diff --git a/README.md b/README.md index f761aa914..95c3782e6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) [![CI checks](https://github.com/QED-it/orchard/actions/workflows/ci.yml/badge.svg?branch=zsa1)](https://github.com/QED-it/orchard/actions/workflows/ci.yml) # -Requires Rust 1.61+. +Requires Rust 1.65+. ## Documentation diff --git a/rust-toolchain.toml b/rust-toolchain.toml index b54a9f45d..5ecda6e49 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.61.0" +channel = "1.65.0" components = [ "clippy", "rustfmt" ] diff --git a/src/builder.rs b/src/builder.rs index bae73569b..fe3857904 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -464,9 +464,11 @@ impl Builder { .max() .cloned() .unwrap(); - (num_actions < MIN_ACTIONS) - .then(|| MIN_ACTIONS - num_actions) - .unwrap_or(0) + if num_actions < MIN_ACTIONS { + MIN_ACTIONS - num_actions + } else { + 0 + } } /// Builds a bundle containing the given spent notes and recipients. diff --git a/src/bundle.rs b/src/bundle.rs index 23beb4a86..a8e429a7c 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -1,6 +1,7 @@ //! Structs related to bundles of Orchard actions. mod batch; +pub mod burn_validation; pub mod commitments; pub use batch::BatchValidator; diff --git a/src/bundle/burn_validation.rs b/src/bundle/burn_validation.rs new file mode 100644 index 000000000..c0cfb84f1 --- /dev/null +++ b/src/bundle/burn_validation.rs @@ -0,0 +1,146 @@ +//! Validating burn operations on asset bundles. +//! +//! The module provides a function `validate_bundle_burn` that can be used to validate the burn values for the bundle. +//! +use std::fmt; + +use crate::note::AssetBase; + +/// Possible errors that can occur during bundle burn validation. +#[derive(Debug)] +#[cfg_attr(test, derive(PartialEq, Eq))] +pub enum BurnError { + /// Encountered a duplicate asset to burn. + DuplicateAsset, + /// Cannot burn a native asset. + NativeAsset, + /// Cannot burn an asset with a non-positive value. + NonPositiveAmount, +} + +/// Validates burn for a bundle by ensuring each asset is unique, non-native, and has a positive value. +/// +/// Each burn element is represented as a tuple of `AssetBase` and `i64` (value for the burn). +/// +/// # Arguments +/// +/// * `burn` - A vector of assets, where each asset is represented as a tuple of `AssetBase` and `i64` (value the burn). +/// +/// # Errors +/// +/// Returns a `BurnError` if: +/// * Any asset in the `burn` vector is not unique (`BurnError::DuplicateAsset`). +/// * Any asset in the `burn` vector is native (`BurnError::NativeAsset`). +/// * Any asset in the `burn` vector has a non-positive value (`BurnError::NonPositiveAmount`). +pub fn validate_bundle_burn(bundle_burn: &Vec<(AssetBase, i64)>) -> Result<(), BurnError> { + let mut asset_set = std::collections::HashSet::<&AssetBase>::new(); + + for (asset, value) in bundle_burn { + if !asset_set.insert(asset) { + return Err(BurnError::DuplicateAsset); + } + if asset.is_native().into() { + return Err(BurnError::NativeAsset); + } + if *value <= 0 { + return Err(BurnError::NonPositiveAmount); + } + } + + Ok(()) +} + +impl fmt::Display for BurnError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + BurnError::DuplicateAsset => write!(f, "Encountered a duplicate asset to burn."), + BurnError::NativeAsset => write!(f, "Cannot burn a native asset."), + BurnError::NonPositiveAmount => { + write!(f, "Cannot burn an asset with a non-positive value.") + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Creates an item of bundle burn list for a given asset description and value. + /// + /// This function is deterministic and guarantees that each call with the same parameters + /// will return the same result. It achieves determinism by using a static `IssuanceKey`. + /// + /// # Arguments + /// + /// * `asset_desc` - The asset description string. + /// * `value` - The value for the burn. + /// + /// # Returns + /// + /// A tuple `(AssetBase, Amount)` representing the burn list item. + /// + pub fn get_burn_tuple(asset_desc: &str, value: i64) -> (AssetBase, i64) { + use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; + + let sk_iss = IssuanceKey::from_bytes([0u8; 32]).unwrap(); + let isk: IssuanceAuthorizingKey = (&sk_iss).into(); + + ( + AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc), + value, + ) + } + + #[test] + fn validate_bundle_burn_success() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 2", 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert!(result.is_ok()); + } + + #[test] + fn validate_bundle_burn_duplicate_asset() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 1", 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::DuplicateAsset)); + } + + #[test] + fn validate_bundle_burn_native_asset() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + (AssetBase::native(), 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::NativeAsset)); + } + + #[test] + fn validate_bundle_burn_zero_value() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 2", 0), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::NonPositiveAmount)); + } +} diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index 97cc8ab09..f67b6b75a 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -96,6 +96,22 @@ pub fn hash_bundle_auth_empty() -> Blake2bHash { hasher(ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION).finalize() } +/// Construct the commitment for an absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_auth_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() +} + +/// Construct the commitment for an absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_txid_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() +} + /// Construct the commitment for the issue bundle pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) -> Blake2bHash { let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION); @@ -119,14 +135,6 @@ pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) h.finalize() } -/// Construct the commitment for the absent issue bundle as defined in -/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] -/// -/// [zip227]: https://qed-it.github.io/zips/zip-0227 -pub fn hash_issue_bundle_txid_empty() -> Blake2bHash { - hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() -} - /// Construct the commitment to the authorizing data of an /// authorized issue bundle pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake2bHash { @@ -134,11 +142,3 @@ pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake h.update(&<[u8; 64]>::from(bundle.authorization().signature())); h.finalize() } - -/// Construct the commitment for an absent issue bundle as defined in -/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] -/// -/// [zip227]: https://qed-it.github.io/zips/zip-0227 -pub fn hash_issue_bundle_auth_empty() -> Blake2bHash { - hasher(ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION).finalize() -} diff --git a/src/circuit.rs b/src/circuit.rs index d88bfa2a8..0bf473ac7 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1333,9 +1333,9 @@ mod tests { w.write_all(&<[u8; 32]>::from(instance.rk.clone()))?; w.write_all(&instance.cmx.to_bytes())?; w.write_all(&[ - if instance.enable_spend { 1 } else { 0 }, - if instance.enable_output { 1 } else { 0 }, - if instance.enable_zsa { 1 } else { 0 }, + u8::from(instance.enable_spend), + u8::from(instance.enable_output), + u8::from(instance.enable_zsa), ])?; w.write_all(proof.as_ref())?; diff --git a/src/issuance.rs b/src/issuance.rs index c2fc7ca28..29a95fda3 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -143,7 +143,7 @@ impl IssueAction { // All assets should be derived correctly note.asset() .eq(&issue_asset) - .then(|| ()) + .then_some(()) .ok_or(IssueBundleIkMismatchAssetBase)?; // The total amount should not overflow @@ -157,8 +157,13 @@ impl IssueAction { } /// Serialize `finalize` flag to a byte + #[allow(clippy::bool_to_int_with_if)] pub fn flags(&self) -> u8 { - self.finalize.then(|| 0b0000_0001).unwrap_or(0b0000_0000) + if self.finalize { + 0b0000_0001 + } else { + 0b0000_0000 + } } } @@ -1395,14 +1400,27 @@ mod tests { #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; - use crate::keys::testing::{arb_issuance_authorizing_key, arb_issuance_validating_key}; + use crate::keys::testing::arb_issuance_validating_key; use crate::note::asset_base::testing::zsa_asset_id; use crate::note::testing::arb_zsa_note; + use crate::primitives::redpallas::Signature; use nonempty::NonEmpty; use proptest::collection::vec; use proptest::prelude::*; use proptest::prop_compose; - use rand::{rngs::StdRng, SeedableRng}; + use reddsa::orchard::SpendAuth; + + prop_compose! { + /// Generate a uniformly distributed signature + pub(crate) fn arb_signature()( + half_bytes in prop::array::uniform32(prop::num::u8::ANY) + ) -> Signature { + // prop::array can only generate 32 elements max, so we duplicate it + let sig_bytes: [u8; 64] = [half_bytes, half_bytes].concat().try_into().unwrap(); + let sig: Signature = Signature::from(sig_bytes); + sig + } + } prop_compose! { /// Generate an issue action @@ -1462,17 +1480,14 @@ pub mod testing { ( actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), ik in arb_issuance_validating_key(), - isk in arb_issuance_authorizing_key(), - rng_seed in prop::array::uniform32(prop::num::u8::ANY), - fake_sighash in prop::array::uniform32(prop::num::u8::ANY) + fake_sig in arb_signature(), ) -> IssueBundle { - let rng = StdRng::from_seed(rng_seed); let actions = NonEmpty::from_vec(actions).unwrap(); IssueBundle { ik, actions, - authorization: Prepared { sighash: fake_sighash }, - }.sign(rng, &isk).unwrap() + authorization: Signed { signature: fake_sig }, + } } } } diff --git a/src/primitives/redpallas.rs b/src/primitives/redpallas.rs index a414bf285..7690312a9 100644 --- a/src/primitives/redpallas.rs +++ b/src/primitives/redpallas.rs @@ -101,7 +101,7 @@ impl Eq for VerificationKey {} impl PartialOrd for VerificationKey { fn partial_cmp(&self, other: &Self) -> Option { - <[u8; 32]>::from(self).partial_cmp(&<[u8; 32]>::from(other)) + Some(self.cmp(other)) } } diff --git a/src/supply_info.rs b/src/supply_info.rs index 79e6b7d70..1c2f346b1 100644 --- a/src/supply_info.rs +++ b/src/supply_info.rs @@ -6,7 +6,7 @@ use crate::{issuance::Error, note::AssetBase, value::ValueSum}; /// Represents the amount of an asset and its finalization status. #[derive(Debug, Clone, Copy)] -#[cfg_attr(test, derive(PartialEq))] +#[cfg_attr(test, derive(PartialEq, Eq))] pub struct AssetSupply { /// The amount of the asset. pub amount: ValueSum, @@ -64,7 +64,7 @@ impl SupplyInfo { finalization_set.extend( self.assets .iter() - .filter_map(|(asset, supply)| supply.is_finalized.then(|| asset)), + .filter_map(|(asset, supply)| supply.is_finalized.then_some(asset)), ); } } diff --git a/tests/zsa.rs b/tests/zsa.rs index 584b25b5b..d3dd1b922 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -77,12 +77,12 @@ fn prepare_keys() -> Keychain { fn sign_issue_bundle( unauthorized: IssueBundle, - mut rng: OsRng, + rng: OsRng, isk: &IssuanceAuthorizingKey, ) -> IssueBundle { let sighash = unauthorized.commitment().into(); let proven = unauthorized.prepare(sighash); - proven.sign(&mut rng, isk).unwrap() + proven.sign(rng, isk).unwrap() } fn build_and_sign_bundle( @@ -95,7 +95,7 @@ fn build_and_sign_bundle( let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(pk, &mut rng).unwrap(); proven - .apply_signatures(&mut rng, sighash, &[SpendAuthorizingKey::from(sk)]) + .apply_signatures(rng, sighash, &[SpendAuthorizingKey::from(sk)]) .unwrap() } @@ -203,7 +203,7 @@ fn create_native_note(keys: &Keychain) -> Note { let unauthorized = builder.build(&mut rng).unwrap(); let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(keys.pk(), &mut rng).unwrap(); - proven.apply_signatures(&mut rng, sighash, &[]).unwrap() + proven.apply_signatures(rng, sighash, &[]).unwrap() }; let ivk = keys.fvk().to_ivk(Scope::External); let (native_note, _, _) = shielding_bundle From 8b0560d64568c5abff876c01c85150ac21f4e8de Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 16 Oct 2023 11:54:09 +0200 Subject: [PATCH 47/67] Circuit: optimized short range check on 4 and 5 bits (#86) Short range checks on 4 and 5 bits are now performed with only one lookup (instead of 2). With this optimization, we could come back to k=11 in the circuit. --- src/circuit.rs | 13 +- src/circuit/commit_ivk.rs | 9 +- src/circuit/gadget/mux_chip.rs | 8 +- src/circuit/note_commit.rs | 9 +- src/circuit/value_commit_orchard.rs | 9 +- src/circuit_description | 5281 ++++++++++++++------------- src/circuit_proof_test_case.bin | Bin 5251 -> 5283 bytes 7 files changed, 2790 insertions(+), 2539 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 0bf473ac7..91a5fe13a 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -68,7 +68,7 @@ mod note_commit; mod value_commit_orchard; /// Size of the Orchard circuit. -const K: u32 = 12; +const K: u32 = 11; // Absolute offsets for public inputs. const ANCHOR: usize = 0; @@ -342,10 +342,12 @@ impl plonk::Circuit for Circuit { // Fixed columns for the Sinsemilla generator lookup table let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); // Instance column used for public inputs @@ -381,7 +383,8 @@ impl plonk::Circuit for Circuit { // We have a lot of free space in the right-most advice columns; use one of them // for all of our range checks. - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = + LookupRangeCheckConfig::configure(meta, advices[9], table_idx, table_range_check_tag); // Configuration for curve point operations. // This uses 10 advice columns and spans the whole circuit. @@ -1287,8 +1290,8 @@ mod tests { K, &circuits[0], ); - assert_eq!(usize::from(circuit_cost.proof_size(1)), 5088); - assert_eq!(usize::from(circuit_cost.proof_size(2)), 7360); + assert_eq!(usize::from(circuit_cost.proof_size(1)), 5120); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7392); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1405,7 +1408,7 @@ mod tests { let test_case_bytes = fs::read("src/circuit_proof_test_case.bin").unwrap(); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 5088); + assert_eq!(proof.0.len(), 5120); assert!(proof.verify(&vk, &[instance]).is_ok()); } diff --git a/src/circuit/commit_ivk.rs b/src/circuit/commit_ivk.rs index 33692a4a8..73c24a91f 100644 --- a/src/circuit/commit_ivk.rs +++ b/src/circuit/commit_ivk.rs @@ -734,10 +734,12 @@ mod tests { } let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); let lagrange_coeffs = [ meta.fixed_column(), @@ -750,7 +752,12 @@ mod tests { meta.fixed_column(), ]; - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let sinsemilla_config = SinsemillaChip::< OrchardHashDomains, OrchardCommitDomains, diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs index dbe54ed40..fb81f8ea3 100644 --- a/src/circuit/gadget/mux_chip.rs +++ b/src/circuit/gadget/mux_chip.rs @@ -215,6 +215,7 @@ mod tests { MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lagrange_coeffs = [ meta.fixed_column(), @@ -228,7 +229,12 @@ mod tests { ]; meta.enable_constant(lagrange_coeffs[0]); - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let ecc_config = EccChip::::configure( meta, diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 47e2fda1c..c5c8f44e8 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -2369,10 +2369,12 @@ mod tests { } let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); let lagrange_coeffs = [ meta.fixed_column(), @@ -2385,7 +2387,12 @@ mod tests { meta.fixed_column(), ]; - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let sinsemilla_config = SinsemillaChip::< OrchardHashDomains, OrchardCommitDomains, diff --git a/src/circuit/value_commit_orchard.rs b/src/circuit/value_commit_orchard.rs index 4e4dfa36d..4356ad583 100644 --- a/src/circuit/value_commit_orchard.rs +++ b/src/circuit/value_commit_orchard.rs @@ -169,10 +169,12 @@ mod tests { meta.enable_equality(primary); let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); let lagrange_coeffs = [ @@ -187,7 +189,12 @@ mod tests { ]; meta.enable_constant(lagrange_coeffs[0]); - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let sinsemilla_config = SinsemillaChip::configure( meta, diff --git a/src/circuit_description b/src/circuit_description index cffc54ff8..19578d04b 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -2,23 +2,23 @@ PinnedVerificationKey { base_modulus: "0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001", scalar_modulus: "0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001", domain: PinnedEvaluationDomain { - k: 12, - extended_k: 15, - omega: 0x028961bbd9c63b7bd7c75f72e02a9727d14d99e7985184470d34cd1b8ef03001, + k: 11, + extended_k: 14, + omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, }, cs: PinnedConstraintSystem { - num_fixed_columns: 30, + num_fixed_columns: 33, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 59, + num_selectors: 61, gates: [ Product( Product( Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -29,8 +29,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -44,8 +44,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -59,8 +59,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -97,8 +97,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -109,8 +109,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -124,8 +124,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -139,8 +139,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -208,8 +208,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -220,8 +220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -235,8 +235,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -250,8 +250,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -308,8 +308,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -320,8 +320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -335,8 +335,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -350,8 +350,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -388,8 +388,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -400,8 +400,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -415,8 +415,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -430,8 +430,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -468,8 +468,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -480,8 +480,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -495,8 +495,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -510,8 +510,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -548,8 +548,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -560,8 +560,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -575,8 +575,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -590,8 +590,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -628,8 +628,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -640,8 +640,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -655,8 +655,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -670,8 +670,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -708,8 +708,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -720,8 +720,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -735,8 +735,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -750,8 +750,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -843,8 +843,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -855,8 +855,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -870,8 +870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -885,8 +885,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -934,8 +934,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -946,8 +946,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -961,8 +961,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -976,8 +976,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1007,8 +1007,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1019,8 +1019,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1034,8 +1034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1049,8 +1049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1094,8 +1094,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1106,8 +1106,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1121,8 +1121,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1136,8 +1136,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1178,8 +1178,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1190,8 +1190,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1205,8 +1205,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1220,8 +1220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1266,20 +1266,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1289,12 +1289,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1304,12 +1304,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1384,20 +1384,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1407,12 +1407,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1422,12 +1422,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1501,20 +1501,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1528,8 +1528,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1543,8 +1543,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1610,8 +1610,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1622,8 +1622,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1633,12 +1633,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1652,8 +1652,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1774,8 +1774,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1786,8 +1786,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1797,12 +1797,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1816,8 +1816,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1909,8 +1909,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1921,8 +1921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1936,8 +1936,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1947,12 +1947,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2035,8 +2035,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2047,8 +2047,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2062,8 +2062,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2073,12 +2073,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2174,8 +2174,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2186,8 +2186,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2201,8 +2201,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2212,12 +2212,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2318,8 +2318,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2330,8 +2330,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2345,8 +2345,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2356,12 +2356,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2462,8 +2462,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2474,8 +2474,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2489,8 +2489,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2500,12 +2500,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2604,8 +2604,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2616,8 +2616,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2631,8 +2631,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2642,12 +2642,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2746,8 +2746,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2758,8 +2758,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2773,8 +2773,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2784,12 +2784,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2846,8 +2846,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2858,8 +2858,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2873,8 +2873,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2884,12 +2884,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2946,8 +2946,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2958,8 +2958,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2973,8 +2973,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2984,12 +2984,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3046,8 +3046,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3058,8 +3058,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3073,8 +3073,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3084,12 +3084,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3146,8 +3146,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3158,8 +3158,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3173,8 +3173,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3184,12 +3184,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3275,8 +3275,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3287,8 +3287,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3302,8 +3302,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3313,12 +3313,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3404,8 +3404,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3416,8 +3416,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3431,8 +3431,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3446,8 +3446,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3544,8 +3544,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3556,8 +3556,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3571,8 +3571,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3586,8 +3586,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3601,8 +3601,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3616,8 +3616,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3651,8 +3651,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3663,8 +3663,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3678,8 +3678,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3693,8 +3693,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3708,8 +3708,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3723,8 +3723,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3758,8 +3758,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3770,8 +3770,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3785,8 +3785,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3800,8 +3800,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3815,8 +3815,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3830,8 +3830,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3898,8 +3898,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3910,8 +3910,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3925,8 +3925,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3940,8 +3940,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3955,8 +3955,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3970,8 +3970,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4130,8 +4130,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4142,8 +4142,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4157,8 +4157,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4172,8 +4172,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4187,8 +4187,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4202,8 +4202,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4299,8 +4299,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4311,8 +4311,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4326,8 +4326,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4341,8 +4341,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4356,8 +4356,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4371,8 +4371,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4563,8 +4563,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4575,8 +4575,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4590,8 +4590,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4605,8 +4605,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4620,8 +4620,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4635,8 +4635,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4703,8 +4703,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4715,8 +4715,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4730,8 +4730,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4745,8 +4745,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4760,8 +4760,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4775,8 +4775,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4935,8 +4935,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4947,8 +4947,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4962,8 +4962,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4977,8 +4977,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4992,8 +4992,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5007,8 +5007,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5104,8 +5104,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5116,8 +5116,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5131,8 +5131,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5146,8 +5146,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5161,8 +5161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5176,8 +5176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5305,8 +5305,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5317,8 +5317,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5332,8 +5332,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5347,8 +5347,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5362,8 +5362,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5377,8 +5377,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5474,8 +5474,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5486,8 +5486,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5501,8 +5501,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5516,8 +5516,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5531,8 +5531,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5565,8 +5565,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5577,8 +5577,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5592,8 +5592,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5607,8 +5607,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5622,8 +5622,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5656,8 +5656,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5668,8 +5668,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5683,8 +5683,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5698,8 +5698,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5713,8 +5713,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5780,8 +5780,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5792,8 +5792,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5807,8 +5807,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5822,8 +5822,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5837,8 +5837,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5996,8 +5996,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6008,8 +6008,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6023,8 +6023,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6038,8 +6038,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6053,8 +6053,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6149,8 +6149,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6161,8 +6161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6176,8 +6176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6191,8 +6191,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6206,8 +6206,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6398,8 +6398,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6410,8 +6410,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6425,8 +6425,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6440,8 +6440,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6455,8 +6455,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6470,8 +6470,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6538,8 +6538,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6550,8 +6550,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6565,8 +6565,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6580,8 +6580,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6595,8 +6595,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6610,8 +6610,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6770,8 +6770,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6782,8 +6782,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6797,8 +6797,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6812,8 +6812,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6827,8 +6827,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6842,8 +6842,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6939,8 +6939,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6951,8 +6951,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6966,8 +6966,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6981,8 +6981,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6996,8 +6996,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7011,8 +7011,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7140,8 +7140,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7152,8 +7152,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7167,8 +7167,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7182,8 +7182,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7197,8 +7197,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7212,8 +7212,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7284,8 +7284,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7296,8 +7296,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7311,8 +7311,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7326,8 +7326,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7341,8 +7341,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7356,8 +7356,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7465,8 +7465,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7477,8 +7477,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7492,8 +7492,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7507,8 +7507,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7522,8 +7522,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7575,8 +7575,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7587,8 +7587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7602,8 +7602,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7617,8 +7617,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7632,8 +7632,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7673,8 +7673,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7685,8 +7685,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7700,8 +7700,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7715,8 +7715,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7730,8 +7730,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7769,8 +7769,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7781,8 +7781,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7796,8 +7796,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7811,8 +7811,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7826,8 +7826,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7858,8 +7858,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7870,8 +7870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7885,8 +7885,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7900,8 +7900,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7915,8 +7915,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7980,8 +7980,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7992,8 +7992,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8007,8 +8007,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8022,8 +8022,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8037,8 +8037,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8052,8 +8052,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8120,8 +8120,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8132,8 +8132,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8147,8 +8147,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8162,8 +8162,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8177,8 +8177,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8192,8 +8192,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8289,8 +8289,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8301,8 +8301,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8316,8 +8316,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8331,8 +8331,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8346,8 +8346,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8361,8 +8361,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -8451,8 +8451,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -8691,8 +8691,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -8715,7 +8715,7 @@ PinnedVerificationKey { ), Fixed { query_index: 0, - column_index: 3, + column_index: 4, rotation: Rotation( 0, ), @@ -8750,8 +8750,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 3, - column_index: 4, + query_index: 4, + column_index: 5, rotation: Rotation( 0, ), @@ -8809,8 +8809,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -8891,8 +8891,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -8996,8 +8996,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -9124,8 +9124,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -9275,8 +9275,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -9449,8 +9449,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -9470,8 +9470,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -9506,8 +9506,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 2, - column_index: 11, + query_index: 3, + column_index: 12, rotation: Rotation( 0, ), @@ -9517,8 +9517,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -9578,8 +9578,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -9602,7 +9602,7 @@ PinnedVerificationKey { ), Fixed { query_index: 0, - column_index: 3, + column_index: 4, rotation: Rotation( 0, ), @@ -9623,8 +9623,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 3, - column_index: 4, + query_index: 4, + column_index: 5, rotation: Rotation( 0, ), @@ -9654,8 +9654,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -9694,8 +9694,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -9743,8 +9743,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -9801,8 +9801,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -9868,8 +9868,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -9944,8 +9944,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -9965,8 +9965,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -10001,8 +10001,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 2, - column_index: 11, + query_index: 3, + column_index: 12, rotation: Rotation( 0, ), @@ -10012,8 +10012,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -10073,8 +10073,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -10205,8 +10205,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10217,8 +10217,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10232,8 +10232,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10247,8 +10247,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10262,8 +10262,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10301,8 +10301,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10313,8 +10313,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10328,8 +10328,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10343,8 +10343,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10358,8 +10358,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10397,8 +10397,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10409,8 +10409,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10424,8 +10424,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10439,8 +10439,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10454,8 +10454,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10506,8 +10506,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10518,8 +10518,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10533,8 +10533,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10548,8 +10548,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10563,8 +10563,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10606,8 +10606,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10618,8 +10618,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10633,8 +10633,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10648,8 +10648,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10663,8 +10663,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10695,8 +10695,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10707,8 +10707,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10722,8 +10722,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10737,8 +10737,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10752,8 +10752,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10800,8 +10800,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10812,8 +10812,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10827,8 +10827,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10842,8 +10842,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10857,8 +10857,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10933,8 +10933,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10945,8 +10945,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10960,8 +10960,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10975,8 +10975,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10990,8 +10990,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11022,8 +11022,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11034,8 +11034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11049,8 +11049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11064,8 +11064,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11079,8 +11079,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11150,8 +11150,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11162,8 +11162,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11177,8 +11177,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11192,8 +11192,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11207,8 +11207,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11246,8 +11246,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11258,8 +11258,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11273,8 +11273,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11288,8 +11288,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11303,8 +11303,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11349,8 +11349,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11361,8 +11361,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11376,8 +11376,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11391,8 +11391,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11406,8 +11406,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11465,8 +11465,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11477,8 +11477,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11492,8 +11492,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11507,8 +11507,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11532,8 +11532,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11548,8 +11548,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11566,8 +11566,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11582,8 +11582,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11600,8 +11600,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11623,8 +11623,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11639,8 +11639,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11657,8 +11657,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11673,8 +11673,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11691,8 +11691,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11715,8 +11715,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11731,8 +11731,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11749,8 +11749,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11765,8 +11765,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11783,8 +11783,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11810,8 +11810,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11822,8 +11822,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11837,8 +11837,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11852,8 +11852,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11877,8 +11877,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11893,8 +11893,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11911,8 +11911,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11927,8 +11927,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11945,8 +11945,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11968,8 +11968,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11984,8 +11984,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12002,8 +12002,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12018,8 +12018,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12036,8 +12036,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12060,8 +12060,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12076,8 +12076,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12094,8 +12094,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12110,8 +12110,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12128,8 +12128,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12155,8 +12155,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12167,8 +12167,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12182,8 +12182,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12197,8 +12197,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12222,8 +12222,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12238,8 +12238,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12256,8 +12256,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12272,8 +12272,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12290,8 +12290,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12313,8 +12313,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12329,8 +12329,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12347,8 +12347,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12363,8 +12363,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12381,8 +12381,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12405,8 +12405,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12421,8 +12421,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12439,8 +12439,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12455,8 +12455,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12473,8 +12473,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12500,8 +12500,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12512,8 +12512,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12527,8 +12527,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12542,8 +12542,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12564,8 +12564,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12580,8 +12580,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12598,8 +12598,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12614,8 +12614,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12632,8 +12632,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -12656,8 +12656,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12668,8 +12668,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12683,8 +12683,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12698,8 +12698,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12734,8 +12734,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12754,8 +12754,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12765,8 +12765,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12795,8 +12795,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12815,8 +12815,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12826,8 +12826,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12858,8 +12858,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12878,8 +12878,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12889,8 +12889,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12919,8 +12919,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12939,8 +12939,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12950,8 +12950,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12982,8 +12982,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -13002,8 +13002,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -13013,8 +13013,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -13064,8 +13064,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13076,8 +13076,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13091,8 +13091,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13106,8 +13106,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13139,8 +13139,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -13159,8 +13159,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -13170,8 +13170,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -13220,8 +13220,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13232,8 +13232,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13247,8 +13247,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13262,8 +13262,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13295,8 +13295,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -13315,8 +13315,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -13326,8 +13326,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -13377,8 +13377,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13389,8 +13389,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13404,8 +13404,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13419,8 +13419,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13434,8 +13434,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13477,8 +13477,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13489,8 +13489,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13504,8 +13504,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13519,8 +13519,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13534,8 +13534,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13577,8 +13577,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13589,8 +13589,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13604,8 +13604,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13619,8 +13619,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13634,8 +13634,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13669,8 +13669,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13681,8 +13681,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13696,8 +13696,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13711,8 +13711,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13726,8 +13726,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13741,8 +13741,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -13754,7 +13754,7 @@ PinnedVerificationKey { Scaled( Fixed { query_index: 0, - column_index: 3, + column_index: 4, rotation: Rotation( 0, ), @@ -13834,8 +13834,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -13919,8 +13919,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -14037,16 +14037,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -14133,16 +14133,16 @@ PinnedVerificationKey { Scaled( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -14173,8 +14173,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14185,8 +14185,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14200,8 +14200,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14215,8 +14215,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14282,8 +14282,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14294,8 +14294,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14309,8 +14309,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14324,8 +14324,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14391,8 +14391,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14403,8 +14403,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14418,8 +14418,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14433,8 +14433,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14471,8 +14471,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14483,8 +14483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14498,8 +14498,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14513,8 +14513,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14560,8 +14560,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14572,8 +14572,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14587,8 +14587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14602,8 +14602,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14673,8 +14673,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14685,8 +14685,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14700,8 +14700,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14715,8 +14715,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14760,8 +14760,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14772,8 +14772,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14787,8 +14787,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14802,8 +14802,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14849,8 +14849,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14861,8 +14861,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14876,8 +14876,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14891,8 +14891,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14906,8 +14906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14921,8 +14921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14933,8 +14933,8 @@ PinnedVerificationKey { Sum( Scaled( Fixed { - query_index: 3, - column_index: 4, + query_index: 4, + column_index: 5, rotation: Rotation( 0, ), @@ -15014,8 +15014,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -15099,8 +15099,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -15217,16 +15217,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -15313,16 +15313,16 @@ PinnedVerificationKey { Scaled( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -15355,8 +15355,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15367,8 +15367,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15382,8 +15382,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15397,8 +15397,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15412,8 +15412,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15427,8 +15427,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15496,8 +15496,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15508,8 +15508,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15523,8 +15523,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15538,8 +15538,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15553,8 +15553,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15568,8 +15568,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15637,8 +15637,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15649,8 +15649,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15664,8 +15664,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15679,8 +15679,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15694,8 +15694,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15709,8 +15709,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15749,8 +15749,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15761,8 +15761,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15776,8 +15776,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15791,8 +15791,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15806,8 +15806,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15821,8 +15821,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15870,8 +15870,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15882,8 +15882,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15897,8 +15897,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15912,8 +15912,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15927,8 +15927,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15942,8 +15942,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16015,8 +16015,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16027,8 +16027,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16042,8 +16042,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16057,8 +16057,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16072,8 +16072,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16087,8 +16087,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16134,8 +16134,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16146,8 +16146,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16161,8 +16161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16176,8 +16176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16191,8 +16191,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16206,8 +16206,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16253,8 +16253,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16265,8 +16265,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16280,8 +16280,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16295,8 +16295,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16310,8 +16310,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16325,8 +16325,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16365,8 +16365,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16377,8 +16377,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16392,8 +16392,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16407,8 +16407,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16422,8 +16422,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16437,8 +16437,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16477,8 +16477,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16489,8 +16489,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16504,8 +16504,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16519,8 +16519,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16534,8 +16534,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16549,8 +16549,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16608,8 +16608,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16620,8 +16620,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16635,8 +16635,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16650,8 +16650,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16665,8 +16665,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16680,8 +16680,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16727,8 +16727,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16739,8 +16739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16754,8 +16754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16769,8 +16769,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16784,8 +16784,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16799,9 +16799,9 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( + query_index: 28, + column_index: 28, + rotation: Rotation( 0, ), }, @@ -16858,8 +16858,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16870,8 +16870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16885,8 +16885,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16900,8 +16900,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16915,8 +16915,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16930,8 +16930,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17001,8 +17001,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17013,8 +17013,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17028,8 +17028,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17043,8 +17043,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17058,8 +17058,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17073,8 +17073,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17106,8 +17106,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17118,8 +17118,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17133,8 +17133,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17148,8 +17148,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17163,8 +17163,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17178,8 +17178,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17211,8 +17211,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17223,8 +17223,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17238,8 +17238,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17253,8 +17253,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17268,8 +17268,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17283,8 +17283,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17330,8 +17330,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17342,8 +17342,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17357,8 +17357,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17372,8 +17372,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17387,8 +17387,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17402,8 +17402,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17435,8 +17435,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17447,8 +17447,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17462,8 +17462,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17477,8 +17477,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17492,8 +17492,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17507,8 +17507,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17540,8 +17540,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17552,8 +17552,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17567,8 +17567,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17582,8 +17582,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17597,8 +17597,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17612,8 +17612,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17645,8 +17645,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17657,8 +17657,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17672,8 +17672,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17687,8 +17687,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17702,8 +17702,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17717,8 +17717,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17776,8 +17776,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17788,8 +17788,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17803,8 +17803,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17818,8 +17818,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17833,8 +17833,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17848,8 +17848,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17881,8 +17881,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17893,8 +17893,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17908,8 +17908,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17923,8 +17923,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17938,8 +17938,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17953,8 +17953,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -17993,8 +17993,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18005,8 +18005,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18020,8 +18020,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18035,8 +18035,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18050,8 +18050,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18065,8 +18065,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18105,8 +18105,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18117,8 +18117,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18132,8 +18132,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18147,8 +18147,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18162,8 +18162,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18177,8 +18177,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18248,8 +18248,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18260,8 +18260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18275,8 +18275,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18290,8 +18290,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18305,8 +18305,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18320,8 +18320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18360,8 +18360,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18372,8 +18372,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18387,8 +18387,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18402,8 +18402,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18417,8 +18417,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18432,8 +18432,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18472,8 +18472,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18484,8 +18484,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18499,8 +18499,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18514,8 +18514,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18529,8 +18529,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18544,8 +18544,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18615,8 +18615,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18627,8 +18627,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18642,8 +18642,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18657,8 +18657,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18672,8 +18672,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18687,8 +18687,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18734,8 +18734,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18746,8 +18746,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18761,8 +18761,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18776,8 +18776,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18791,8 +18791,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18806,8 +18806,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18846,8 +18846,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18858,8 +18858,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18873,8 +18873,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18888,8 +18888,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18903,8 +18903,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18918,8 +18918,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18977,8 +18977,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18989,8 +18989,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19004,8 +19004,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19019,8 +19019,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19034,8 +19034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19049,8 +19049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19089,8 +19089,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19101,8 +19101,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19116,8 +19116,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19131,8 +19131,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19146,8 +19146,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19161,8 +19161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19208,8 +19208,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19220,8 +19220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19235,8 +19235,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19250,8 +19250,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19265,8 +19265,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19280,8 +19280,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19339,8 +19339,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19351,8 +19351,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19366,8 +19366,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19381,8 +19381,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19396,8 +19396,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19411,8 +19411,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19451,8 +19451,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19463,8 +19463,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19478,8 +19478,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19493,8 +19493,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19508,8 +19508,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19523,8 +19523,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19563,8 +19563,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19575,8 +19575,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19590,8 +19590,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19605,8 +19605,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19620,8 +19620,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19635,8 +19635,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19682,9 +19682,9 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( + query_index: 29, + column_index: 29, + rotation: Rotation( 0, ), }, @@ -19694,8 +19694,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19709,8 +19709,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19724,8 +19724,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19739,8 +19739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19754,8 +19754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19813,8 +19813,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19825,8 +19825,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19840,8 +19840,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19855,8 +19855,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19870,8 +19870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19885,8 +19885,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19932,8 +19932,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19944,8 +19944,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19959,8 +19959,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19974,8 +19974,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19989,8 +19989,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20004,8 +20004,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20037,8 +20037,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20049,8 +20049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20064,8 +20064,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20079,8 +20079,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20094,8 +20094,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20109,8 +20109,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20142,8 +20142,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20154,8 +20154,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20169,8 +20169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20184,8 +20184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20199,8 +20199,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20214,8 +20214,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20248,8 +20248,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20260,8 +20260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20275,8 +20275,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20290,8 +20290,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20305,8 +20305,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20320,8 +20320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20335,8 +20335,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20395,8 +20395,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20407,8 +20407,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20422,8 +20422,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20437,8 +20437,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20452,8 +20452,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20467,8 +20467,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20482,8 +20482,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20542,8 +20542,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20554,8 +20554,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20569,8 +20569,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20584,8 +20584,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20599,8 +20599,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20614,8 +20614,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20629,8 +20629,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20663,8 +20663,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20675,8 +20675,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20690,8 +20690,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20705,8 +20705,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20720,8 +20720,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20735,8 +20735,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20750,8 +20750,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20784,8 +20784,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20796,8 +20796,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20811,8 +20811,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20826,8 +20826,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20841,8 +20841,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20856,8 +20856,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20871,8 +20871,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20931,8 +20931,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20943,8 +20943,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20958,8 +20958,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20973,8 +20973,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20988,8 +20988,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21003,8 +21003,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21018,8 +21018,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21078,8 +21078,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21090,8 +21090,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21105,8 +21105,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21120,8 +21120,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21135,8 +21135,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21150,8 +21150,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21165,8 +21165,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21225,8 +21225,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21237,8 +21237,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21252,8 +21252,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21267,8 +21267,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21282,8 +21282,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21297,8 +21297,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21312,8 +21312,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21346,8 +21346,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21358,8 +21358,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21373,8 +21373,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21388,8 +21388,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21403,8 +21403,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21418,8 +21418,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21433,8 +21433,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21467,8 +21467,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21479,8 +21479,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21494,8 +21494,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21509,8 +21509,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21524,8 +21524,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21539,8 +21539,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21554,8 +21554,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21626,8 +21626,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21638,8 +21638,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21653,8 +21653,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21668,8 +21668,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21683,8 +21683,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21698,8 +21698,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21713,8 +21713,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21773,8 +21773,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21785,8 +21785,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21800,8 +21800,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21815,8 +21815,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21830,8 +21830,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21845,8 +21845,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21860,8 +21860,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21894,8 +21894,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21906,8 +21906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21921,8 +21921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21936,8 +21936,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21951,8 +21951,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21966,8 +21966,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21981,8 +21981,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22015,8 +22015,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22027,8 +22027,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22042,8 +22042,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22057,8 +22057,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22072,8 +22072,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22087,8 +22087,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22102,8 +22102,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22136,8 +22136,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22148,8 +22148,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22163,8 +22163,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22178,8 +22178,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22193,8 +22193,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22208,8 +22208,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22223,8 +22223,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22264,8 +22264,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22276,8 +22276,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22291,8 +22291,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22306,8 +22306,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22321,8 +22321,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22336,8 +22336,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22351,8 +22351,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22411,8 +22411,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22423,8 +22423,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22438,8 +22438,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22453,8 +22453,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22468,8 +22468,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22483,8 +22483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22498,8 +22498,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22558,8 +22558,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22570,8 +22570,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22585,8 +22585,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22600,8 +22600,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22615,8 +22615,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22630,8 +22630,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22645,8 +22645,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22693,8 +22693,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22705,8 +22705,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22720,8 +22720,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22735,8 +22735,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22750,8 +22750,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22765,8 +22765,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22780,8 +22780,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22814,8 +22814,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22826,8 +22826,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22841,8 +22841,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22856,8 +22856,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22871,8 +22871,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22886,8 +22886,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22901,8 +22901,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22935,8 +22935,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22947,8 +22947,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22962,8 +22962,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22977,8 +22977,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22992,8 +22992,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23007,8 +23007,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23022,8 +23022,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23056,8 +23056,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23068,8 +23068,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23083,8 +23083,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23098,8 +23098,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23113,8 +23113,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23128,8 +23128,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23143,8 +23143,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23184,8 +23184,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23196,8 +23196,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23211,8 +23211,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23226,8 +23226,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23241,8 +23241,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23256,8 +23256,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23271,8 +23271,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23312,8 +23312,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23324,8 +23324,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23339,8 +23339,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23354,8 +23354,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23369,8 +23369,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23384,8 +23384,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23399,8 +23399,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23471,8 +23471,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23483,8 +23483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23498,8 +23498,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23513,8 +23513,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23528,8 +23528,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23543,8 +23543,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23558,8 +23558,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23599,8 +23599,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23611,8 +23611,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23626,8 +23626,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23641,8 +23641,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23656,8 +23656,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23671,8 +23671,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23686,8 +23686,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23727,8 +23727,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23739,8 +23739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23754,8 +23754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23769,8 +23769,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23784,8 +23784,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23799,8 +23799,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23814,8 +23814,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23886,8 +23886,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23898,8 +23898,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23913,8 +23913,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23928,8 +23928,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23943,8 +23943,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23958,8 +23958,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23973,8 +23973,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24021,8 +24021,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24033,8 +24033,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24048,8 +24048,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24063,8 +24063,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24078,8 +24078,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24093,8 +24093,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24108,8 +24108,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24149,8 +24149,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24161,8 +24161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24176,8 +24176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24191,8 +24191,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24206,8 +24206,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24221,8 +24221,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24236,8 +24236,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24296,8 +24296,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24308,8 +24308,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24323,8 +24323,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24338,8 +24338,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24353,8 +24353,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24368,8 +24368,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24383,8 +24383,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24424,8 +24424,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24436,8 +24436,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24451,8 +24451,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24466,8 +24466,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24481,8 +24481,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24496,8 +24496,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24511,8 +24511,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24559,8 +24559,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24571,8 +24571,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24586,8 +24586,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24601,8 +24601,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24616,8 +24616,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24631,8 +24631,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24646,8 +24646,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24706,8 +24706,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24718,8 +24718,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24733,8 +24733,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24748,8 +24748,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24763,8 +24763,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24778,8 +24778,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24793,8 +24793,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24834,8 +24834,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24846,8 +24846,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24861,8 +24861,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24876,8 +24876,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24891,8 +24891,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24906,8 +24906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24921,8 +24921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24962,8 +24962,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24974,8 +24974,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24989,8 +24989,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25004,8 +25004,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25019,8 +25019,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25034,8 +25034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25049,8 +25049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25097,8 +25097,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25109,8 +25109,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25124,8 +25124,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25139,8 +25139,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25154,8 +25154,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25169,8 +25169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25184,8 +25184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25244,8 +25244,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25256,8 +25256,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25271,8 +25271,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25286,8 +25286,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25301,8 +25301,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25316,8 +25316,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25331,8 +25331,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25379,8 +25379,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25391,8 +25391,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25406,8 +25406,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25421,8 +25421,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25436,8 +25436,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25451,8 +25451,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25466,8 +25466,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25500,8 +25500,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25512,8 +25512,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25527,8 +25527,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25542,8 +25542,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25557,8 +25557,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25572,8 +25572,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25587,8 +25587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25621,8 +25621,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25633,8 +25633,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25648,8 +25648,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25663,8 +25663,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25678,8 +25678,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25693,8 +25693,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25708,8 +25708,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25742,8 +25742,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25754,8 +25754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25769,8 +25769,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25784,8 +25784,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25799,8 +25799,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25814,8 +25814,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25829,8 +25829,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25889,8 +25889,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25901,8 +25901,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25916,8 +25916,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25931,8 +25931,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25946,8 +25946,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25961,8 +25961,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -25976,8 +25976,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26036,8 +26036,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26048,8 +26048,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26063,8 +26063,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26078,8 +26078,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26093,8 +26093,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26108,8 +26108,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26123,8 +26123,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26157,8 +26157,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26169,8 +26169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26184,8 +26184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26199,8 +26199,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26214,8 +26214,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26229,8 +26229,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26244,8 +26244,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26278,8 +26278,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26290,8 +26290,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26305,8 +26305,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26320,8 +26320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26335,8 +26335,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26350,8 +26350,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26365,8 +26365,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26422,8 +26422,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26434,8 +26434,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26449,8 +26449,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26464,8 +26464,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26521,8 +26521,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26533,8 +26533,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26548,8 +26548,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26563,8 +26563,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26620,8 +26620,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26632,8 +26632,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26647,8 +26647,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26662,8 +26662,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26693,8 +26693,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26705,8 +26705,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26720,8 +26720,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26735,8 +26735,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26766,8 +26766,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26778,8 +26778,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26793,8 +26793,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26808,8 +26808,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26877,8 +26877,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26889,8 +26889,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26904,8 +26904,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26919,8 +26919,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26976,8 +26976,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26988,8 +26988,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27003,8 +27003,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27018,8 +27018,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27049,8 +27049,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27061,8 +27061,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27076,8 +27076,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27091,8 +27091,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27122,8 +27122,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27134,8 +27134,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27149,8 +27149,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27164,8 +27164,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27195,8 +27195,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27207,8 +27207,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27222,8 +27222,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27237,8 +27237,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27275,8 +27275,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27287,8 +27287,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27302,8 +27302,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27317,8 +27317,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27374,8 +27374,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27386,8 +27386,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27401,8 +27401,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27416,8 +27416,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27473,8 +27473,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27485,8 +27485,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27500,8 +27500,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27515,8 +27515,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27560,8 +27560,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27572,8 +27572,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27587,8 +27587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27602,8 +27602,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27633,8 +27633,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27645,8 +27645,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27660,8 +27660,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27675,8 +27675,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27706,8 +27706,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27718,8 +27718,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27733,8 +27733,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27748,8 +27748,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27779,8 +27779,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27791,8 +27791,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27806,8 +27806,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -27821,8 +27821,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -28125,7 +28125,7 @@ PinnedVerificationKey { fixed_queries: [ ( Column { - index: 3, + index: 4, column_type: Fixed, }, Rotation( @@ -28143,7 +28143,7 @@ PinnedVerificationKey { ), ( Column { - index: 11, + index: 1, column_type: Fixed, }, Rotation( @@ -28152,7 +28152,7 @@ PinnedVerificationKey { ), ( Column { - index: 4, + index: 12, column_type: Fixed, }, Rotation( @@ -28215,7 +28215,7 @@ PinnedVerificationKey { ), ( Column { - index: 12, + index: 11, column_type: Fixed, }, Rotation( @@ -28224,7 +28224,7 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 13, column_type: Fixed, }, Rotation( @@ -28242,7 +28242,7 @@ PinnedVerificationKey { ), ( Column { - index: 13, + index: 3, column_type: Fixed, }, Rotation( @@ -28393,6 +28393,33 @@ PinnedVerificationKey { 0, ), ), + ( + Column { + index: 30, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), + ( + Column { + index: 31, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), + ( + Column { + index: 32, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), ], permutation: Argument { columns: [ @@ -28441,19 +28468,19 @@ PinnedVerificationKey { column_type: Advice, }, Column { - index: 3, + index: 4, column_type: Fixed, }, Column { - index: 8, + index: 9, column_type: Fixed, }, Column { - index: 9, + index: 10, column_type: Fixed, }, Column { - index: 10, + index: 11, column_type: Fixed, }, ], @@ -28463,40 +28490,111 @@ PinnedVerificationKey { input_expressions: [ Product( Fixed { - query_index: 14, - column_index: 14, + query_index: 15, + column_index: 15, rotation: Rotation( 0, ), }, Sum( Product( - Fixed { - query_index: 15, - column_index: 15, - rotation: Rotation( - 0, - ), - }, Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), Negated( - Scaled( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + ), + ), + Sum( + Product( + Fixed { + query_index: 16, + column_index: 16, + rotation: Rotation( + 0, + ), + }, + Sum( Advice { - query_index: 17, + query_index: 9, column_index: 9, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + Negated( + Scaled( + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 16, + column_index: 16, + rotation: Rotation( + 0, + ), + }, + ), ), + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -28506,13 +28604,36 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 15, - column_index: 15, - rotation: Rotation( - 0, + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), ), ), Advice { @@ -28525,6 +28646,96 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Fixed { + query_index: 15, + column_index: 15, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + ), + Sum( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), + Product( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + ), + ), ], table_expressions: [ Fixed { @@ -28534,14 +28745,21 @@ PinnedVerificationKey { 0, ), }, + Fixed { + query_index: 2, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ], }, Argument { input_expressions: [ Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -28559,8 +28777,8 @@ PinnedVerificationKey { Product( Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -28568,16 +28786,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -28607,8 +28825,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -28628,8 +28846,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -28642,8 +28860,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -28757,8 +28975,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -28778,15 +28996,15 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 11, - column_index: 1, + query_index: 12, + column_index: 2, rotation: Rotation( 0, ), }, Fixed { - query_index: 12, - column_index: 2, + query_index: 13, + column_index: 3, rotation: Rotation( 0, ), @@ -28797,8 +29015,8 @@ PinnedVerificationKey { input_expressions: [ Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -28816,8 +29034,8 @@ PinnedVerificationKey { Product( Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -28825,16 +29043,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -28864,8 +29082,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -28885,8 +29103,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -28899,8 +29117,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -29014,8 +29232,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -29035,15 +29253,15 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 11, - column_index: 1, + query_index: 12, + column_index: 2, rotation: Rotation( 0, ), }, Fixed { - query_index: 12, - column_index: 2, + query_index: 13, + column_index: 3, rotation: Rotation( 0, ), @@ -29053,58 +29271,61 @@ PinnedVerificationKey { ], constants: [ Column { - index: 3, + index: 4, column_type: Fixed, }, ], minimum_degree: None, }, fixed_commitments: [ - (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), - (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), - (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), - (0x20700a506e3d86a64a39b130676dddce5f1b2bf0334fec71ed2551c204822c67, 0x3b6942d1884ab8af10fad654411308e22b2cd04efc964b92fd921678436c0c98), - (0x01050032408d33b1dfaede46b04fa62672309dd6068c0833589f4c8080e829a2, 0x0e3f605da6ff82b3aa6ad00dcf43b9478f05ff876599522bf6e560d3d014fc34), - (0x3de6d72fbecfa7c79cc390c6a7d5f80f1bcdb6ec66967002c0f003890ca6e1fb, 0x188d7336a6662b8e16e4b3a279958e60dbe1f86bfdbc1dca253db40235430f44), - (0x1581f8e414673d197d0cd5730da9bb65faae27e4a7aa70055f1c92d70fa31f7d, 0x3262ae14b4137e321618661aa7a5f4b817ff8b2846d9362813da34512c6bd965), - (0x21c96b5ae31bc87ecc34afaeb56d6c155b624b22f23f474ea80fc0bc7312735d, 0x123f4ffff944155267ab11f68de7573cb27a78b30d96ad315756086adfc75137), - (0x17a4fffca31db428439c483107a7b92f8b81451bb66892f2e8b2e4a3f2181083, 0x31f214f9e19e6282a502fd0984b81b9f7c761d66236e7600049e45ec7acfe778), - (0x31efd1ed8ab3ef69dd0a927b9c371fc0e9a2dfbd3586c5f596133f2605445850, 0x28da702b4e3f6df487b6530829a48751c10557127d11b0056c7c581091a8e03e), - (0x098c8a506a6d33d2744d0e1810c2b5070d49f597c8b87fcef67ee008da94f56c, 0x3d7dd49111a5e9834dbd5c1fee58ceae6ac758ee167522843fbb50bd95715cab), - (0x17c91b96eabea3a9ff280ae99e74bb96e80e14d770cf5d0a35814500c08159ac, 0x021d68cbd102f26c8c1b849312c3970f06d0e8c4733d325c5247137da3f940eb), - (0x3c0f3f0d7b2306490dac7d578d4846c63adcc76988ce322d8691c3b8b5b0f623, 0x12d81ca672a1c18f6e0d9b7eb8fbabdbe450fae6667cf349c1a0e63ca9a0824e), - (0x27d13b33003ffddcd36efb731fe94db93d181bd994e0c057e945402bc8501789, 0x0e1dde94ea3b35e0d0a66350163ba2ff9dd5070500912b7d076747816965ffd2), - (0x3fdc611a96e66e8f5c21c211bff2006204c4884b2c6df9b55d92420af8e32d15, 0x0a525125d5a85a579cbc8e4862b88800d7dbaf8a8adc18bd0181bbbab9434b8d), - (0x245ebb4ccefa7c4e2d5a9d7b1746b8277abc25f74cd11b2dbb752d49612f248e, 0x145f605111205a7c3e4620ac035b3cccb6375f8d3c3469b7900e427607c401c9), - (0x1751912a19fa0009ece61b686342d6b4385415e942159e8db3f174ad24d612b9, 0x0f31114ef566211d46914d0bc2d1a27a0e34eeda04dab53a0af7a37024f057a1), - (0x091c6c4854fa5d9ed8a966f2a1c4946b41f6872de6c19fa8b521a0a8eb2bd899, 0x29100b4e15344d750fae4a81c82faca1e8e0573336b1f54b394946e95e7baad0), - (0x0f1d83f1dd2f4ba4d92cae2a2f40fc6d5d66fb2b6d1f1a2e981931cfc7c751af, 0x385ae95bb483cc65bb507d8418e447a7ad8346bc52b5114913d1e2c25c0fd11d), - (0x070664e70f0b48311a30b833a6b93cdf4ab06b872f28a723b935c88802275bd0, 0x1a3c22a9ff9d9d5434b8b979d6635d135d909b143927bc90a96cde88c6e93331), - (0x34c8b83a2cc924f1b0237978c8f911e6a54375c509ba46456a011fbb74c8698c, 0x260cc681c222535c0030f702172ee8855b681c16d706b1b9a786165e06705de6), - (0x1b7a61e8a9b32fe558433feec9aaf51204e5486aa468d7215087ed35fd6ecbe5, 0x1f36dc6852f92c141ba800f721d079ffc553c7449b85d16e7487e0c3009c7835), - (0x3bb657ca32617e6242b6c6a0b166a1db205024d0441d091b8d45fb478cd4782c, 0x3189ce1b97103345fc0eafd287eed80ab186151171f22af2c9befc71a0957529), - (0x25578b0a6d546cf38dc84329fad41e59690a2bd94a0db5fddb42e0db8c267827, 0x03448e4552625dda62a96318bcafcc305deafd6a028f8379d8c8d9ffa0f86e64), - (0x3eab58caf9fc2aa3fee6d649cf087fe9bca284c27f57c08410b0f8a7e09d634c, 0x04b350dc56fe19a25da0882d2acb6622bdad1c4b3e2200d35acf689782c20da7), - (0x37e00880dbfd31f1c3f86201583025a666bf48745428ac39caa1d0a0acaa0bd9, 0x0ff8ef43177aa324665a296a9a444fb4a6666e250930a039a687e53acc43eddc), - (0x0934479f5c328fdb235ac47bf94cb8551784068de4fc26f0dcdca078138cb71d, 0x213f745ff2233ec74c310b142665e4e223643eb72607fc50b98aae5c7149c78f), - (0x1a98842473bddb61c943296a39cc0a8a41cec5aa02696bd0a97569ca9f839186, 0x08291ab77b541973368946a0d14c85c69a142bfda31f9021328c98b69be25e3c), - (0x34a41b2fa64d913ddc6df62a3b881658ee29bd5c69154dc30bee28d64acee443, 0x1d88f6fd73525eeb4e8b0531297edcd107bf3c2303dd615f34732d7fb01a9b16), - (0x0a6e085a051cab2808d58f29990b4ba83ed49fba5f363f67b78c329514ac79e5, 0x20b236e5722f4cff16ee1607ffa3bf60c63e9f866b27d85e85a0b06b0b8c58ec), + (0x3887a29815d3a28d43c453904169e07def787baca6c9452505d2de78dd44b86f, 0x2f95e59472ab087725d62deea9c3b406ae490eff7c0318269d6f2b025934cc70), + (0x0decb727cf32e573604ae3928a761b450d9460f2a7283c8cf88a2b38b796e575, 0x044c0a88bc6aa468e75fc709f9eb21b6e309dd8a6ca62f7a3da86299141ea3a9), + (0x285e16cead69d5fef9441d4d4ac695fe8880120d209e1e631d8a4bc5f55e90e6, 0x3700fd2dfcfac5b2cb6d33c60ac79dfac3fb95518cd0aa97c75a51d62281f2c1), + (0x2dc11f4f0000da15c59cd395ea5f32b4e79783d958c290c821c89e0bcb50eaf1, 0x2c53e12ce0a2022516ef31f0224b0bc1b119861078358f78d245ba5d2f180099), + (0x02656490d7b8420bfe91e220b7d95ff7e79bca851ec0d26cb2221772c25e8638, 0x0ee047851a6b3d0038ff02a38782e8d349febf23035d21227fb95693083eb710), + (0x1dd2f90c7130eabb75c1f83620474ecd7565c6751cac21e6b3400e2554cb30ae, 0x0135321193a6f63fd7bdcbe4ec21c79cf2705deb072779586e4eafdbd52cc0eb), + (0x29a5048146830326a4c86c7959158cb88e6be880e1980adaa3d4bbdc1e4aae22, 0x2b1c22a72f40fc3196890c6e8723a9df96a73c0d81c83c015af087f920da8465), + (0x0087eb927dee14807ad837123f7ed3e34accaa3739d3e6172467acc8671c2653, 0x351df64e5f2b6956c800cc9c5e3a0e875b6f700be165bc478b53caf05776f9e0), + (0x319b61505610a63e57bbc53df58f1086f5840a826163fd5ca22b8d4a3238abbe, 0x232fe2570f8b5df28088f667ca920fe603329464a3a9dcfdbc78497aee19193e), + (0x3dfff1fb77235cfc3c9b39b7c4f99b5df4e89e957155385507a4ea91750069a2, 0x0a60bb0d445d0cf8fa75d1625b6ad86944d150c6679f00e78016829bf47ffa12), + (0x37bdb76a767d836c13381bf59417e256c1b326df542851d623617f2a45c59992, 0x09509cfe95dca7401708bab0ce45a126bac7fc5051b1c45f119e54a4e5fd881d), + (0x2d482cf0c1c13d6d2afe85feac3f565d054238acc10b7ff78dc08cb9aea3a5ab, 0x2f7182906fc5aa8952982e96ae29891fc988d468623244e02ea8453b5b3c65f8), + (0x184b191b2c11511c81ace6f3a56f833c5b6465a7a394dad84226588b7750969b, 0x0d200f2a66888760d60a9e117a85d826abe27a0f7cf6211b2ddf843475667618), + (0x04fae4e51e99d50ff8a55a449c0234a9a613e996a9b202db18ef01e7ad42b052, 0x1d083ab8f2c454ea5e1f9cf81a419a4a55347136c4feff75ec8a0a19f909d558), + (0x12d6a260a08c59e9df032cd6c855f081d99321fe2f33d33508b4180411f0dadc, 0x31fbd5ce92f6cd283658690e93a0bcbb515b1aa9728024f5eb583f5f27da6a11), + (0x3aaa1190000787a9cc4008d68adf7a91b48ff5470fdfb3d3ee36f64df7cfd045, 0x2f1723e3595adf0106d4fe2f11af025978f616b6697036c27ebbd682a013928e), + (0x1bbe9643cceac1b79ea642312b57cf5b7739a2accb6641c7c902a0651f8c90b2, 0x3a7c2a5db44cd0fa31f5a26206fc3ea8e81fea14ddbcdab3204dbcd840a14184), + (0x39a9e0b36cd0cf9445f6533d02ea7187f1d8100085a6228509c8af4743f2eb24, 0x311a439a351fdadfaced9213ff8bcadca7a03d1bc18d9f4bb33ea1806bc2c6be), + (0x0957fb68f275d18d730f9c106de4b4cfd966b3eeb0434b1ea66ddfda2420a8ad, 0x1ae46e6b003224d3f30eb366fc3d9db07d07ded1c474d239602aed8ac859e895), + (0x3d5fc48944b2527964ab562447e540f7512a225c2468ba76398dbd6842bcd776, 0x22ca98fd09c21884a128d63511bcd366d7fa61d7b21271e0c0927b4677c7242f), + (0x03be84ba69d6def665955d6dc72a6f647cb206de2fc5cc6d0e1474354bb03f3e, 0x1eabb979cab6e3e9a82d7b692d18e9757b684f1b855845db1ed8925f3b9ad918), + (0x0c1fbfb10301c163416949dff37b9334f8c62372f154386e40882b4327d0cf98, 0x19f48dbe5b56cb8711943bed857307de739099a1cb78c12a1015770f8553c601), + (0x2096a01846851be44913d49936d7362716c296970aeba41f35b23946cc1fa41c, 0x3af057b14acc535df8dc9f159a1290d92b8fa875b1982d669b0df5a4429f59e6), + (0x334105dd96996a08df56e88261dcd87c5356cfc0f2b8ae0a9419899d5def147b, 0x09ddf24ae765eda056cf59b16ac14464240c83e253135682c02e6546f89dd396), + (0x0aa9bf3b3cae0bbeb70f32d96a43603853872c28ef246db1bb85c885e112b4c1, 0x0718dce6ad248d2cedc43f3a23ec6d4d7dd305cb6f8fc9a3098a11acf42b5967), + (0x06fe6f3926a9de1432ebf4934fef695942a41eaea45a2c42d6af795af6dd1f7b, 0x30342fc0dc2cdec7fdf1aab0eb28f7ca21b4dd478c596540444c0932d8dd56dc), + (0x12fb328eaf326033eb7376c6aa6aff345bbb300b7e5fab858feec8cd3e4bdf58, 0x28bdf84118d334220e557ae9959a091ceb54c36d4a6d1f8a1518948d8a8124c5), + (0x0558514fa4d8feae12519efa8c79b7e7fe327642f28455ae300cffdc21cf5a22, 0x22c8f7ede18bcf4083f7cb6bf94b1de06305107537bcc31027dd400a7455dded), + (0x0aa54dc82361b7d6f35e36d55290ede3e4962e85665475fb15e51b626c849f7f, 0x16927eaf3dcbd28a8e1eb1a19235a512da8858d10040d3b26425ec054ce0eb3a), + (0x39c1526f64989d617bd43b64427f26c5068485b3d635bbb746b6be5ebf8361c8, 0x398ab66905a4e1e36fc3e2da5d1b1e918bda970ad17d46cd08b852e51879ca6a), + (0x3aa89e6834df650fcbdc0a295b03a58002cdcd14198f8af3069eb222d2d17c66, 0x067ec4c41d0352ea32b5872af2b051c78882157d0ae87486dce3c4c2c29877f9), + (0x1394764de03aaa28c9a9d2b91798a25629d0412264057ef247c6faf21e4354e3, 0x1de01702d1d58eff7824e40712beb1429a101c1ed844fcaa7100519f85faffd7), + (0x261a83f8122eb036760791a4e9d52235df4939fdf8175f8d240a333e06557e7e, 0x184fb28734999d991d4bb862d1e47e3ae20336706f82ceb180609fa68fd85501), ], permutation: VerifyingKey { commitments: [ - (0x26d7150d98acf5efa7739440641d97629e2d6553547920432e43d747b998d49e, 0x3223285fb44e1736e7216cd51276087bce39f7e5c0fdb1ef49ab4c6de26b256d), - (0x07800024b352149368405f222a8dfbf373bd4603df89929a5d00f7ac9ffac504, 0x250be8a84de9a8ded91e85860f1b1751f6bd2c0aba96329ee2d6f0e377f4679f), - (0x3384b0dbfa6553ad5adf0b218df2cbe6243c33102a97774b4e023ec1dc2d83e9, 0x2873fe49458cd70b9d72419e0d6a6ceadb8070f4b62a0bb47c58a89269e0b583), - (0x38def0fd8f233ef8651a28ffb7ae6f1e4eaeb0acec19453a3e5a0d70b2058782, 0x0512c67736284a225f0b6617cabd76ac2e4a6805940af4480798ca884e02d277), - (0x26b6d69fd8c13013c6ab5fb74bd3fbe85d01b0abb57e149ff53e77a535c6bf40, 0x05ae4f52e4ab72ff3cf2b64df6d371fda270f4f78ed0bccce8e3138d4e30e4a0), - (0x3f1b6f3ea5a2b24646dbe1c6f7c7dbf797fe6602a344bed59668ba5413519631, 0x0401a6f6ed893aa112f234127f8c30ee6e09b45f75993351aea9974389b261d6), - (0x2f34843015cfc9c9ff59c7ecab3cbb6aea69dcf6f5af79e166f25d90f70353d5, 0x2bcfde5880412d171705b41124b404a323697c4d1008b2e8b2bf9966e5809d3d), - (0x082e9af26adc31f97c38ce587ffde9af5d8238d16ad61a236bbd3c805515f144, 0x051d36eb85b6402dfb2a55ae1507b358319d016483d7ecf6be49793bbb64e79e), - (0x240a361e73afa04a2e5cc578680e54bf28e3375dbb35a8918c3cdbc91f1bc25b, 0x161c53e65c1b6500b576d8fa982e2565dbe35954840b0bab8a3d912158b9dbe7), - (0x32f883bbd63b0700f0150ea8d71f6f5d7cdcc4463289983d71e9bc104d4a5c28, 0x33aeb42bec794138b8db28696bd7cef4946a8a89edcbf3f8289655ff9f9129ee), - (0x03f33d3064517ab1a8e538444013bd0d6b011f9923f8cb964763a88d6d7409e0, 0x16f534b6d12d9e011b951e374982f048f0bed808099fd3ed97cd827360f6fb65), - (0x0ee42598f7ed2c349d720bdcbe34f85d6650e1b3f2add5a71ab0bf330fcd4f51, 0x346a2c51d2895839bb3e556eb20e6af8f5248f2d538a1407622c9d69bde1448a), + (0x286d1f6ab2fb58b3ba974d1807c606914deea07b64615089452f1feaa06ef0db, 0x08bb42474059164d528fb06f0b80b08b3ebdc87cbe0c2718d0c6199984b2119d), + (0x31fd9e62ffdd86ec55a2ead7a4b74dd21ddcf56029dc5d334491bffc7bd2ffb3, 0x2f990b235ee3f35e09a77f1414d21fab06cc60fe8fe6f52407d7599204632cd4), + (0x2044e502b5716abe00c9dde5348392b4fc489b5097aca8f5401a5153820903dd, 0x155aa6b3f9ea3e01f25eca37b0a62d28fe24a1a96d033c074e6cb22b08d118d5), + (0x36599df2c3de06015c3167fe0b2b22aab1ae9587ff050977193d5d753c8be6a8, 0x32b02df0138a92f3b23556ad96f9ef9bee0c34c8900cb4ecaadf3252ae4e0edc), + (0x13631970b4bae5c49d31638a2af724495c8b2074bd015f3c1c06af24956ca995, 0x1b7e3517b6db255c9b71753707de5d6fb33f83825ad8416db482669daac81ba3), + (0x021eb6e340ea808444c833c25e326c03223ea3fb458771e814a7d9130eddeb74, 0x230be5c1f0b81145d7a45c032c4dbc68e53db1fbda374a0f0d2e0da702032b2f), + (0x18720c0f1f48ad21f6e1d0d33adc569ac901c68cdcb16d5398ac986b421f7038, 0x11cf59a013ad87f91ce8567087a80ee9395af8fc1383ac10e490d9c903290a09), + (0x007f8cdd8d1fcd8f5a32af8e1b3347ef4c8b41fb46c93eeac7895851009cc5da, 0x37b9278f063e6d6a578aa76657ff19dffd9d00d572711bfdfbfff13b16a6c6ce), + (0x20d64c097c7b989a44316bdc366ae83097832f00289736b772bea49c4e7b00e1, 0x3db86fbe002fea7ec1504b8c3a37781255f3990674df29c3df80b01c346599dc), + (0x3a80a8a3e35f9d6d83a547f054657216eea971085206d9a1fa1da905b4ebeff7, 0x18501e269b09e80f6465be2cdfdfea1140edda48656e7ea57f9134c1426a05bd), + (0x3aa059c2e0c14fe94e426dce09603ba37f6674a0643c3084822fd9c6f90a9208, 0x1512147967321b4ef9e690745a80b3f58a55706151c6661f112d84eed9e3f83c), + (0x00bccfb987b16c011682099a4600073bf54c652644cbf2e52c55654af4047592, 0x3a2ea83323de8bc350419de781b6ac0481845cf87d83430d29782e3d62d134d0), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 83ca7c0535ed0da94d2aca22e3f9553b7fad9eed..4dda7dc769a2a213c843fb2cb93181c282c89db1 100644 GIT binary patch literal 5283 zcmV;U6kO{&1jOWGSp|w}?L$%a003kU&&A3xxkGssGt6XWNA4>~3Ye%b6p1nM12CkP z(@GYXP>mun&O_9chI#{d;}no9W*6pOI#P77I7N*ysP=O*26@`$I`jFW(@{ z%RQu-Wm-XTQxT4Y)&tYbQ<5te*|h@nC_#QGYqupV?^%4wq=K8yVJh!Q@mcVpkJQ#1 zw6J8BmQ!P3Z5I{+0RZi&AM*~8(?qN-^~Hi>m>>)C6>n@d;}3w%Z%+NfTqR}%AR(Zg zHUqK39l(fU^eWoW`b?hNRg6w+jqn@@yYE{}2%z!KFyIUPHv~O_p+g$56L#uPvp9vN#W9bU$kspgb3e!D)qT-AO|GUO5gO zPjBPE9C~RN5YVK;t_gG9;Z)Q=aDBRYObgrdqPAVegX-LQBVlSQFS`85*{r zL-}9Zo=nFMq#W+K=d^>UdjG#9qGNgwgcW9emZ%xB(kaqYcVies48N6^(5{BBQvQRx z1h6h=bkywms)~r=u%r7modmL0y(@G#&8?_9uf%qpM@>qwPNp<}#M=67Ds?jgLo*k0 z+pgHzM~_>1O~~#oBkTg3%AUJ4Sj%~$5Zy-EkJJ0D!Jk2fFP7i46$1Ykm#qT&#fs*1 zUe%#;P@>b^%Y$h52_~iJpAXGcRklf>tIw525iZv88~)?-nw{*qYG@GAPBB3nCGqj>G@0{&xv3X^=fIPXyL~%(TpMIi2xmvyD+s zsGybD@J&@mm}a9ZngTJc zjGY3#VHQ47D8g_`21!A=>3Iw7p}Po9>CMH~HMT&%EA)9&X;x}E@W^ywP`5~@#ph#F z2#48#*G$CXmJz}^ThYe5;hxkp(79=lu*z5+Tt-DbP$l5{t<~z(q49*-&cU2$?JY;w z5V-as*G*y8)~S}ZTbzP(Iqhl;TS>-#pBL2)xUQ00&8V0-K3i@83t0$!ayMoUI*zom zIGt`&?^VIo!OmUne*fyGHL8wDEo();q$77NH<=0*OQj-Tv|>UbWz@i1Khx|&eh7(2 zW;$Mvh8KIs^dQvV8RxX)nNhOsC31vsKJ$|SUk70I3L&A6Bmsg&?1X1AM!B5QipC9w z2%(v+jIMyJPDWVLMfgDF^b>KeMS38TA&i)5HAo&*GmBYyO;3co&ZCGO&~BpNiEwm_e@sc z;P618Y9O(n-8?kUXco**0)M2j9=NyTF)%|hVvk+gQ@sD(dU>@zNHEd}P#>OfEhoM_ z0+!~Cz5e@lJdQ`2rfArehkkpJiZ2ap|biF6i$N?sTPWy&Pk#l zD84mv6wgu`ogn@9r@(rb^)+9Ng$>-5s5={?_ccW+8(Uux@Mz`0*229A=ejfCNxJ;S z-A60EK|DY3$xyAC1yke^aHnEbiZip)ueA!ruH61_6k8o9jqA?nodvJY# zt&1u8Po*m=$;m_rL=PFAdpXd&FflfQve{eXkW_EF%HNt-!=6HxZkY)#^5lt2wI8{3 z&ZKRxD?U8`jQ{+&y`^PNb(&wzjC{rQoU$YQ5^PvJ@~xnISTk-X5XD zI=*+t=A~uCy>$YWv6I_rfw8HuC*)A>O<_{j~DZEyBSi!_YNF8L<47xQz za}1UQ!*wT7#mu4go0jo9Cwmg0z!)O|CvQwg8lAw9SOO;Rw?sE zK7?ejlLESnb5s>F15oOK^I?+ib3I9%cPj}qb>yi;?j21iUJsdv@iwt_SA$f))R5QyvtTt^AydP zM35dG%0C?aGORqgy@%N!?;v6xIk~PE`mAR4V%a2!%}< zX8k*yh@aG(?~zgk_kmqGep66$JBY6cp<7WUK^Q4RU!T(JgjbMu5yF-hcqsAzaQgy_@?nGXoU>91T`uH z3REF`%^w6TGMJ#mj-1c8txACv$hlW`tIiVLhb+sG^Qilhrl<-qTV-FC^y4O43LwsYAGQEaMXHtG+;G|=IHdj(h~7+p^bGfS+(00Ehtnbems2J7dv8pgVz zDVKK$RHQS?&tDD-Zb6I$`yO9s5m%F0N++P(=Hc4+`KnK3AxuH05}(#d-tu19p%*Cu zuv(ja$uil&xwq4nEA7O!3EcPcZK7!PuZ$!_V?2R1U-P(Y=&O*QRk8$s#fTA8=Gnq* zW#q#j$cE|L&KV9P4^Xw#g-T~O?J@6}AYrdl-C-XAC;`wBwn=8uo-2>wfDeF6HsF0C zQhOP{3bC0)FNhRke~jx>R2gKtxjqX?D`r+&v*k$>s4F*wRF|)I{2~)XK}fzNBmGW4 z(mwLWVf%kR7`J)>aW+_##ez!fZjfyD%UdQbHq@d3uw(tPEXf{Yzyx z$)Gx?B&`~cyO%ky2s4u^#N?`JAlWfk2Vz8H@W)E~UFhs9EhM)9A>dP#bsK-qQ11tH zfdks$_TC(EAjYovi`!(7vReK|q~XIJs4y3soHJixRsQKk*0c`0MJ(}!T62bv#<@ox zzAEYnRTxq149!(+F24r6ieJjw@7<*}RRe725`P@Q6n&1{wGr)!?d$!)IxxNsgHe93 z$kzMA?P-H`Bp8JlA#y!`bQ|~q{IN3P(}bQOit*r2OS#EV$qr^YDw;0_o5JKr))Xcn zpQ;E0@rDxw)9Dt)g5@=bI4XI0{KX`D?!{oI2sZGiiY^2AW%pPJ7%Vxu9Gq@(TXWc0 z8ITBG=A_ZxzwipG3f)xS-=VHx*4dB_uRm6l!7ydnyqV&6-5jheoA+c~xgP zV*X{V^B{M5920B=yuy=DEVrNsbBC}fvrCRsUIunzcxih!K_A=W2^e7|wsf5M)yo%R z5L%@-u!MtE)BUundxw7#ZVgrgkKC%VjnQ-GqAKbuqFm~?r!yS49dm>c^u^H;ER1exNUkln5`un8JX}w?_#HlTADE+w>`$C<*^cmtv(kj4F-27V zX{}W5Dr5EyVE zzbAJ9_##F@sIoy6jJ1^IT=TI5L@%Y)TiJq&LU2kU83S|o!`ez(cWtrQY;2pKY0XOB6Z%#AGH*zCNxrn znfr-49QYr);E}hXscQZoY%w&``D(3mlZ!TW?-)BG#Rr_gs}5L`2KBZg%YF~gK{MKn2K6y2Ph{~$=8HS)HwPMUq5tvqgLD`nJOPeIPdV&lk;poRLx=6~435_S$?UdWRAI>a$7L zL;D=T)+v*YWbbn|x%gEoJnJ|I`8%dUg)66&CKtiu;^%L*CL0i7sA$Yt|7+Q>HxX)d zOUTQ_wbeb=STe=U+*b5s;~_=JHuWMZTV6kD^AH?cf}cC7pH z3tB&7MAiQ%mc?RbR;fV^K(9Dp#od!esV4}H7moYDhE)=z@GoxqEJ$dUQi;r)R2a&% z)qRaJn4u6BAj$T2d-Qd2`J!<+sx zi(q7AA3SWtp8;0@L8ZGv0HW5FW(S*cABv##lsfu!7;L>|nP-!E&=U$}#pc*aM9^Ud z!47{y9GZ&bv2O=A65FpWh~|!heexFFrppubt&tu%8!oK;)C6N^Us;sQ+Dy0ytws%X zOi8Zw>PQygxrS!+;1kFm*w&U6Tx3Ts3>+50oxU80BUYDgaz{J4&C;z!=_>cKRp=YE z?XU5_ul>kc;nh8;B4V(Whr0H9B`nG9va2bb;}k^p%-)}z+Z?J)6CQ^Z`wCf5{se}m z;>ZhFawJiZ7b$Tj2@1$ObOc)>F`N|Gz}9XFQuY3Z-Vm6CJtLbtY^XIQf4fy%ZY3@? zO@V@Y2brUkb1k=-fH*p7E|p%~mA$Dn0l$A%iFnma3Xu?fE=;*gDj_%Wt=9s>1CgF& z-;r553I<1(gqC6jDZj|P;z(Q|Or;W&rDZ&#X{WT3#8E=*w{3^dS_&HBk-(du^D?t~ z*WgeZ;M~qAsj2%P1EtgMi{1T*n@- z-~csyzQ4s*xAE8e`5OzeI}7EzKPbYC@q(@11!%qJ(GWorNrb{!!b_t>NgXnNDC0F; zUz3Zt4I)C@+?gtt1$S;-JDG*thmdQn zPWM`F_$@vYHHAW65fRT}P7VtqQaS7*`WpcvZQ`NgLf`UgQc_^+nxT7?!Gn12aaS#!VdanPbU9{y7>xh` literal 5251 zcmV-}6nyKj1esTLWzo`!#FWW>`$LZ4Zb8Ft$j$i9+^b#cX+$C{=(0V3(pxTqGUp`C z>IpUrx8Yw#5{=jwx6#p`URpGV&GB__Owr2y@|vyzXK9-ll8?qe5nqoKT>P{qF*}D`00RVJ=;WN#A5~J{u70pKhVyG}`5|FJ!C-qV1+K8D8x+$#hM6+0+ zIB4nLyta7FBKlnl*65=p^NyCT_<(HI5S10rJjMqG+?(oT&PS~MFUW_&Z$Ft|uEKllV$au8!$mhh#rl_fQv}Vgv)m1GuP*1LhkW69~*xs1_X1mKKJP`(HaBe zMffwL=Tq2da*hW4LNJ8}PIP8LCNCzN=d5J@^^jH?SP)9*?D%XWA{(GF)<)sB6Tw*lihy5+Nv zwNoy(`!dtlKf6lyAJbKEN&RWHgteu!aL>P6>NxVJsfx3M2+b4`KZxP)k3PbqO7^(I z(>WPi(NfB2#yf_|SUNPraBCsOv`hg8*D7Whx|x<4oQAsMa7}A9$qwgs{T7(0Xc&m3 za@=dth4V0Lx9U?l)-=WtV0ds>_Y6N9Pdu)QvBf1>TLe)gQepo2+jAO>l7-113ZYo3 zKluK~p;D?{8QmzHT`n7xn6N|Ow{jpjDxFm|B&c96ApDDJ=*2ncCVZGKjkoc=%b-&$ z*VVaM^$%ti)q05+MzzlVb*$3!sq;=PhlxbqZYs~QF@MzC#gPlnNFmJ6C>Hv;KD&Hql;40_Bmb@vQ5tY2Ur3G@_A56Up$9b_BBAwj zbGcj?)(Z%+vug1RP}{tF7kQyTp$QfUtlThyoMm8CT=@T&S>MR9IPOHRNIr zf2kU(>}u;C>kdN$?VO&s-FmYVwq+jP@}>`L4=R?46<%G?-?w8bSy?akDEuhQHd2*G!-a$TEIwlaf0PSy?Qz05k`5r zCz-!FiQd_B_N`9c;j>t=@#<$m@T_4nI>JX*OS^ks-MDls=#`!bh|5`SxPloD#XHH# zAdXm$tNviKxtP|mkpjJN+=5mt2l+YE^Z?&^x!7XiF<&mpS`d&_h+DpT6*=*5boMIF zPC4zwOiI>It3g9Dn1E@EGVs$onNTb5$TtjMS%!$#2IdunoG)^W`d6C+H@n`T18zBn zSm7Hi_z&i+b&l1%^k2r3F(huq^CJBLd^6h-383(Ye9=bo4<{VoGq}>Z_d$ zHHg8#EYt9A&_|5E*x~Raw6cp{8M}bo@2D-R8NQ-Ob8SWXrHRaOCI(AWt%XABr#m&T zNh~KFWkY~H;m|(8TaYX@faA&~qGL~ZE5!lq4Fj@ungYm%dd>FXG_>!V^7-PoI=MmM z9`9_Wnv{RcL@*epT(@}@!Z{ljt>kbWo%w{SNp$`zIMU6rdwP(~w=Kp}>EKNT+fI6_GQeUyldm2YFC9p57e_@Ae#V8QCa z@E`&-BgL~oi!7zID*jTbpe_0YM|&6+j!Jb#jdI8V)&Z=-p;MvUJgq!_F{e%3?MS=1 zNruucRuFC;(4KtD&=jV}g`KbSFf<)B*e!~#Zye~kRhFbi7FY_AI1DQ8bM&KXVfu9MSr0p>L2K{2eU^IG|ahN_Mz>Ic{? zLmvAW&L>KiE$m0=Smo@={131G+We6qpLP{H!b1@B@t`pLSwCjTb0~0-wr^qL4?E|% zUv#JdbXlx6ngS-#&<27{@c;VBU`+rujeNbqW)ssdY4iLb2z|~kX@LFZ$oTis=28U> z_eV15I>hnH=^~I4)=e3+2x|(Cx%c^-7+;KB1u%gr^&Mk^I#di({4M4>0ZsNc%3OYa zt`-Sa=b>EsPtD%$iIE?5Re=LdDO0TqR1nk@OtG2HY-YY}~TLd+%lS z=kAQH5db>_-L=Gg3oE6tB%TA0M1XLCDKS96N%~xbf`i$-j|7?-=7O!%r6<=O?@lMv zj^b(S?!n9;A!51L zU1pD&P#mCnh81B(rEUmAPW@CtLH)!k#m%z%Tgl=fuDX8z zoW!WPUVKz=;06*0{093NP9Su+b+j4=(jC&GX*I-F?pjrcb0ub+rwIm78wCaZEi$T8p9?9!ELIoK*N}qVp@$^silKLM2F*divX`7j|Aa`n?opMxg za0ETg=>IQiS1EcM&G8KkCxoG}Ycim$FX4LH(hLz_NB|b=Po7~utnxdCL>tVeInt!+ zxmmw&#Jd`Mnxk>@dMySDsv<=HH|A-vZduK$Ir|5ftK`FZ4a?}U5X!LS9uxJ1ho<~L zjZc99b)(exOUBep5^UZ(EbQgDw}rDeBOUnT9@sK4hV0nfVWtLwq+g5T6*p=v)Tm`T zUC6LLDmp__K4`;cR*Gp*4<^}n3RbW{b_RF_SpkuWr1;2Yi3=(IDD1)cQWh(ZR-7qWO~U@(W#>ku_DPQRVBVSkbUhB=CP#4C>xukUr;! z=_X$nyYp8l<0G+PGg53_e(?AU^d#o7uml0x*PQEDrZsL*#W>~F`xpCP7}0s^Yi(zd zyxft9IrR%#J2A6v@TLiL3KZObwmi7Fnnr$Tdvl77+kCOISW^)db~kT+>aLO36*(bQ zY$Dj$FM9ljk3Rvj>O9&&n3Z6pS6qky985?ns?DKtb}!uq4IY5A_!Mt~>%ykC&OEun zt$4q5F$a~el+e=dIy`mr4tA0&!lZmfB6p-gx<89vpCIw;KtanxcCvxRS1P{ojr9hv zjByDL@zX|Q?`6`!e{Z={aiBEkU;*#18a&;WGKNeb{t$Bjj_wId`CcL{r>^s%HGkoK zWjDim!9V1Utmp%kaq28$hxlpbErpyeWvd*(!4JkKv(8qt^)(!h*z93R7^MmqgbA!_ zcIhaK@+y|9T-@$!s3g%j!xhe#>k|)5}eZ_ z59*L}S?UHE)T%SY2Jz8UZ4}lfO&=uXd({p-#+7@sJA~E|CpKSfTP#%>49l1v2sNdr z`6T=(ja`LnOB1rlxc6i+tT`U{ET_o}urnkCPM;dU)e!^)HBCNMU3Mzo<7d>wI^B(= zAqa(Vx{}M`6I=BMZ6BqIgCK%dFUT3rRCMm?BZ5(XRJuMR2YY?z-H7Ek~jp>~uA!OHAbw8VfMzY_;)w*$R^j-4cDi z!-j_Z+_3J^DtKSr*Tn5@ROsI;hI;aWIjs5R*n z#JQiViDu7nSuQO*lLWrZ62coO<@!>d>dv?gWT1-a_IM#q(jTGPbQefd7n}l8jl+x} zht8wSN{EAn7y^r(8_>OxiL(Gt=N|UmHEID=VriHQbsRAPQqG0vq+=J{-#xxmJTYL{ zd^MOkxKcg{23T6u+zqhen&deUFE)vBIs&E|uE}4lS_K;BixvY z_9kl=Ocj*HmDNCamX`Ds zxWPeS8{m1!hv)Ani6Q%eG#~$=I2HcF|F^3IwIJK4Aavoc%7fgd^UfBbs3++&`JF~w z+N-Mq;z&|9)KKy5GHaUKM>Zj8>WIg5w6f4ft2^rgi?6^u9t7p;}3^P>@@HXLMO+f zOi85<-JAYIp5PhQf_YZ8TZG$%_4<7jhrkLJSR?dA|4k7KIP>{Va7t(_(xSQ%|EtY$ zvrwgaBME-tMGnM?66tm2jYZ??GeqLHJ4M@HMKQ5^zs7%W$2Tm7Mjx{KXKME^Tw%mhkXtl9$m#VuV({mE=@ zPQ)lU+zXJ`Raw5iFPmcQ#6om_x27oQ>-<2e^`(m47c5fK7z*%5@k;1(v%a~iIT?(+2O&W(yGwe101wcIMAM9$N@7%{$%8KJ9O|cD< ziwu}JW4E!bWi*SEX;|X_{_0owuIP^>1F@kSrlleejb~D#*)&3JBu%|ppNj{r&M138 zZqSYeFADKk?mk5R*s;jw?AUSDV(8L*`?=m-0)IkEI<%^?5x7aQl!K0VE~t8+Z3YCQ zkx5W`-IwG6pKSXS@50FQ69U~Z#mJ`q{oxrXr`VXiw27=TYbtZoYBJ*Xb5Q^lB(5kq z8_=D%4C~^mP>{GUFn-J}Vek|~X03w>S*XiFaH#B)7z$Wa&qMeR<-8ogJqKGCMMMfi zzZm6fRM7ErCl?v@fcG8z`*Obn-(9|-Q7lwnWXlT!nUF84eFZl zdNQ>kg(h%k*^TQdavqA6)qSZrOqBYN(`Q3hO%OQf5b?1ymZ)jr$YQy4x7gddqqH7O zH>4K~`FF$z!w-BM02$bAD`M+i`s0J+L8JIup!T=4|2f5s$RvbK;IUl5Crk`|cmajs z`LiC5IlDw8n=wrAA)KEe_rsl*3->}3Q;}mt{c-40VYVh5BE=(uU0yX_aw9^aSL(QL z-g$3=|En>#nH>i<>Y3u_c09nF#)G+E90qNTSL1%fL_Fv-V}W?_r4@XagKM|-u;#pA J7OYxF0|4IM93B7w From 2810365f93442a80eedf25c550d25aab3689fccf Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Tue, 17 Oct 2023 10:11:00 +0200 Subject: [PATCH 48/67] Circuit: remove mutiplexer chip (#90) Remove the multiplexer chip from this repo (this chip has been moved into halo2 repo). --- src/circuit.rs | 7 +- src/circuit/gadget.rs | 9 +- src/circuit/gadget/mux_chip.rs | 344 --------------------------------- src/circuit/note_commit.rs | 18 +- 4 files changed, 19 insertions(+), 359 deletions(-) delete mode 100644 src/circuit/gadget/mux_chip.rs diff --git a/src/circuit.rs b/src/circuit.rs index 91a5fe13a..7c5ba1f18 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -28,7 +28,6 @@ use self::{ use crate::{ builder::SpendInfo, bundle::Flags, - circuit::gadget::mux_chip::{MuxChip, MuxConfig}, constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, MERKLE_DEPTH_ORCHARD, @@ -59,7 +58,11 @@ use halo2_gadgets::{ MerklePath, }, }, - utilities::{bool_check, lookup_range_check::LookupRangeCheckConfig}, + utilities::{ + bool_check, + lookup_range_check::LookupRangeCheckConfig, + mux::{MuxChip, MuxConfig}, + }, }; mod commit_ivk; diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 919b2c10b..fe0dc4cec 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -6,7 +6,6 @@ use pasta_curves::arithmetic::CurveExt; use pasta_curves::pallas; use super::{commit_ivk::CommitIvkChip, note_commit::NoteCommitChip}; -use crate::circuit::gadget::mux_chip::{MuxChip, MuxInstructions}; use crate::constants::{NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}; use crate::note::AssetBase; use halo2_gadgets::{ @@ -16,6 +15,7 @@ use halo2_gadgets::{ Hash as PoseidonHash, PoseidonSpongeInstructions, Pow5Chip as PoseidonChip, }, sinsemilla::{chip::SinsemillaChip, merkle::chip::MerkleChip}, + utilities::mux::{MuxChip, MuxInstructions}, }; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, @@ -23,7 +23,6 @@ use halo2_proofs::{ }; pub(in crate::circuit) mod add_chip; -pub(in crate::circuit) mod mux_chip; impl super::Config { pub(super) fn add_chip(&self) -> add_chip::AddChip { @@ -74,8 +73,8 @@ impl super::Config { NoteCommitChip::construct(self.old_note_commit_config.clone()) } - pub(super) fn mux_chip(&self) -> mux_chip::MuxChip { - mux_chip::MuxChip::construct(self.mux_config.clone()) + pub(super) fn mux_chip(&self) -> MuxChip { + MuxChip::construct(self.mux_config.clone()) } } @@ -224,7 +223,7 @@ pub(in crate::circuit) fn derive_nullifier< // Select the desired nullifier according to split_flag Ok(Point::from_inner( ecc_chip, - mux_chip.mux( + mux_chip.mux_on_points( layouter.namespace(|| "mux on nf"), &split_flag, nf.inner(), diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs deleted file mode 100644 index fb81f8ea3..000000000 --- a/src/circuit/gadget/mux_chip.rs +++ /dev/null @@ -1,344 +0,0 @@ -use halo2_gadgets::ecc::chip::EccPoint; -use halo2_proofs::{ - circuit::{AssignedCell, Chip, Layouter, Value}, - plonk::{self, Advice, Column, ConstraintSystem, Constraints, Expression, Selector}, - poly::Rotation, -}; -use pasta_curves::pallas; - -#[derive(Clone, Debug)] -pub(in crate::circuit) struct MuxConfig { - choice: Column, - left: Column, - right: Column, - out: Column, - q_mux: Selector, -} - -/// A chip implementing a multiplexer on a single row. -/// -/// out = if (choice == 0) {left} else {right} -/// -/// `choice` must be constrained to {0, 1} separately. -#[derive(Clone, Debug)] -pub(in crate::circuit) struct MuxChip { - config: MuxConfig, -} - -impl Chip for MuxChip { - type Config = MuxConfig; - type Loaded = (); - - fn config(&self) -> &Self::Config { - &self.config - } - - fn loaded(&self) -> &Self::Loaded { - &() - } -} - -impl MuxChip { - pub(in crate::circuit) fn configure( - meta: &mut ConstraintSystem, - choice: Column, - left: Column, - right: Column, - out: Column, - ) -> MuxConfig { - let q_mux = meta.selector(); - meta.create_gate("Field element multiplexer", |meta| { - let q_mux = meta.query_selector(q_mux); - let choice = meta.query_advice(choice, Rotation::cur()); - let left = meta.query_advice(left, Rotation::cur()); - let right = meta.query_advice(right, Rotation::cur()); - let out = meta.query_advice(out, Rotation::cur()); - - let one = Expression::Constant(pallas::Base::one()); - - let should_be_zero = (one - choice.clone()) * left + choice * right - out; - - Constraints::with_selector(q_mux, Some(should_be_zero)) - }); - - MuxConfig { - choice, - left, - right, - out, - q_mux, - } - } - - pub(in crate::circuit) fn construct(config: MuxConfig) -> Self { - Self { config } - } -} - -/// An instruction set for multiplexing two points. -pub(crate) trait MuxInstructions { - /// Constraints `MUX(choice, left, right)` and returns the selected point. - fn mux( - &self, - layouter: impl Layouter, - choice: &AssignedCell, - left: &EccPoint, - right: &EccPoint, - ) -> Result; -} - -impl MuxInstructions for MuxChip { - fn mux( - &self, - mut layouter: impl Layouter, - choice: &AssignedCell, - left: &EccPoint, - right: &EccPoint, - ) -> Result { - let x_cell = layouter.assign_region( - || "mux x", - |mut region| { - self.config.q_mux.enable(&mut region, 0)?; - - choice.copy_advice(|| "copy choice", &mut region, self.config.choice, 0)?; - left.x() - .copy_advice(|| "copy left_x", &mut region, self.config.left, 0)?; - right - .x() - .copy_advice(|| "copy right_x", &mut region, self.config.right, 0)?; - - let out_val = (Value::known(pallas::Base::one()) - choice.value()) - * left.x().value() - + choice.value() * right.x().value(); - - region.assign_advice(|| "out x", self.config.out, 0, || out_val) - }, - )?; - let y_cell = layouter.assign_region( - || "mux y", - |mut region| { - self.config.q_mux.enable(&mut region, 0)?; - - choice.copy_advice(|| "copy choice", &mut region, self.config.choice, 0)?; - left.y() - .copy_advice(|| "copy left_y", &mut region, self.config.left, 0)?; - right - .y() - .copy_advice(|| "copy right_y", &mut region, self.config.right, 0)?; - - let out_val = (Value::known(pallas::Base::one()) - choice.value()) - * left.y().value() - + choice.value() * right.y().value(); - - region.assign_advice(|| "out y", self.config.out, 0, || out_val) - }, - )?; - - Ok(EccPoint::from_coordinates_unchecked( - x_cell.into(), - y_cell.into(), - )) - } -} - -#[cfg(test)] -mod tests { - use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig, MuxInstructions}; - - use crate::{circuit::gadget::assign_free_advice, circuit::K, constants::OrchardFixedBases}; - use halo2_gadgets::{ - ecc::{ - chip::{EccChip, EccConfig}, - Point, - }, - utilities::lookup_range_check::LookupRangeCheckConfig, - }; - - use group::{cofactor::CofactorCurveAffine, Curve, Group}; - use halo2_proofs::{ - circuit::{Layouter, SimpleFloorPlanner, Value}, - dev::MockProver, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance}, - }; - use pasta_curves::arithmetic::CurveAffine; - use pasta_curves::{pallas, EpAffine}; - - use rand::rngs::OsRng; - - #[test] - fn test_mux_chip() { - #[derive(Clone, Debug)] - pub struct MyConfig { - primary: Column, - advice: Column, - mux_config: MuxConfig, - ecc_config: EccConfig, - } - #[derive(Default)] - struct MyCircuit { - left_point: Value, - right_point: Value, - choice: Value, - } - - impl Circuit for MyCircuit { - type Config = MyConfig; - type FloorPlanner = SimpleFloorPlanner; - - fn without_witnesses(&self) -> Self { - Self::default() - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - let advices = [ - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - meta.advice_column(), - ]; - - for advice in advices.iter() { - meta.enable_equality(*advice); - } - - // Instance column used for public inputs - let primary = meta.instance_column(); - meta.enable_equality(primary); - - let mux_config = - MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); - - let table_idx = meta.lookup_table_column(); - let table_range_check_tag = meta.lookup_table_column(); - - let lagrange_coeffs = [ - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - meta.fixed_column(), - ]; - meta.enable_constant(lagrange_coeffs[0]); - - let range_check = LookupRangeCheckConfig::configure( - meta, - advices[9], - table_idx, - table_range_check_tag, - ); - - let ecc_config = EccChip::::configure( - meta, - advices, - lagrange_coeffs, - range_check, - ); - - MyConfig { - primary, - advice: advices[0], - mux_config, - ecc_config, - } - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), Error> { - // Construct a MUX chip - let mux_chip = MuxChip::construct(config.mux_config); - - // Construct an ECC chip - let ecc_chip = EccChip::construct(config.ecc_config); - - // Assign left point - let left_point = Point::new( - ecc_chip.clone(), - layouter.namespace(|| "left point"), - self.left_point.map(|left_point| left_point), - )?; - - // Assign right point - let right_point = Point::new( - ecc_chip, - layouter.namespace(|| "right point"), - self.right_point.map(|right_point| right_point), - )?; - - // Assign choice - let choice = assign_free_advice( - layouter.namespace(|| "choice"), - config.advice, - self.choice, - )?; - - // Apply mux - let result = mux_chip.mux( - layouter.namespace(|| "MUX"), - &choice, - left_point.inner(), - right_point.inner(), - )?; - - // Check equality with instance - layouter.constrain_instance(result.x().cell(), config.primary, 0)?; - layouter.constrain_instance(result.y().cell(), config.primary, 1) - } - } - - // Test different circuits - let mut circuits = vec![]; - let mut instances = vec![]; - for choice in [false, true] { - let choice_value = if choice { - pallas::Base::one() - } else { - pallas::Base::zero() - }; - for left_point in [ - pallas::Point::identity().to_affine(), - pallas::Point::random(OsRng).to_affine(), - ] { - for right_point in [ - pallas::Point::identity().to_affine(), - pallas::Point::random(OsRng).to_affine(), - ] { - circuits.push(MyCircuit { - left_point: Value::known(left_point), - right_point: Value::known(right_point), - choice: Value::known(choice_value), - }); - let expected_output = if choice { right_point } else { left_point }; - let (expected_x, expected_y) = if bool::from(expected_output.is_identity()) { - (pallas::Base::zero(), pallas::Base::zero()) - } else { - let coords = expected_output.coordinates().unwrap(); - (*coords.x(), *coords.y()) - }; - instances.push([[expected_x, expected_y]]); - } - } - } - - for (circuit, instance) in circuits.iter().zip(instances.iter()) { - let prover = MockProver::::run( - K, - circuit, - instance.iter().map(|p| p.to_vec()).collect(), - ) - .unwrap(); - assert_eq!(prover.verify(), Ok(())); - } - } -} diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index c5c8f44e8..c41a61940 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -9,7 +9,6 @@ use halo2_proofs::{ use pasta_curves::pallas; use crate::{ - circuit::gadget::mux_chip::{MuxChip, MuxInstructions}, constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_P}, value::NoteValue, }; @@ -23,7 +22,10 @@ use halo2_gadgets::{ CommitDomain, Message, MessagePiece, }, utilities::{ - bool_check, lookup_range_check::LookupRangeCheckConfig, FieldValue, RangeConstrained, + bool_check, + lookup_range_check::LookupRangeCheckConfig, + mux::{MuxChip, MuxInstructions}, + FieldValue, RangeConstrained, }, }; @@ -1908,7 +1910,7 @@ pub(in crate::circuit) mod gadgets { // hash_point = hash_zsa if is_native_asset is false let hash_point = Point::from_inner( ecc_chip, - mux_chip.mux( + mux_chip.mux_on_points( layouter.namespace(|| "mux on hash point"), &is_native_asset, &(hash_point_zsa.inner().clone().into()), @@ -2297,10 +2299,7 @@ mod tests { use super::NoteCommitConfig; use crate::{ circuit::{ - gadget::{ - assign_free_advice, assign_is_native_asset, - mux_chip::{MuxChip, MuxConfig}, - }, + gadget::{assign_free_advice, assign_is_native_asset}, note_commit::{gadgets, NoteCommitChip}, }, constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_Q}, @@ -2313,7 +2312,10 @@ mod tests { NonIdentityPoint, ScalarFixed, }, sinsemilla::chip::SinsemillaChip, - utilities::lookup_range_check::LookupRangeCheckConfig, + utilities::{ + lookup_range_check::LookupRangeCheckConfig, + mux::{MuxChip, MuxConfig}, + }, }; use ff::{Field, PrimeField}; From a680f410a4b52a5f6292faa7e7601f838c8682b5 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Wed, 18 Oct 2023 10:38:59 +0200 Subject: [PATCH 49/67] Circuit: optimize ZEC/ZSA hash computations in note commitment (#87) We optimized note_commitment evaluation by sharing a portion of the hash evaluation between ZEC and ZSA. 1. message_common_prefix = a || b || c || d || e || f || g 2. message_suffix_zec = h_zec 3. message_suffix_zsa = h_zsa || i || j 4. Q = if (is_native_asset == 0) {Q_ZSA} else {Q_ZEC} 5. common_hash = hash(Q, message_common_prefix) // this part is shared 6. hash_point_zec = hash(common_hash, message_suffix_zec) 7. hash_point_zsa = hash(common_hash, message_suffix_zsa) 8. hash_point = if (is_native_asset == 0) {hash_point_zsa} else {hash_point_zec} --- src/circuit/note_commit.rs | 117 +- src/circuit_description | 2976 +++++++++++++++++++++---------- src/circuit_proof_test_case.bin | Bin 5283 -> 5283 bytes 3 files changed, 2075 insertions(+), 1018 deletions(-) diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index c41a61940..857020c58 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -15,7 +15,7 @@ use crate::{ use halo2_gadgets::{ ecc::{ chip::{EccChip, NonIdentityEccPoint}, - Point, ScalarFixed, + NonIdentityPoint, Point, ScalarFixed, }, sinsemilla::{ chip::{SinsemillaChip, SinsemillaConfig}, @@ -1849,8 +1849,8 @@ pub(in crate::circuit) mod gadgets { // // https://p.z.cash/ZKS:action-cm-old-integrity?partial // https://p.z.cash/ZKS:action-cmx-new-integrity?partial - let (cm, zs) = { - let message_zec = Message::from_pieces( + let (cm, zs_common, zs_zsa_suffix) = { + let message_common_prefix = Message::from_pieces( chip.clone(), vec![ a.clone(), @@ -1860,26 +1860,24 @@ pub(in crate::circuit) mod gadgets { e.clone(), f.clone(), g.clone(), - h_zec.clone(), - ], - ); - - let message_zsa = Message::from_pieces( - chip.clone(), - vec![ - a.clone(), - b.clone(), - c.clone(), - d.clone(), - e.clone(), - f.clone(), - g.clone(), - h_zsa.clone(), - i.clone(), - j.clone(), ], ); + let message_suffix_zec = Message::from_pieces(chip.clone(), vec![h_zec.clone()]); + + let message_suffix_zsa = + Message::from_pieces(chip.clone(), vec![h_zsa.clone(), i.clone(), j.clone()]); + + // We will evaluate + // - `hash_point_zec = hash(Q_ZEC, message_common_prefix || message_suffix_zec)`, and + // - `hash_point_zsa = hash(Q_ZSA, message_common_prefix || message_suffix_zsa)`. + // by sharing a portion of the hash evaluation process between `hash_point_zec` and + // `hash_point_zsa`: + // 1. Q = if (is_native_asset == 0) {Q_ZSA} else {Q_ZEC} + // 2. common_hash = hash(Q, message_common_prefix) // this part is shared + // 3. hash_point_zec = hash(common_hash, message_suffix_zec) + // 4. hash_point_zsa = hash(common_hash, message_suffix_zsa) + // 5. hash_point = if (is_native_asset == 0) {hash_point_zsa} else {hash_point_zec} let zec_domain = CommitDomain::new( chip.clone(), ecc_chip.clone(), @@ -1888,22 +1886,53 @@ pub(in crate::circuit) mod gadgets { let zsa_domain = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteZsaCommit); - // We evaluate `hash_point_zec=hash(Q_ZEC, message_zec)` and `hash_point_zsa(Q_ZSA, message_zsa) - // and then perform a MUX to select the desired hash_point - // TODO: We can optimize the evaluation of hash_point by mutualizing a portion of the - // hash evaluation process between hash_point_zec and hash_point_zsa. - // 1. common_bits = a || b || c || d || e || f || g - // 2. suffix_zec = h_zec - // 3. suffix_zsa = h_zsa || i || j - // 4. Q = if (is_native_asset == 0) {Q_ZSA} else {Q_ZEC} - // 5. hash_prefix = hash(Q, common_bits) // this part is mutualized - // 6. hash_zec = hash(hash_prefix, suffix_zec) - // 7. hash_zsa = hash(hash_prefix, suffix_zsa) - // 8. hash_point = if (is_native_asset == 0) {hash_zsa} else {hash_zec} - let (hash_point_zec, _zs_zec) = - zec_domain.hash(layouter.namespace(|| "hash ZEC note"), message_zec)?; - let (hash_point_zsa, zs_zsa) = - zsa_domain.hash(layouter.namespace(|| "hash ZSA note"), message_zsa)?; + // Perform a MUX to select the desired initial Q point + // q_init = q_init_zec if is_native_asset is true + // q_init = q_init_zsa if is_native_asset is false + let q_init = { + let q_init_zec = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "q_init_zec"), + Value::known(zec_domain.q_init()), + )?; + + let q_init_zsa = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "q_init_zsa"), + Value::known(zsa_domain.q_init()), + )?; + + mux_chip.mux_on_non_identity_points( + layouter.namespace(|| "mux on hash point"), + &is_native_asset, + q_init_zsa.inner(), + q_init_zec.inner(), + )? + }; + + // common_hash = hash(q_init, message_common_prefix) + // + // To evaluate the different hash, we could use either zec_domain or zsa_domain + // because we use a private initial point. + let (common_hash, zs_common) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash common prefix note"), + &q_init, + message_common_prefix, + )?; + + // hash_point_zec = hash(common_hash, message_suffix_zec) = hash(q_init, message_zec) + let (hash_point_zec, _zs_zec) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash suffix ZEC note"), + common_hash.inner(), + message_suffix_zec, + )?; + + // hash_point_zsa = hash(common_hash, message_suffix_zsa) = hash(q_init, message_zsa) + let (hash_point_zsa, zs_zsa) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash suffix ZSA note"), + common_hash.inner(), + message_suffix_zsa, + )?; // Perform a MUX to select the desired hash point // hash_point = hash_zec if is_native_asset is true @@ -1925,19 +1954,19 @@ pub(in crate::circuit) mod gadgets { let commitment = hash_point.add(layouter.namespace(|| "M + [r] R"), &blinding_factor)?; - (commitment, zs_zsa) + (commitment, zs_common, zs_zsa) }; // `CommitDomain::hash` returns the running sum for each `MessagePiece`. Grab // the outputs that we will need for canonicity checks. - let z13_a = zs[0][13].clone(); - let z13_c = zs[2][13].clone(); - let z1_d = zs[3][1].clone(); - let z13_f = zs[5][13].clone(); - let z1_g = zs[6][1].clone(); + let z13_a = zs_common[0][13].clone(); + let z13_c = zs_common[2][13].clone(); + let z1_d = zs_common[3][1].clone(); + let z13_f = zs_common[5][13].clone(); + let z1_g = zs_common[6][1].clone(); let g_2 = z1_g.clone(); - let z13_g = zs[6][13].clone(); - let z13_i = zs[8][13].clone(); + let z13_g = zs_common[6][13].clone(); + let z13_i = zs_zsa_suffix[1][13].clone(); // Witness and constrain the bounds we need to ensure canonicity. let (a_prime, z13_a_prime) = canon_bitshift_130( diff --git a/src/circuit_description b/src/circuit_description index 19578d04b..903fb3017 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -10,7 +10,7 @@ PinnedVerificationKey { num_fixed_columns: 33, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 61, + num_selectors: 63, gates: [ Product( Product( @@ -13832,6 +13832,144 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Scaled( + Advice { + query_index: 22, + column_index: 1, + rotation: Rotation( + -1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Product( + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + ), + ), + ), Product( Fixed { query_index: 19, @@ -14211,7 +14349,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14320,7 +14458,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14429,7 +14567,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -14470,21 +14608,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14494,12 +14664,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14509,12 +14679,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14559,21 +14729,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14583,12 +14785,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14598,12 +14800,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14672,21 +14874,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14696,12 +14930,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14711,12 +14945,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14759,21 +14993,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14783,12 +15049,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14798,12 +15064,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15013,72 +15279,41 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), - }, - Sum( + Product( Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Sum( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, Sum( - Product( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Advice { - query_index: 5, - column_index: 5, + Fixed { + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, ), ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), Negated( - Advice { - query_index: 6, - column_index: 6, + Fixed { + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15086,9 +15321,44 @@ PinnedVerificationKey { ), ), ), - Advice { - query_index: 5, - column_index: 5, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15096,7 +15366,173 @@ PinnedVerificationKey { ), ), ), - ), + Sum( + Scaled( + Advice { + query_index: 21, + column_index: 6, + rotation: Rotation( + -1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Product( + Sum( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + ), + ), + ), + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Sum( + Sum( + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), Product( Fixed { query_index: 20, @@ -15355,8 +15791,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15367,8 +15803,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15382,8 +15818,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15397,8 +15833,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15412,8 +15848,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15427,8 +15863,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15496,8 +15932,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15508,8 +15944,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15523,8 +15959,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15538,8 +15974,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15553,8 +15989,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15568,8 +16004,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15637,8 +16073,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15649,8 +16085,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15664,8 +16100,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15679,8 +16115,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15694,8 +16130,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15709,8 +16145,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -15787,7 +16223,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15908,7 +16344,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16053,7 +16489,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16172,7 +16608,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16306,7 +16742,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16418,7 +16854,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16530,7 +16966,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16661,7 +17097,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16780,7 +17216,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16911,7 +17347,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17054,7 +17490,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17159,7 +17595,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17264,7 +17700,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17383,7 +17819,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17488,7 +17924,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17593,7 +18029,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17698,7 +18134,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17829,7 +18265,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17949,7 +18385,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18061,7 +18497,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18173,7 +18609,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18248,8 +18684,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18260,8 +18696,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18275,8 +18711,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18286,12 +18722,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18301,12 +18737,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18316,12 +18752,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18360,8 +18796,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18372,8 +18808,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18387,8 +18823,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18398,12 +18834,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18413,12 +18849,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18428,12 +18864,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18472,8 +18908,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18484,8 +18920,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18499,8 +18935,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18510,12 +18946,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18525,12 +18961,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18540,12 +18976,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18638,7 +19074,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18653,7 +19089,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18772,7 +19208,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18787,7 +19223,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18884,7 +19320,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18899,7 +19335,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19030,7 +19466,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19045,7 +19481,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19142,7 +19578,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19157,7 +19593,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19261,7 +19697,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19276,7 +19712,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19338,21 +19774,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19362,12 +19814,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19377,12 +19829,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19392,12 +19844,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19407,12 +19859,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19450,21 +19902,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19474,12 +19942,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19489,12 +19957,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19504,12 +19972,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19519,12 +19987,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19562,21 +20030,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19586,12 +20070,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19601,12 +20085,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19616,12 +20100,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19631,12 +20115,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19681,21 +20165,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19705,12 +20205,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19720,12 +20220,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19735,12 +20235,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19750,12 +20250,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19812,21 +20312,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19836,12 +20352,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19851,12 +20367,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19866,12 +20382,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19881,12 +20397,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19931,21 +20447,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19955,12 +20487,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19970,12 +20502,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19985,12 +20517,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20000,12 +20532,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20036,36 +20568,52 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20075,12 +20623,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20090,12 +20638,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20105,12 +20653,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20141,21 +20689,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20165,12 +20729,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20180,12 +20744,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20195,12 +20759,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20210,12 +20774,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20256,7 +20820,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20271,7 +20835,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20403,7 +20967,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20418,7 +20982,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20550,7 +21114,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20565,7 +21129,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20671,7 +21235,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20686,7 +21250,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20807,7 +21371,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20822,7 +21386,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20969,7 +21533,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20984,7 +21548,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21116,7 +21680,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21131,7 +21695,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21263,7 +21827,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21278,7 +21842,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21384,7 +21948,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21399,7 +21963,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21520,7 +22084,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21535,7 +22099,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21679,7 +22243,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21694,7 +22258,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21826,7 +22390,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21841,7 +22405,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21947,7 +22511,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21962,7 +22526,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22068,7 +22632,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22083,7 +22647,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22204,7 +22768,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22219,7 +22783,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22332,7 +22896,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22347,7 +22911,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22479,7 +23043,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22494,7 +23058,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22626,7 +23190,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22641,7 +23205,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22761,7 +23325,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22776,7 +23340,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22882,7 +23446,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22897,7 +23461,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23003,7 +23567,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -23018,7 +23582,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23056,20 +23620,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23079,12 +23643,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23094,12 +23658,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23109,12 +23673,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23124,12 +23688,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23143,8 +23707,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23184,20 +23748,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23207,12 +23771,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23222,12 +23786,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23237,12 +23801,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23252,12 +23816,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23271,8 +23835,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23312,20 +23876,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23335,12 +23899,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23350,12 +23914,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23365,12 +23929,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23380,12 +23944,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23399,8 +23963,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23471,8 +24035,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23483,8 +24047,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23494,12 +24058,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23509,12 +24073,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23524,12 +24088,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23539,12 +24103,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23554,12 +24118,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23599,8 +24163,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23611,8 +24175,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23622,12 +24186,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23637,12 +24201,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23652,12 +24216,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23667,12 +24231,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23682,12 +24246,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23727,8 +24291,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23739,8 +24303,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23750,12 +24314,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23765,12 +24329,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23780,12 +24344,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23795,12 +24359,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23810,12 +24374,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23894,7 +24458,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23909,7 +24473,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24044,7 +24608,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24059,7 +24623,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24172,7 +24736,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24187,7 +24751,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24334,7 +24898,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24349,7 +24913,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24462,7 +25026,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24477,7 +25041,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24597,7 +25161,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24612,7 +25176,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24759,7 +25323,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24774,7 +25338,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24887,7 +25451,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24902,7 +25466,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25015,7 +25579,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -25030,7 +25594,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25165,7 +25729,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25180,7 +25744,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25312,7 +25876,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25327,7 +25891,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25447,7 +26011,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25462,7 +26026,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25568,7 +26132,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25583,7 +26147,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25689,7 +26253,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25704,7 +26268,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25740,37 +26304,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25784,8 +26332,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25799,8 +26347,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25814,8 +26362,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25825,12 +26373,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25887,37 +26435,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25931,8 +26463,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25946,8 +26478,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25961,8 +26493,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25972,12 +26504,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26034,37 +26566,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26078,8 +26594,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26093,8 +26609,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26108,8 +26624,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26119,12 +26635,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26155,37 +26671,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26199,8 +26699,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26214,8 +26714,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26229,8 +26729,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26240,12 +26740,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26276,37 +26776,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 31, - column_index: 31, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26320,8 +26804,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26335,8 +26819,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26350,8 +26834,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26365,8 +26849,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26421,16 +26905,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -26445,7 +26961,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26460,7 +26976,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26520,16 +27036,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -26544,7 +27092,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26559,7 +27107,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26619,16 +27167,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -26643,7 +27223,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26658,7 +27238,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26692,16 +27272,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -26716,7 +27328,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26731,7 +27343,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26765,16 +27377,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -26789,7 +27433,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26804,7 +27448,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26876,16 +27520,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -26900,7 +27576,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -26915,7 +27591,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26975,16 +27651,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -26999,7 +27707,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -27014,7 +27722,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27048,16 +27756,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27072,7 +27812,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -27087,7 +27827,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27121,16 +27861,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27145,7 +27917,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -27160,7 +27932,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27194,16 +27966,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27218,7 +28022,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27233,7 +28037,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27274,16 +28078,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27298,7 +28134,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27313,7 +28149,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27362,27 +28198,59 @@ PinnedVerificationKey { rotation: Rotation( 1, ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), - ), - ), - ), - ), - Product( - Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27397,7 +28265,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27412,7 +28280,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27472,16 +28340,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27496,7 +28396,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27511,7 +28411,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27559,16 +28459,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27583,7 +28515,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27598,7 +28530,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27632,16 +28564,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27656,7 +28620,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27671,7 +28635,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27705,16 +28669,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27729,7 +28725,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27744,7 +28740,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -27778,16 +28774,48 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27802,7 +28830,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27817,7 +28845,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -29282,50 +30310,50 @@ PinnedVerificationKey { (0x0decb727cf32e573604ae3928a761b450d9460f2a7283c8cf88a2b38b796e575, 0x044c0a88bc6aa468e75fc709f9eb21b6e309dd8a6ca62f7a3da86299141ea3a9), (0x285e16cead69d5fef9441d4d4ac695fe8880120d209e1e631d8a4bc5f55e90e6, 0x3700fd2dfcfac5b2cb6d33c60ac79dfac3fb95518cd0aa97c75a51d62281f2c1), (0x2dc11f4f0000da15c59cd395ea5f32b4e79783d958c290c821c89e0bcb50eaf1, 0x2c53e12ce0a2022516ef31f0224b0bc1b119861078358f78d245ba5d2f180099), - (0x02656490d7b8420bfe91e220b7d95ff7e79bca851ec0d26cb2221772c25e8638, 0x0ee047851a6b3d0038ff02a38782e8d349febf23035d21227fb95693083eb710), - (0x1dd2f90c7130eabb75c1f83620474ecd7565c6751cac21e6b3400e2554cb30ae, 0x0135321193a6f63fd7bdcbe4ec21c79cf2705deb072779586e4eafdbd52cc0eb), - (0x29a5048146830326a4c86c7959158cb88e6be880e1980adaa3d4bbdc1e4aae22, 0x2b1c22a72f40fc3196890c6e8723a9df96a73c0d81c83c015af087f920da8465), - (0x0087eb927dee14807ad837123f7ed3e34accaa3739d3e6172467acc8671c2653, 0x351df64e5f2b6956c800cc9c5e3a0e875b6f700be165bc478b53caf05776f9e0), - (0x319b61505610a63e57bbc53df58f1086f5840a826163fd5ca22b8d4a3238abbe, 0x232fe2570f8b5df28088f667ca920fe603329464a3a9dcfdbc78497aee19193e), - (0x3dfff1fb77235cfc3c9b39b7c4f99b5df4e89e957155385507a4ea91750069a2, 0x0a60bb0d445d0cf8fa75d1625b6ad86944d150c6679f00e78016829bf47ffa12), - (0x37bdb76a767d836c13381bf59417e256c1b326df542851d623617f2a45c59992, 0x09509cfe95dca7401708bab0ce45a126bac7fc5051b1c45f119e54a4e5fd881d), - (0x2d482cf0c1c13d6d2afe85feac3f565d054238acc10b7ff78dc08cb9aea3a5ab, 0x2f7182906fc5aa8952982e96ae29891fc988d468623244e02ea8453b5b3c65f8), - (0x184b191b2c11511c81ace6f3a56f833c5b6465a7a394dad84226588b7750969b, 0x0d200f2a66888760d60a9e117a85d826abe27a0f7cf6211b2ddf843475667618), - (0x04fae4e51e99d50ff8a55a449c0234a9a613e996a9b202db18ef01e7ad42b052, 0x1d083ab8f2c454ea5e1f9cf81a419a4a55347136c4feff75ec8a0a19f909d558), - (0x12d6a260a08c59e9df032cd6c855f081d99321fe2f33d33508b4180411f0dadc, 0x31fbd5ce92f6cd283658690e93a0bcbb515b1aa9728024f5eb583f5f27da6a11), - (0x3aaa1190000787a9cc4008d68adf7a91b48ff5470fdfb3d3ee36f64df7cfd045, 0x2f1723e3595adf0106d4fe2f11af025978f616b6697036c27ebbd682a013928e), - (0x1bbe9643cceac1b79ea642312b57cf5b7739a2accb6641c7c902a0651f8c90b2, 0x3a7c2a5db44cd0fa31f5a26206fc3ea8e81fea14ddbcdab3204dbcd840a14184), - (0x39a9e0b36cd0cf9445f6533d02ea7187f1d8100085a6228509c8af4743f2eb24, 0x311a439a351fdadfaced9213ff8bcadca7a03d1bc18d9f4bb33ea1806bc2c6be), - (0x0957fb68f275d18d730f9c106de4b4cfd966b3eeb0434b1ea66ddfda2420a8ad, 0x1ae46e6b003224d3f30eb366fc3d9db07d07ded1c474d239602aed8ac859e895), - (0x3d5fc48944b2527964ab562447e540f7512a225c2468ba76398dbd6842bcd776, 0x22ca98fd09c21884a128d63511bcd366d7fa61d7b21271e0c0927b4677c7242f), - (0x03be84ba69d6def665955d6dc72a6f647cb206de2fc5cc6d0e1474354bb03f3e, 0x1eabb979cab6e3e9a82d7b692d18e9757b684f1b855845db1ed8925f3b9ad918), - (0x0c1fbfb10301c163416949dff37b9334f8c62372f154386e40882b4327d0cf98, 0x19f48dbe5b56cb8711943bed857307de739099a1cb78c12a1015770f8553c601), - (0x2096a01846851be44913d49936d7362716c296970aeba41f35b23946cc1fa41c, 0x3af057b14acc535df8dc9f159a1290d92b8fa875b1982d669b0df5a4429f59e6), + (0x3fb934de80a76b78bb5daf3fb368ebcefabc5b6b9ebae5cddc1e39c82b122b48, 0x130a034bee7622c60e8a53f70216e48696f5d9457aade41f0ef09166091c66e7), + (0x19e589077358b9abcb3e21a71537113cf43c43aea7e300fdfb755bb29449a5b6, 0x1da596141c740b648dabc4961ed014ed0dd8dfcc03b2d02cf6ff9e8a3ff0e42e), + (0x1af56c46ba6aaab50db1acd46003c05c3fee103776681f61100b1b6aef07c284, 0x38eea07b7f5881eff963d114e50084bb5bf5cf359f023fc855f3a01b0ca1e432), + (0x0cfb7c9b0bfcf398a53c13d6e1068989805f1cf254dddcaa4ab57da05ad0616e, 0x37fcd5b873385ee44169fe3870a9feeadbf64c21fa2c4b130f718e47f29ff8dc), + (0x03c0cdbe7ea6296a9eb724d225d0adf451999dd9686aaa5659e23102b5daec07, 0x1ec2e8d39dd47c991a31f9476467800bf49655e7293efc4e5261b7ffb15af542), + (0x1314cd9c9d35b73165e86972dc6007ec35aab9ef8f6358cc090043cf68c4c2f5, 0x3d9e921baede6846e7fd2f0805deec1da2395e7d3f647ef8f6e5ecdb456c22c3), + (0x3e3c175e12e425f9f5b499541aba80122e8c346ab329e8d2400debb7a4298473, 0x3621561ea96a7834b55250be2bc137fffa02705ca49848c61955417883a289c1), + (0x0491089f80b3aa79defa2923388ba287c07ff7b5d805932133b249b674c69dcb, 0x2463e5cde6ef2b91fbd72d8d1511556bf6d9ec460f19b890544bc6886906741c), + (0x2b8e5f9c2efdb6cca222b066bd10be6c1ec15951b5f22f11e7bdad199936d91e, 0x2579a5ebe80abe31205c73ebfe4012559a9c00f9ed2a7303c08420dd46ecccc8), + (0x06abaaea1008f82ba485632d1e6d130e8bd9baf450cee1210b5780fae7df1012, 0x0b21835ef9aed7d7b1a0dc9b2af53fab3a6c4f1a8a3568c2570d06ba392a73a1), + (0x1f18cb4d7fc46f1fe4aecbaf07fae7d29a0cb49317f60c17161837443e2f32a0, 0x3827b12472ab9f40d713702752e542832f8e812ca73b14e975b42ab7c56f10b9), + (0x1880c0651fead5ccae365349f9158252d6846f24f3d4c1fa9c190ee0b9020f3f, 0x05fb1b7ad97f29412f5a50cd0369f7c2a4cc07f98e2e4ddc0b677a97ac3617a6), + (0x18b67544d4466429760be2b231418b43d35d79462f8743051c8e437dd710035d, 0x2ca31a6106310316da5633fe4e16e2a0affafc4541b280a9722ae86219127aa0), + (0x0477cc6f6292f9d3dcbcdb6b896dbc2b76b8716db8d80f36af610738a89e58e0, 0x0fb4d1d92e0606c83e4d1359ad9e607a936339871c9c606cc9218225c8a762d4), + (0x027f5c9006d53a989091caa780c6b4ec009e328d03836f95ee05bfb2178ba931, 0x2c7612c86a27585617aa8b0202e638d57b079417ca8722a4f47c3c12892cbea9), + (0x1b9d2736bed08950ac569b6bc5d2a8bdd48cec8a206030c306f665af83c4df12, 0x2b8e0e07c521db751c386d011504b5f4c8fd2b09ace077e54f05bd0fbe0a2def), + (0x3d7f0951711965e07ab0e4c1451361e5b536793dcf76176e4e854285a7bdabba, 0x13780fb58b9b717ebd2040e8d79be7bc7f32c5d9b31b0766c6eea63ccc6c6ff1), + (0x2ebee709b368779cf6bc2bec772f19fee25938985b94fef3a86c9950adcc9ae0, 0x18af23ba308d2e8a6d9bf544def217546a8e9816192ce2c29841379a935b74ff), + (0x2a9ef8f91987bd8f2f6101abfc05caf7e30c7d79faba1022d547a00b04333f7c, 0x153a1907977cf09f557085c0f256b877f72567b3a2f92179e33d468fbfc8b10a), (0x334105dd96996a08df56e88261dcd87c5356cfc0f2b8ae0a9419899d5def147b, 0x09ddf24ae765eda056cf59b16ac14464240c83e253135682c02e6546f89dd396), - (0x0aa9bf3b3cae0bbeb70f32d96a43603853872c28ef246db1bb85c885e112b4c1, 0x0718dce6ad248d2cedc43f3a23ec6d4d7dd305cb6f8fc9a3098a11acf42b5967), - (0x06fe6f3926a9de1432ebf4934fef695942a41eaea45a2c42d6af795af6dd1f7b, 0x30342fc0dc2cdec7fdf1aab0eb28f7ca21b4dd478c596540444c0932d8dd56dc), - (0x12fb328eaf326033eb7376c6aa6aff345bbb300b7e5fab858feec8cd3e4bdf58, 0x28bdf84118d334220e557ae9959a091ceb54c36d4a6d1f8a1518948d8a8124c5), - (0x0558514fa4d8feae12519efa8c79b7e7fe327642f28455ae300cffdc21cf5a22, 0x22c8f7ede18bcf4083f7cb6bf94b1de06305107537bcc31027dd400a7455dded), - (0x0aa54dc82361b7d6f35e36d55290ede3e4962e85665475fb15e51b626c849f7f, 0x16927eaf3dcbd28a8e1eb1a19235a512da8858d10040d3b26425ec054ce0eb3a), - (0x39c1526f64989d617bd43b64427f26c5068485b3d635bbb746b6be5ebf8361c8, 0x398ab66905a4e1e36fc3e2da5d1b1e918bda970ad17d46cd08b852e51879ca6a), - (0x3aa89e6834df650fcbdc0a295b03a58002cdcd14198f8af3069eb222d2d17c66, 0x067ec4c41d0352ea32b5872af2b051c78882157d0ae87486dce3c4c2c29877f9), - (0x1394764de03aaa28c9a9d2b91798a25629d0412264057ef247c6faf21e4354e3, 0x1de01702d1d58eff7824e40712beb1429a101c1ed844fcaa7100519f85faffd7), - (0x261a83f8122eb036760791a4e9d52235df4939fdf8175f8d240a333e06557e7e, 0x184fb28734999d991d4bb862d1e47e3ae20336706f82ceb180609fa68fd85501), + (0x2dac89c801000721a4422cb8bb1def97cd3bfce7c64ac6327e335b3c0071a049, 0x2e2575abf15aa7424617ae9c7c9749c67c38a3e68082c4f937e4dbcff98b4dfc), + (0x0b89c282c8f2d54e66c7a11e6b4338a2f06a7c9430f7d3376328f12fa001cac5, 0x098b5c8ee6548183ccb4e60cdfee10b509db34ed136daf3530a426e8f200e89d), + (0x2f7f85b86b6adcf714d0df7878f4604d33fd319f39bd00fd5c34378247a155b5, 0x3a2f025447b83b65d148e99c93fe8bb991a81ef6d2f827f010680467361c47fc), + (0x121fe2a31c21b4d21266dde870a72ca2e96ea0fd80ca2ca59436c8cad25ae150, 0x0d2aff2c6e65712a354da894209b75ff8479cb958ab050156f63f3760b8a05ca), + (0x14815e90ec334c51da36b50c69b8f192f1cfd63fcd3257c7a16691b7be2a1759, 0x0711e90858dbade5aac1c82b1000a59e2beccfd84db4e212368b1a5b5a8ecf3a), + (0x3bd7f461093bd6b774837199b58d3d6741f80ce738345b18800adf8fedf37286, 0x3f9162dc512623e1c62b2360fb6db7400f9c545b2028af0f4580d308fd44818c), + (0x1f64379a921e197082d9e2afe9baa825f2af8fa02bbfa653772604bf22125eaa, 0x348d5a1de410f8c0ec8f9fe4514709c6cbc0882dc8d6ec0f8562f05c535ab2a9), + (0x12e6bba88452419d3d1632edf16b02a63a5ac81241118845ea41ed70111f1f83, 0x3f0899ae3f41bea051afee8df4dddb13d78857773df79d2e6eeae02b0c8f423d), + (0x0f59f5bdf3fbc2551cff44f3444bdb84ca5956aa0ec424cb8d8318abc12370d8, 0x219d1021cfd377e3ea006ed15485437702218e0cc6e76975025f7632bd66d072), ], permutation: VerifyingKey { commitments: [ - (0x286d1f6ab2fb58b3ba974d1807c606914deea07b64615089452f1feaa06ef0db, 0x08bb42474059164d528fb06f0b80b08b3ebdc87cbe0c2718d0c6199984b2119d), - (0x31fd9e62ffdd86ec55a2ead7a4b74dd21ddcf56029dc5d334491bffc7bd2ffb3, 0x2f990b235ee3f35e09a77f1414d21fab06cc60fe8fe6f52407d7599204632cd4), - (0x2044e502b5716abe00c9dde5348392b4fc489b5097aca8f5401a5153820903dd, 0x155aa6b3f9ea3e01f25eca37b0a62d28fe24a1a96d033c074e6cb22b08d118d5), - (0x36599df2c3de06015c3167fe0b2b22aab1ae9587ff050977193d5d753c8be6a8, 0x32b02df0138a92f3b23556ad96f9ef9bee0c34c8900cb4ecaadf3252ae4e0edc), - (0x13631970b4bae5c49d31638a2af724495c8b2074bd015f3c1c06af24956ca995, 0x1b7e3517b6db255c9b71753707de5d6fb33f83825ad8416db482669daac81ba3), - (0x021eb6e340ea808444c833c25e326c03223ea3fb458771e814a7d9130eddeb74, 0x230be5c1f0b81145d7a45c032c4dbc68e53db1fbda374a0f0d2e0da702032b2f), - (0x18720c0f1f48ad21f6e1d0d33adc569ac901c68cdcb16d5398ac986b421f7038, 0x11cf59a013ad87f91ce8567087a80ee9395af8fc1383ac10e490d9c903290a09), - (0x007f8cdd8d1fcd8f5a32af8e1b3347ef4c8b41fb46c93eeac7895851009cc5da, 0x37b9278f063e6d6a578aa76657ff19dffd9d00d572711bfdfbfff13b16a6c6ce), - (0x20d64c097c7b989a44316bdc366ae83097832f00289736b772bea49c4e7b00e1, 0x3db86fbe002fea7ec1504b8c3a37781255f3990674df29c3df80b01c346599dc), - (0x3a80a8a3e35f9d6d83a547f054657216eea971085206d9a1fa1da905b4ebeff7, 0x18501e269b09e80f6465be2cdfdfea1140edda48656e7ea57f9134c1426a05bd), - (0x3aa059c2e0c14fe94e426dce09603ba37f6674a0643c3084822fd9c6f90a9208, 0x1512147967321b4ef9e690745a80b3f58a55706151c6661f112d84eed9e3f83c), - (0x00bccfb987b16c011682099a4600073bf54c652644cbf2e52c55654af4047592, 0x3a2ea83323de8bc350419de781b6ac0481845cf87d83430d29782e3d62d134d0), + (0x05625166f1bf876dd59af0e45b068df3dc22e28accb12418d5111fc12b563d4a, 0x102be9e1b4fe8a6d8c00ffbf6513e8410b9a940a7b559914fdeb45a2b170cdb3), + (0x2319a6b8fdaca310c4042b98fe068ce93913270e534c3d88029fc5f8ba6ab3d9, 0x1a4374fb532ec3d030217dc66c6e0db4ac456bee8641cfe049190973c8b5c72f), + (0x0765958f562227c7838c73baba821f9c2f40868c58654dcf675b718feef1a01e, 0x378fb34b8ab337872d942b99123219ffe532124adc9cd3c31437aa6a5becd763), + (0x1df175a3908c91e4d9c1e4fd6e8f30d3fde110f9dc379eec7db39ceaa53f2ad6, 0x3b419848016ad53c7aaa29602b85580c499016ceb49ccf8496f7e9b3f413d4df), + (0x171cad3d3e6e7a153ff12d86ee56a01505acc1ee38fb9a11b68abfa5ad1a1e46, 0x37343f7a56d7e180ddd2ae2ca4301d5128becaec07cafcad1b7d3610e49f453d), + (0x207970fdc943d5b65689b132d27fdc46ed25c8d84042acf0e855c8bb00a60f2b, 0x364ad7be4b0b40da9d5df01c50967ee14cabc8bd669872613c1d62ad1f52f38b), + (0x19a1a3391e950797dbb98811f2ba3b4622147959449f9cb1c7f454aa047afe76, 0x079ae13ad5b0083006b06de42808f517d9797e5f42fc87a9947c761fa8784fea), + (0x08035a60101d47769ed0a30ce647c0e5d5c7850f1630247af48f351c7ac5b6e7, 0x3b0c43b451b947f7adbffa12d9e4c7ca94ac5c12eda34cee77b640f25a42d04b), + (0x116e9d6aef40f13742fb573a0779c99f5a12f59fab1246d64a55d94e3856800c, 0x0d595f9d79e749dbd9d69ca28b15f80a17b5312be520568e1f959f1b958bf1aa), + (0x3bf0f0b99e15ad38e2d9d5a9e12aa428f55db0cb878e058ea592eee7d16edfb4, 0x32a0e3bb91ab0ee8f25ab4d8f93782724cd68675e823e66369f0c6a36ece62d8), + (0x2cdb9602b74f420b08e5307df902d13340d3b1b53d081b110149e01d731dd862, 0x0b7b5bbb0b5b19148a410ce3c2625364660d100aad28542e75282ff7cc5926a7), + (0x20dc0d54e1617ea5a6251e447e06e8a98030d79b426bbe946fe960f85550efa8, 0x25f833bd3ee582088cf25891465c3908192d77eca169f8c7d3d373fd12c2fade), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 4dda7dc769a2a213c843fb2cb93181c282c89db1..97e15d58205d44afb2165e5137b7b4e81b843d4d 100644 GIT binary patch literal 5283 zcmV;U6kO}ApVR6dDSUdNx^}UTK(XA}sViHF!RuG;#F4%r8T$xBUG9Jn<}stEau7(g z3HySxg1K3$7rmYLD@gf83ULtC`#Ee=-ig(8m4XjZ)@&wt^{67&bDx+$2bYJu+jT$i zM^6q5k3c2{!aI`K3@e)Z4H(k5pQfJilW0F+O?9GXxZ_;L-$!4HYRULdUTGANxnTAk zYD}|3w5IHAWwitW0RRbt=wk^Cy!-q#u6<&-C@es`rZm3clj}fc0+E(ptPEWTk-ByE z27xxsjuWZ^GslCOCE&ymOXC$70fbwY`kWX|WTO@KCcl~l{OYYI`O(|izJ0<1j?wKD z5*`WefGK3fX#Qge-#XQi`cyvOL~nQHa}|b2KtY&f10bTf`M#yRNGzd;4^TN6s5<=d zK7<8pGSc)I#cP%>_)pjxN~0*~v|SSyuwe3fHhb>4V4spZ$FfvS!LYcqIp7AtuDG@< zCi#6nf!1#5K+;r9+EH6BKC!R10+)*bai^V@_>E)k?IdR&77T5mywAOx_A1~s{V>L* z9>zhKCj((|Tc%eIPE;2ztIUt=xY5lSn>G+yg)Qu&_Z`7ed0Z2cD6da%SWzJ$R8G$u zI9&Yn`SpyvBtn)OPBC1}NvyQRJgTKAeusUqZN0U4x(G&UudS_fB)Z;Qpy$vQ+E6-J z1h;wYtGj64BQhT^DI@*-1E9%uE3*a$p581mMU2!IY8ZlzDMyz&h1NVFBbD0@eU@WY zHC8y^l?5Ssa01^FWdRe4e1RK|9RW!AW4Uo_grp5bf0Vb~Tn%PwUH!|f0Tc`L;wRKZ9y4A1@?8mijd z4sBaCz_V!)*H$H*A@jo!^8zxn)%a&2uYg)rNvt`FzBhjItJf)FE{%@G9nx(b#Uz5G zLueGxdO5wTXqZ74?g7%D?ZC}Gf7C+Uygdu~A+Pk#l%ZuoTrEZ=Z&@QrKF*6%LC3i^ zqpn1Y#$=_e9+`|v#+(iqUYqTs2< zTcUTI9}4e+?iO7O%L87q(GY?YxH$fmcPqvEkN6`<*zNKEed*g<`LiZmZ>Om4g!f0g z@3IKP;Xk<7uL!U6(P89uXMwBGgex7&;+HMh zkQ?)^zru{F3Z=<&=e~ z+VZO;VxDSOV&D#v03!6^noY(EiUp{_T7ilOH;W=$W_G$00i%FiGUzJ^kV`CCD*uI0 z?MH*=B?x?m#vDYz>2^L(HCr7iyEwBJ>%q`i|sFq4CBUdMXO-W_e3>9Cr zN~N8apd45k0Xb|CN_|4Hm$!%@WV7)(R8W5t*QaZL!$~?&ychi`-zx(B6Oq{)?rd1klZT?{y zW(V24Q6){PTL(tWa4pI~RaE5R>`(n1tPv-x%z(?!icnbAXG%SmLli>I{nV^+ges;k zut(KmrNgRf&ZTR>kZdjxlH}J)DHP6Mml;kJED=rQVz1hv4L&V)p|i*s<I3M@Wr&XjY@9F>)KmzjCmHe%>me!a(XJQo75L5w(-!Rb=i!$zdz#AUq(s2+6fh!6 zlhFVQwN21+@3`3EgErH}l{^q&lN&v;Xw4O)NmHy9JG$&e#ZIU2V)K zPK31|ha3+E!2o7uXlJ!bNH-0}uvz?)*Ej|I0xB1HNiAOQ=pM92tu22-q0M0-gJL8} zTO)ETjt8QjYx*ZF8f!vTZfRi&=KR9MX^(TD)oOkqf2oOZ2|V%|xIbs>Mmf1g(}RDl z^ZsByj_xf?2-4L;rK$REN)#`*6HeRA8tX8cyNPloY2?<|1;8)HEx9Lu)c}Va(=Uk(Jmm>M;BX&M0tVVP+3D}57_Nf&D zK{VQStmd3Vn|uJ8@RmvCKLY8z>1-X_fg9Mhd}kLxNF5+J3r#3FVBd5x*~tuh6F188 zv6yco3-9sJdvZNb>@$<(L*!~R(ZplhA!r;-TL|@c?dijCCM?Xr9m~7xn>E4ar~SWv zv~b3}T?Gk5r8c^Qf{9O{KiD6F%-PB+bv3i@k{|9^aAWRoiDbhLd0{|^t*IwE@NjZV zj&lsSyC&;y_}FCldhBv1%Fm1m|2c#LBlWK-qI+Ib;l2(%nKh38I>e3ir=HXB29K~% zB8lM;M-VJoKEdDGXr}NA>>}~xSGayj%5eVtt<|FaZav?2q?ty4{;Q7V6yDQmbPRwB zAB^0Ugu}m*5b<6nt3qp(zQplDmIeYm!1*aV&oz_Quo;V>dNoQw-=w>A18r6j=VVMO zCxV90+zq?wFcS9ew0yozJrj&_Q-+b#Rd5|W25CM!DRHacHsCb+CnEB(x4>cAj%SK) zbQ`ote@c0IzEh09?x|1}$J9lE))AOxQx`4j50TUv5Q6nAM)S*e0F2-CEn@9F8ieaX z{TllWf*O+hPTY}i`WU#iQHGyb^LO6E*?Nv)p^lepZzD#|nMOB+zO*}=QJf-p*2#Ds z&eNqbWLn8-sMlQ;fp(Cy5`~HnXEh~ou+|0?$&#pN!?M6m4 z=t{a^Ne|wor>s~mj7-Ics>c=&-pOkwDoV?R)~nY6HwxidaWNJeR35dlMDaVIvv4H$ zP!fbU()3ZQC<+`^?O2m@&lR+PCJa*z50*j0?=7q^%y!3g&kkGJoves_J=LD71t}a1 zT6KEBQizo;i1QKPKz_T&&LPL{M701J`v$R;gD9}JfKy4R_hbe*G;W4I4dcY4864w! zZ!TZ>zbTo}ckoL`hbILo1rn2ssv2#5)Rt%?TEUwN zks|?l22c;#AUnY;EH_lm0MT%U&_9;;H=y;U=G9`Wza%3k9j2*eaw~!D;y@-Yd*|Fk z{MN*6z&-aKH6`lcurTlcbgF!-3IgCaM^=dAG4dNIqm)h z;3pbO2_?`sDZvX73q8Q?>vo;>bFLY9fAmXFzhtr6?b7H^NCf4iAv$#WLFa1^cozCY z!b0tql2cH)a23cXf~1 z^oGkUQ+8>h&{^6tN-}Zk1V%F22n=@p#wlqH_%c+;1P(nz3j!z|;E<@G;$GcbgE90iTOqXVHaz%%t)hcSJhbF>87s zxk_3Y2O2F`8For4v*SICz=z^ zMLWJp%1Fn4>gRmNde}cPyB6)NGd@8TCCJwFrI3BoEgqsh0?;@+WAL8|kF!J8mPG`* z|2=C9rw(#Ugv+SLB`Doyy9*2RdGo5&xK1L!^Q^nIyfO;S@=OiJW5aXc=Ur*-I&z*5 z7%w*Sbu~}LJGPBTfC_3UCOkvQhXqc$=@ z#t3Y2d4;C?s7eBYAyBkr5EjD{&%x=MHeW-~Br z2Kp#-k1Zs@P2oiBLHW00`8c0B?XF&Q4{@fkl^=659-af>(UoE!%`ND%w=<&Ccn9=A zI<2nOKSBE+`T%vQu>Q+~PYhJz{bBN|zTRsd93dQ8yM4O0s*&c97$dUCI`PLG-O_NT z+p8cw(+8Q|gLbBr)+&*3AW!0w5IJOE715BFwyme?6Hao(LvEUeA{cyH##`e>0I&aB&=F#V6-h5#yz+ zX`bDR>cOOmk0Su;z;7V0o? z>ASFbcPBa`J@AYv%NIio&gwWPBu-LZ`@SG5rf5x_yOU>SHywJUU_@deUx;JhY0jbw ziwO{v9~39~-0>(3K(O&#nrjzk`o6M|CRKMc*93SU(6M;7I(`(<*aVh%iEdQJVtLXj4pl z?nc5b3xZsKy%qbDZHBdhYsbwkqHbi}d*^VresumLvEibwpJfIC)0Ut@H&)%X5Vn)gm5)nBJO);EM1oon#`mo$&1Qrxdk20Bm!oQ4@*o?Q7 zVt`=IybLmWbqQI8z4#54NEOvkB5%JUOjXYhV-wLkcaoV4ULi!3oyX5+M;LBY^c${f z{y}8Yd&DqI9QR8ewd=`OYfb>Gg4Y;d_SFtK&0>_(qKx=@#%i<^{l_@yfhmQvRCa+J< z?f*gp!#1gU5~Pmz#Ro}Qi)CkEq?R<1M7-w3+@7(Bo7f{ULP;Fs-ciflSh|A%ic77m z%02dG;FU=kvzfK~*c{B9w1PJ;Nt@&yWdDRoD|T_ZeWHp5+*E8*I77wJ3Ke+~xbUI$ z<@nyI$W`b=3I@bXq&}i42OjREs^e9h6R~nO2zYF-?)eZvfi?w*mwH>J93N6Uj1s=# zpY8Bw%k}(i3xf5i?GZs3Y@EoYc(_M*)xQI9+r<2A-7v2iCBtn9?}0i za;wt0D-*Qy zA7#wn@+?bNQ8$o^H%gS9awc$6uF!(cLHRT7<|LXCb#`>edC31k&p*c}Y-h8peFeX= zog9lH{kU*QH-ju85WRCSSE&?76Uokbba=1{c29&7t(LjWtvB`t>Zw$57^8ZEB(Seo zjFqO4b*0ksj%BI|SC0t{Ih#2)372hjc>&@++3%1dwJAE(ZGmXN^43{ zw1_D!w|%~LDWErznze`ng)G|gU|*n`Qy2^_<>0lcJ-LXI!cil7Z+pT_@#~V`F6zc#0 literal 5283 zcmV;U6kO{&1jOWGSp|w}?L$%a003kU&&A3xxkGssGt6XWNA4>~3Ye%b6p1nM12CkP z(@GYXP>mun&O_9chI#{d;}no9W*6pOI#P77I7N*ysP=O*26@`$I`jFW(@{ z%RQu-Wm-XTQxT4Y)&tYbQ<5te*|h@nC_#QGYqupV?^%4wq=K8yVJh!Q@mcVpkJQ#1 zw6J8BmQ!P3Z5I{+0RZi&AM*~8(?qN-^~Hi>m>>)C6>n@d;}3w%Z%+NfTqR}%AR(Zg zHUqK39l(fU^eWoW`b?hNRg6w+jqn@@yYE{}2%z!KFyIUPHv~O_p+g$56L#uPvp9vN#W9bU$kspgb3e!D)qT-AO|GUO5gO zPjBPE9C~RN5YVK;t_gG9;Z)Q=aDBRYObgrdqPAVegX-LQBVlSQFS`85*{r zL-}9Zo=nFMq#W+K=d^>UdjG#9qGNgwgcW9emZ%xB(kaqYcVies48N6^(5{BBQvQRx z1h6h=bkywms)~r=u%r7modmL0y(@G#&8?_9uf%qpM@>qwPNp<}#M=67Ds?jgLo*k0 z+pgHzM~_>1O~~#oBkTg3%AUJ4Sj%~$5Zy-EkJJ0D!Jk2fFP7i46$1Ykm#qT&#fs*1 zUe%#;P@>b^%Y$h52_~iJpAXGcRklf>tIw525iZv88~)?-nw{*qYG@GAPBB3nCGqj>G@0{&xv3X^=fIPXyL~%(TpMIi2xmvyD+s zsGybD@J&@mm}a9ZngTJc zjGY3#VHQ47D8g_`21!A=>3Iw7p}Po9>CMH~HMT&%EA)9&X;x}E@W^ywP`5~@#ph#F z2#48#*G$CXmJz}^ThYe5;hxkp(79=lu*z5+Tt-DbP$l5{t<~z(q49*-&cU2$?JY;w z5V-as*G*y8)~S}ZTbzP(Iqhl;TS>-#pBL2)xUQ00&8V0-K3i@83t0$!ayMoUI*zom zIGt`&?^VIo!OmUne*fyGHL8wDEo();q$77NH<=0*OQj-Tv|>UbWz@i1Khx|&eh7(2 zW;$Mvh8KIs^dQvV8RxX)nNhOsC31vsKJ$|SUk70I3L&A6Bmsg&?1X1AM!B5QipC9w z2%(v+jIMyJPDWVLMfgDF^b>KeMS38TA&i)5HAo&*GmBYyO;3co&ZCGO&~BpNiEwm_e@sc z;P618Y9O(n-8?kUXco**0)M2j9=NyTF)%|hVvk+gQ@sD(dU>@zNHEd}P#>OfEhoM_ z0+!~Cz5e@lJdQ`2rfArehkkpJiZ2ap|biF6i$N?sTPWy&Pk#l zD84mv6wgu`ogn@9r@(rb^)+9Ng$>-5s5={?_ccW+8(Uux@Mz`0*229A=ejfCNxJ;S z-A60EK|DY3$xyAC1yke^aHnEbiZip)ueA!ruH61_6k8o9jqA?nodvJY# zt&1u8Po*m=$;m_rL=PFAdpXd&FflfQve{eXkW_EF%HNt-!=6HxZkY)#^5lt2wI8{3 z&ZKRxD?U8`jQ{+&y`^PNb(&wzjC{rQoU$YQ5^PvJ@~xnISTk-X5XD zI=*+t=A~uCy>$YWv6I_rfw8HuC*)A>O<_{j~DZEyBSi!_YNF8L<47xQz za}1UQ!*wT7#mu4go0jo9Cwmg0z!)O|CvQwg8lAw9SOO;Rw?sE zK7?ejlLESnb5s>F15oOK^I?+ib3I9%cPj}qb>yi;?j21iUJsdv@iwt_SA$f))R5QyvtTt^AydP zM35dG%0C?aGORqgy@%N!?;v6xIk~PE`mAR4V%a2!%}< zX8k*yh@aG(?~zgk_kmqGep66$JBY6cp<7WUK^Q4RU!T(JgjbMu5yF-hcqsAzaQgy_@?nGXoU>91T`uH z3REF`%^w6TGMJ#mj-1c8txACv$hlW`tIiVLhb+sG^Qilhrl<-qTV-FC^y4O43LwsYAGQEaMXHtG+;G|=IHdj(h~7+p^bGfS+(00Ehtnbems2J7dv8pgVz zDVKK$RHQS?&tDD-Zb6I$`yO9s5m%F0N++P(=Hc4+`KnK3AxuH05}(#d-tu19p%*Cu zuv(ja$uil&xwq4nEA7O!3EcPcZK7!PuZ$!_V?2R1U-P(Y=&O*QRk8$s#fTA8=Gnq* zW#q#j$cE|L&KV9P4^Xw#g-T~O?J@6}AYrdl-C-XAC;`wBwn=8uo-2>wfDeF6HsF0C zQhOP{3bC0)FNhRke~jx>R2gKtxjqX?D`r+&v*k$>s4F*wRF|)I{2~)XK}fzNBmGW4 z(mwLWVf%kR7`J)>aW+_##ez!fZjfyD%UdQbHq@d3uw(tPEXf{Yzyx z$)Gx?B&`~cyO%ky2s4u^#N?`JAlWfk2Vz8H@W)E~UFhs9EhM)9A>dP#bsK-qQ11tH zfdks$_TC(EAjYovi`!(7vReK|q~XIJs4y3soHJixRsQKk*0c`0MJ(}!T62bv#<@ox zzAEYnRTxq149!(+F24r6ieJjw@7<*}RRe725`P@Q6n&1{wGr)!?d$!)IxxNsgHe93 z$kzMA?P-H`Bp8JlA#y!`bQ|~q{IN3P(}bQOit*r2OS#EV$qr^YDw;0_o5JKr))Xcn zpQ;E0@rDxw)9Dt)g5@=bI4XI0{KX`D?!{oI2sZGiiY^2AW%pPJ7%Vxu9Gq@(TXWc0 z8ITBG=A_ZxzwipG3f)xS-=VHx*4dB_uRm6l!7ydnyqV&6-5jheoA+c~xgP zV*X{V^B{M5920B=yuy=DEVrNsbBC}fvrCRsUIunzcxih!K_A=W2^e7|wsf5M)yo%R z5L%@-u!MtE)BUundxw7#ZVgrgkKC%VjnQ-GqAKbuqFm~?r!yS49dm>c^u^H;ER1exNUkln5`un8JX}w?_#HlTADE+w>`$C<*^cmtv(kj4F-27V zX{}W5Dr5EyVE zzbAJ9_##F@sIoy6jJ1^IT=TI5L@%Y)TiJq&LU2kU83S|o!`ez(cWtrQY;2pKY0XOB6Z%#AGH*zCNxrn znfr-49QYr);E}hXscQZoY%w&``D(3mlZ!TW?-)BG#Rr_gs}5L`2KBZg%YF~gK{MKn2K6y2Ph{~$=8HS)HwPMUq5tvqgLD`nJOPeIPdV&lk;poRLx=6~435_S$?UdWRAI>a$7L zL;D=T)+v*YWbbn|x%gEoJnJ|I`8%dUg)66&CKtiu;^%L*CL0i7sA$Yt|7+Q>HxX)d zOUTQ_wbeb=STe=U+*b5s;~_=JHuWMZTV6kD^AH?cf}cC7pH z3tB&7MAiQ%mc?RbR;fV^K(9Dp#od!esV4}H7moYDhE)=z@GoxqEJ$dUQi;r)R2a&% z)qRaJn4u6BAj$T2d-Qd2`J!<+sx zi(q7AA3SWtp8;0@L8ZGv0HW5FW(S*cABv##lsfu!7;L>|nP-!E&=U$}#pc*aM9^Ud z!47{y9GZ&bv2O=A65FpWh~|!heexFFrppubt&tu%8!oK;)C6N^Us;sQ+Dy0ytws%X zOi8Zw>PQygxrS!+;1kFm*w&U6Tx3Ts3>+50oxU80BUYDgaz{J4&C;z!=_>cKRp=YE z?XU5_ul>kc;nh8;B4V(Whr0H9B`nG9va2bb;}k^p%-)}z+Z?J)6CQ^Z`wCf5{se}m z;>ZhFawJiZ7b$Tj2@1$ObOc)>F`N|Gz}9XFQuY3Z-Vm6CJtLbtY^XIQf4fy%ZY3@? zO@V@Y2brUkb1k=-fH*p7E|p%~mA$Dn0l$A%iFnma3Xu?fE=;*gDj_%Wt=9s>1CgF& z-;r553I<1(gqC6jDZj|P;z(Q|Or;W&rDZ&#X{WT3#8E=*w{3^dS_&HBk-(du^D?t~ z*WgeZ;M~qAsj2%P1EtgMi{1T*n@- z-~csyzQ4s*xAE8e`5OzeI}7EzKPbYC@q(@11!%qJ(GWorNrb{!!b_t>NgXnNDC0F; zUz3Zt4I)C@+?gtt1$S;-JDG*thmdQn zPWM`F_$@vYHHAW65fRT}P7VtqQaS7*`WpcvZQ`NgLf`UgQc_^+nxT7?!Gn12aaS#!VdanPbU9{y7>xh` From 7b943e197e0bd227f86405bdd2fbfa9d51ba0035 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Wed, 1 Nov 2023 10:37:43 +0100 Subject: [PATCH 50/67] Adopt Orchard ZSA for Zebra (introduce zcash_note_encryption_zsa alias, minor enhancements) (#89) This Pull Request introduces the `zcash_note_encryption_zsa` alias, ensuring compatibility with the Zebra project. This alias is used to prevent conflicts with the original `zcash_note_encryption` crate, which is also used in Zebra through the original `orchard` crate that is used in parallel with our `orchard` (Orchard ZSA) crate. Additionally, this PR includes minor enhancements to ensure compatibility with the Zebra project. --------- Co-authored-by: Dmitry Demin --- Cargo.toml | 7 ++----- benches/note_decryption.rs | 2 +- src/builder.rs | 2 +- src/bundle.rs | 2 +- src/issuance.rs | 6 +++--- src/keys.rs | 2 +- src/note_encryption.rs | 6 +++--- src/note_encryption_v2v3.rs | 9 ++++----- src/note_encryption_v3.rs | 6 +++--- src/primitives/redpallas.rs | 2 +- tests/builder.rs | 2 +- tests/zsa.rs | 2 +- 12 files changed, 22 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1ed0fb0f7..69165bdfc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ reddsa = "0.5" nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" -zcash_note_encryption = "0.4" +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/librustzcash", branch = "zsa1-zebra" } incrementalmerkletree = "0.5" # Logging @@ -57,7 +57,7 @@ criterion = "0.4" # 0.5 depends on clap 4 which has MSRV 1.70 halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" -zcash_note_encryption = { version = "0.4", features = ["pre-zip-212"] } +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/librustzcash", branch = "zsa1-zebra", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.5", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] @@ -91,6 +91,3 @@ debug = true [profile.bench] debug = true - -[patch.crates-io] -zcash_note_encryption = { version = "0.4", git = "https://github.com/QED-it/librustzcash.git", branch = "zsa1-zebra" } diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index ce051cf03..ba0f62112 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -10,7 +10,7 @@ use orchard::{ Anchor, Bundle, }; use rand::rngs::OsRng; -use zcash_note_encryption::{batch, try_compact_note_decryption, try_note_decryption}; +use zcash_note_encryption_zsa::{batch, try_compact_note_decryption, try_note_decryption}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; diff --git a/src/builder.rs b/src/builder.rs index fe3857904..5e51162e5 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -337,7 +337,7 @@ impl Builder { /// Adds a note to be spent in this transaction. /// /// - `note` is a spendable note, obtained by trial-decrypting an [`Action`] using the - /// [`zcash_note_encryption`] crate instantiated with [`OrchardDomain`]. + /// [`zcash_note_encryption_zsa`] crate instantiated with [`OrchardDomain`]. /// - `merkle_path` can be obtained using the [`incrementalmerkletree`] crate /// instantiated with [`MerkleHashOrchard`]. /// diff --git a/src/bundle.rs b/src/bundle.rs index a8e429a7c..f37011754 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -11,7 +11,7 @@ use core::fmt; use blake2b_simd::Hash as Blake2bHash; use memuse::DynamicUsage; use nonempty::NonEmpty; -use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; +use zcash_note_encryption_zsa::{try_note_decryption, try_output_recovery_with_ovk}; use crate::note::AssetBase; use crate::{ diff --git a/src/issuance.rs b/src/issuance.rs index 29a95fda3..8b5f200a4 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -26,7 +26,7 @@ use crate::{ use crate::supply_info::{AssetSupply, SupplyInfo}; /// A bundle of actions to be applied to the ledger. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct IssueBundle { /// The issuer key for the note being created. ik: IssuanceValidatingKey, @@ -39,7 +39,7 @@ pub struct IssueBundle { /// An issue action applied to the global ledger. /// /// Externally, this creates new zsa notes (adding a commitment to the global ledger). -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct IssueAction { /// Asset description for verification. asset_desc: String, @@ -181,7 +181,7 @@ pub struct Prepared { } /// Marker for an authorized bundle. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Signed { signature: redpallas::Signature, } diff --git a/src/keys.rs b/src/keys.rs index 7853d4920..4c6014f20 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -14,7 +14,7 @@ use group::{ use pasta_curves::{pallas, pallas::Scalar}; use rand::{CryptoRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; -use zcash_note_encryption::EphemeralKeyBytes; +use zcash_note_encryption_zsa::EphemeralKeyBytes; use crate::{ address::Address, diff --git a/src/note_encryption.rs b/src/note_encryption.rs index ca1b66013..6063f9c49 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -3,7 +3,7 @@ use blake2b_simd::{Hash, Params}; use group::ff::PrimeField; use std::fmt; -use zcash_note_encryption::{ +use zcash_note_encryption_zsa::{ BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; @@ -350,7 +350,7 @@ impl BatchDomain for OrchardDomainV2 { } /// Implementation of in-band secret distribution for Orchard bundles. -pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; impl ShieldedOutput for Action { fn ephemeral_key(&self) -> EphemeralKeyBytes { @@ -450,7 +450,7 @@ impl CompactAction { mod tests { use proptest::proptest; use rand::rngs::OsRng; - use zcash_note_encryption::{ + use zcash_note_encryption_zsa::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; diff --git a/src/note_encryption_v2v3.rs b/src/note_encryption_v2v3.rs index 5d3eedf25..107184ab8 100644 --- a/src/note_encryption_v2v3.rs +++ b/src/note_encryption_v2v3.rs @@ -3,7 +3,7 @@ use blake2b_simd::{Hash, Params}; use core::fmt; use group::ff::PrimeField; -use zcash_note_encryption::{ +use zcash_note_encryption_zsa::{ BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; @@ -440,9 +440,8 @@ impl BatchDomain for OrchardDomain { } } - /// Implementation of in-band secret distribution for Orchard bundles. -pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; impl ShieldedOutput for Action { fn ephemeral_key(&self) -> EphemeralKeyBytes { @@ -548,7 +547,7 @@ impl CompactAction { mod tests { use proptest::prelude::*; use rand::rngs::OsRng; - use zcash_note_encryption::{ + use zcash_note_encryption_zsa::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; @@ -571,7 +570,7 @@ mod tests { Address, Note, }; - use super::{version, orchard_parse_note_plaintext_without_memo}; + use super::{orchard_parse_note_plaintext_without_memo, version}; proptest! { #[test] diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs index 7594b588d..ceff0cbe2 100644 --- a/src/note_encryption_v3.rs +++ b/src/note_encryption_v3.rs @@ -3,7 +3,7 @@ use blake2b_simd::{Hash, Params}; use core::fmt; use group::ff::PrimeField; -use zcash_note_encryption::{ +use zcash_note_encryption_zsa::{ BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; @@ -349,7 +349,7 @@ impl BatchDomain for OrchardDomainV3 { } /// Implementation of in-band secret distribution for Orchard bundles. -pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; impl ShieldedOutput for Action { fn ephemeral_key(&self) -> EphemeralKeyBytes { @@ -449,7 +449,7 @@ impl CompactAction { mod tests { use proptest::prelude::*; use rand::rngs::OsRng; - use zcash_note_encryption::{ + use zcash_note_encryption_zsa::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; diff --git a/src/primitives/redpallas.rs b/src/primitives/redpallas.rs index 7690312a9..f51b9e582 100644 --- a/src/primitives/redpallas.rs +++ b/src/primitives/redpallas.rs @@ -154,7 +154,7 @@ impl VerificationKey { } /// A RedPallas signature. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Signature(reddsa::Signature); impl From<[u8; 64]> for Signature { diff --git a/tests/builder.rs b/tests/builder.rs index 5d69209ab..903ab3eca 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -12,7 +12,7 @@ use orchard::{ Anchor, Bundle, Note, }; use rand::rngs::OsRng; -use zcash_note_encryption::try_note_decryption; +use zcash_note_encryption_zsa::try_note_decryption; pub fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey, verify_proof: bool) { if verify_proof { diff --git a/tests/zsa.rs b/tests/zsa.rs index d3dd1b922..5bf9063c8 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -22,7 +22,7 @@ use orchard::{ }; use rand::rngs::OsRng; use std::collections::HashSet; -use zcash_note_encryption::try_note_decryption; +use zcash_note_encryption_zsa::try_note_decryption; #[derive(Debug)] struct Keychain { From f38d6b9e4cac7b56ec88c6aae91a9783ec977017 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Tue, 7 Nov 2023 17:06:30 +0530 Subject: [PATCH 51/67] Rename `sk_iss` to `isk`, the `IssuanceKey` struct to `IssuanceAuthorizingKey`, and move to a two key structure (#92) This performs a consistent renaming of the issuance authorizing key to make it consistent with the ZIP. It also reworks the `IssuanceAuthorizingKey` struct in place of the `IssuanceKey` and `IssuanceAuthorizingKey` structs, as part of using a two key structure for issuance, as specified in ZIP 227. --- src/bundle/burn_validation.rs | 7 ++- src/issuance.rs | 17 +++---- src/keys.rs | 83 ++++++++++------------------------- src/note/asset_base.rs | 16 +++---- src/supply_info.rs | 5 +-- tests/zsa.rs | 8 +--- 6 files changed, 44 insertions(+), 92 deletions(-) diff --git a/src/bundle/burn_validation.rs b/src/bundle/burn_validation.rs index c0cfb84f1..0fdf35dd1 100644 --- a/src/bundle/burn_validation.rs +++ b/src/bundle/burn_validation.rs @@ -69,7 +69,7 @@ mod tests { /// Creates an item of bundle burn list for a given asset description and value. /// /// This function is deterministic and guarantees that each call with the same parameters - /// will return the same result. It achieves determinism by using a static `IssuanceKey`. + /// will return the same result. It achieves determinism by using a static `IssuanceAuthorizingKey`. /// /// # Arguments /// @@ -81,10 +81,9 @@ mod tests { /// A tuple `(AssetBase, Amount)` representing the burn list item. /// pub fn get_burn_tuple(asset_desc: &str, value: i64) -> (AssetBase, i64) { - use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; - let sk_iss = IssuanceKey::from_bytes([0u8; 32]).unwrap(); - let isk: IssuanceAuthorizingKey = (&sk_iss).into(); + let isk = IssuanceAuthorizingKey::from_bytes([0u8; 32]).unwrap(); ( AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc), diff --git a/src/issuance.rs b/src/issuance.rs index 8b5f200a4..9fe38c82a 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -532,7 +532,7 @@ pub fn verify_issue_bundle( pub enum Error { /// The requested IssueAction not exists in the bundle. IssueActionNotFound, - /// The provided `isk` and the driven `ik` does not match at least one note type. + /// The provided `isk` and the derived `ik` does not match at least one note type. IssueBundleIkMismatchAssetBase, /// `asset_desc` should be between 1 and 512 bytes. WrongAssetDescSize, @@ -562,7 +562,7 @@ impl fmt::Display for Error { IssueBundleIkMismatchAssetBase => { write!( f, - "the provided `isk` and the driven `ik` does not match at least one note type" + "the provided `isk` and the derived `ik` do not match at least one note type" ) } WrongAssetDescSize => { @@ -606,8 +606,7 @@ mod tests { }; use crate::issuance::{verify_issue_bundle, IssueAction, Signed, Unauthorized}; use crate::keys::{ - FullViewingKey, IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey, Scope, - SpendingKey, + FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; use crate::note::{AssetBase, Nullifier}; use crate::value::{NoteValue, ValueSum}; @@ -629,8 +628,7 @@ mod tests { ) { let mut rng = OsRng; - let sk_iss = IssuanceKey::random(&mut rng); - let isk: IssuanceAuthorizingKey = (&sk_iss).into(); + let isk = IssuanceAuthorizingKey::random(&mut rng); let ik: IssuanceValidatingKey = (&isk).into(); let fvk = FullViewingKey::from(&SpendingKey::random(&mut rng)); @@ -951,7 +949,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = (&IssuanceKey::random(&mut OsRng)).into(); + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(&mut OsRng); let err = bundle .prepare([0; 32]) @@ -1183,7 +1181,7 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = (&IssuanceKey::random(&mut rng)).into(); + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(&mut rng); let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); @@ -1278,8 +1276,7 @@ mod tests { let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); - let incorrect_sk_iss = IssuanceKey::random(&mut rng); - let incorrect_isk: IssuanceAuthorizingKey = (&incorrect_sk_iss).into(); + let incorrect_isk = IssuanceAuthorizingKey::random(&mut rng); let incorrect_ik: IssuanceValidatingKey = (&incorrect_isk).into(); // Add "bad" note diff --git a/src/keys.rs b/src/keys.rs index 4c6014f20..4748bebdc 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -223,25 +223,25 @@ type IssuanceAuth = SpendAuth; /// An issuance key, from which all key material is derived. /// -/// $\mathsf{sk}$ as defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// $\mathsf{isk}$ as defined in [ZIP 227][issuancekeycomponents]. /// -/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +/// [issuancekeycomponents]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation #[derive(Debug, Copy, Clone)] -pub struct IssuanceKey([u8; 32]); +pub struct IssuanceAuthorizingKey([u8; 32]); -impl From for IssuanceKey { +impl From for IssuanceAuthorizingKey { fn from(sk: SpendingKey) -> Self { - IssuanceKey(*sk.to_bytes()) + IssuanceAuthorizingKey(*sk.to_bytes()) } } -impl ConstantTimeEq for IssuanceKey { +impl ConstantTimeEq for IssuanceAuthorizingKey { fn ct_eq(&self, other: &Self) -> Choice { self.to_bytes().ct_eq(other.to_bytes()) } } -impl IssuanceKey { +impl IssuanceAuthorizingKey { /// Generates a random issuance key. /// /// This is only used when generating a random AssetBase. @@ -255,11 +255,9 @@ impl IssuanceKey { /// Constructs an Orchard issuance key from uniformly-random bytes. /// /// Returns `None` if the bytes do not correspond to a valid Orchard issuance key. - pub fn from_bytes(sk_iss: [u8; 32]) -> CtOption { - let sk_iss = IssuanceKey(sk_iss); - // If isk = 0 (A scalar value), discard this key. - let isk = IssuanceAuthorizingKey::derive_inner(&sk_iss); - CtOption::new(sk_iss, !isk.is_zero()) + pub fn from_bytes(isk_bytes: [u8; 32]) -> CtOption { + let isk = IssuanceAuthorizingKey(isk_bytes); + CtOption::new(isk, 1u8.into()) } /// Returns the raw bytes of the issuance key. @@ -267,7 +265,7 @@ impl IssuanceKey { &self.0 } - /// Derives the Orchard issuance key for the given seed, coin type, and account. + /// Derives the Orchard-ZSA issuance key for the given seed, coin type, and account. pub fn from_zip32_seed( seed: &[u8], coin_type: u32, @@ -282,22 +280,10 @@ impl IssuanceKey { ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE) .map(|esk| esk.sk().into()) } -} -/// An issuance authorizing key, used to create issuance authorization signatures. -/// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. -/// -/// $\mathsf{isk}$ as defined in -/// [Issuance of Zcash Shielded Assets ZIP-0227 § Asset Identifier Generation (DRAFT ZIP)][IssuanceZSA]. -/// -/// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation -#[derive(Clone, Debug)] -pub struct IssuanceAuthorizingKey(redpallas::SigningKey); - -impl IssuanceAuthorizingKey { - /// Derives isk from sk_iss. Internal use only, does not enforce all constraints. - fn derive_inner(sk_iss: &IssuanceKey) -> pallas::Scalar { - to_scalar(PrfExpand::ZsaIsk.expand(&sk_iss.0)) + /// Derives the RedPallas signing key from isk. Internal use only, does not enforce all constraints. + fn derive_inner(&self) -> pallas::Scalar { + to_scalar(PrfExpand::ZsaIsk.expand(&self.0)) } /// Sign the provided message using the `IssuanceAuthorizingKey`. @@ -306,32 +292,23 @@ impl IssuanceAuthorizingKey { rng: &mut (impl RngCore + CryptoRng), msg: &[u8], ) -> redpallas::Signature { - self.0.sign(rng, msg) - } -} - -impl From<&IssuanceKey> for IssuanceAuthorizingKey { - fn from(sk_iss: &IssuanceKey) -> Self { - let isk = IssuanceAuthorizingKey::derive_inner(sk_iss); - // IssuanceAuthorizingKey cannot be constructed such that this assertion would fail. - assert!(!bool::from(isk.is_zero())); - IssuanceAuthorizingKey(conditionally_negate(isk)) + conditionally_negate(self.derive_inner()).sign(rng, msg) } } /// A key used to validate issuance authorization signatures. /// -/// Defined in [Issuance of Zcash Shielded Assets ZIP-0227 § Asset Identifier Generation (DRAFT PR)][IssuanceZSA]. +/// Defined in [ZIP 227: Issuance of Zcash Shielded Assets § Issuance Key Generation][IssuanceZSA]. /// Note that this is $\mathsf{ik}^\mathbb{P}$, which by construction is equivalent to /// $\mathsf{ik}$ but stored here as a RedPallas verification key. /// -/// [IssuanceZSA]: https://qed-it.github.io/zips/draft-ZIP-0227.html#asset-identifier-generation +/// [IssuanceZSA]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation #[derive(Debug, Clone, PartialOrd, Ord)] pub struct IssuanceValidatingKey(VerificationKey); impl From<&IssuanceAuthorizingKey> for IssuanceValidatingKey { fn from(isk: &IssuanceAuthorizingKey) -> Self { - IssuanceValidatingKey((&isk.0).into()) + IssuanceValidatingKey((&(conditionally_negate(isk.derive_inner()))).into()) } } @@ -1116,11 +1093,10 @@ impl SharedSecret { #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { use super::{ - DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, IssuanceKey, + DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, IssuanceValidatingKey, SpendingKey, }; use proptest::prelude::*; - use rand::{rngs::StdRng, SeedableRng}; prop_compose! { /// Generate a uniformly distributed Orchard spending key. @@ -1137,15 +1113,15 @@ pub mod testing { } prop_compose! { - /// Generate a uniformly distributed Orchard issuance key. - pub fn arb_issuance_key()( + /// Generate a uniformly distributed Orchard issuance master key. + pub fn arb_issuance_authorizing_key()( key in prop::array::uniform32(prop::num::u8::ANY) - .prop_map(IssuanceKey::from_bytes) + .prop_map(IssuanceAuthorizingKey::from_bytes) .prop_filter( "Values must correspond to valid Orchard issuance keys.", |opt| bool::from(opt.is_some()) ) - ) -> IssuanceKey { + ) -> IssuanceAuthorizingKey { key.unwrap() } } @@ -1182,14 +1158,6 @@ pub mod testing { } } - prop_compose! { - /// Generate a uniformly distributed RedDSA issuance authorizing key. - pub fn arb_issuance_authorizing_key()(rng_seed in prop::array::uniform32(prop::num::u8::ANY)) -> IssuanceAuthorizingKey { - let mut rng = StdRng::from_seed(rng_seed); - IssuanceAuthorizingKey::from(&IssuanceKey::random(&mut rng)) - } - } - prop_compose! { /// Generate a uniformly distributed RedDSA issuance validating key. pub fn arb_issuance_validating_key()(isk in arb_issuance_authorizing_key()) -> IssuanceValidatingKey { @@ -1267,10 +1235,7 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); - let sk_iss = IssuanceKey::from_bytes(tv.sk).unwrap(); - - let isk: IssuanceAuthorizingKey = (&sk_iss).into(); - assert_eq!(<[u8; 32]>::from(&isk.0), tv.isk); + let isk = IssuanceAuthorizingKey::from_bytes(tv.sk).unwrap(); let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index 41a284a8a..ba8c80825 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -10,7 +10,7 @@ use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{ NATIVE_ASSET_BASE_V_BYTES, VALUE_COMMITMENT_PERSONALIZATION, ZSA_ASSET_BASE_PERSONALIZATION, }; -use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; +use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; /// Note type identifier. #[derive(Clone, Copy, Debug, Eq)] @@ -102,8 +102,7 @@ impl AssetBase { /// /// This is only used in tests. pub(crate) fn random(rng: &mut impl RngCore) -> Self { - let sk_iss = IssuanceKey::random(rng); - let isk = IssuanceAuthorizingKey::from(&sk_iss); + let isk = IssuanceAuthorizingKey::random(rng); let ik = IssuanceValidatingKey::from(&isk); let asset_descr = "zsa_asset"; AssetBase::derive(&ik, asset_descr) @@ -136,19 +135,18 @@ pub mod testing { use proptest::prelude::*; - use crate::keys::{testing::arb_issuance_key, IssuanceAuthorizingKey, IssuanceValidatingKey}; + use crate::keys::{testing::arb_issuance_authorizing_key, IssuanceValidatingKey}; prop_compose! { /// Generate a uniformly distributed note type pub fn arb_asset_id()( is_native in prop::bool::ANY, - sk in arb_issuance_key(), + isk in arb_issuance_authorizing_key(), str in "[A-Za-z]{255}", ) -> AssetBase { if is_native { AssetBase::native() } else { - let isk = IssuanceAuthorizingKey::from(&sk); AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) } } @@ -165,10 +163,9 @@ pub mod testing { prop_compose! { /// Generate an asset ID pub fn arb_zsa_asset_id()( - sk_iss in arb_issuance_key(), + isk in arb_issuance_authorizing_key(), str in "[A-Za-z]{255}" ) -> AssetBase { - let isk = IssuanceAuthorizingKey::from(&sk_iss); AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) } } @@ -176,10 +173,9 @@ pub mod testing { prop_compose! { /// Generate an asset ID using a specific description pub fn zsa_asset_id(asset_desc: String)( - sk_iss in arb_issuance_key(), + isk in arb_issuance_authorizing_key(), ) -> AssetBase { assert!(super::is_asset_desc_of_valid_size(&asset_desc)); - let isk = IssuanceAuthorizingKey::from(&sk_iss); AssetBase::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) } } diff --git a/src/supply_info.rs b/src/supply_info.rs index 1c2f346b1..1752fbd64 100644 --- a/src/supply_info.rs +++ b/src/supply_info.rs @@ -80,10 +80,9 @@ mod tests { use super::*; fn create_test_asset(asset_desc: &str) -> AssetBase { - use crate::keys::{IssuanceAuthorizingKey, IssuanceKey, IssuanceValidatingKey}; + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; - let sk_iss = IssuanceKey::from_bytes([0u8; 32]).unwrap(); - let isk: IssuanceAuthorizingKey = (&sk_iss).into(); + let isk = IssuanceAuthorizingKey::from_bytes([0u8; 32]).unwrap(); AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc) } diff --git a/tests/zsa.rs b/tests/zsa.rs index 5bf9063c8..dec5dcc1f 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -13,10 +13,7 @@ use orchard::{ builder::Builder, bundle::Flags, circuit::{ProvingKey, VerifyingKey}, - keys::{ - FullViewingKey, IssuanceKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, - SpendingKey, - }, + keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, value::NoteValue, Address, Anchor, Bundle, Note, }; @@ -61,8 +58,7 @@ fn prepare_keys() -> Keychain { let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); - let sk_iss = IssuanceKey::from_bytes([0; 32]).unwrap(); - let isk = IssuanceAuthorizingKey::from(&sk_iss); + let isk = IssuanceAuthorizingKey::from_bytes([0; 32]).unwrap(); let ik = IssuanceValidatingKey::from(&isk); Keychain { pk, From 0ee75f5ea7127b59a69101cce18dbca917e4a600 Mon Sep 17 00:00:00 2001 From: Constance Beguier Date: Mon, 18 Dec 2023 21:21:04 +0100 Subject: [PATCH 52/67] Circuit: move mux functionality into CondSwap chip (#94) In halo2 repository, the mux functionality has been moved into the CondSwap chip. --- src/circuit.rs | 14 +- src/circuit/gadget.rs | 10 +- src/circuit/note_commit.rs | 32 +- src/circuit_description | 3151 ++++++++++++------------------- src/circuit_proof_test_case.bin | Bin 5283 -> 5283 bytes src/note/commitment.rs | 6 +- 6 files changed, 1188 insertions(+), 2025 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 7c5ba1f18..0199d281f 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -60,8 +60,8 @@ use halo2_gadgets::{ }, utilities::{ bool_check, + cond_swap::{CondSwapChip, CondSwapConfig}, lookup_range_check::LookupRangeCheckConfig, - mux::{MuxChip, MuxConfig}, }, }; @@ -103,7 +103,7 @@ pub struct Config { commit_ivk_config: CommitIvkConfig, old_note_commit_config: NoteCommitConfig, new_note_commit_config: NoteCommitConfig, - mux_config: MuxConfig, + cond_swap_config: CondSwapConfig, } /// The Orchard Action circuit. @@ -455,7 +455,7 @@ impl plonk::Circuit for Circuit { let new_note_commit_config = NoteCommitChip::configure(meta, advices, sinsemilla_config_2.clone()); - let mux_config = MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + let cond_swap_config = CondSwapChip::configure(meta, advices[0..5].try_into().unwrap()); Config { primary, @@ -471,7 +471,7 @@ impl plonk::Circuit for Circuit { commit_ivk_config, old_note_commit_config, new_note_commit_config, - mux_config, + cond_swap_config, } } @@ -668,7 +668,7 @@ impl plonk::Circuit for Circuit { config.poseidon_chip(), config.add_chip(), ecc_chip.clone(), - config.mux_chip(), + config.cond_swap_chip(), rho_old.clone(), &psi_nf, &cm_old, @@ -764,7 +764,7 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_1(), config.ecc_chip(), config.note_commit_chip_old(), - config.mux_chip(), + config.cond_swap_chip(), g_d_old.inner(), pk_d_old.inner(), v_old.clone(), @@ -825,7 +825,7 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_2(), config.ecc_chip(), config.note_commit_chip_new(), - config.mux_chip(), + config.cond_swap_chip(), g_d_new.inner(), pk_d_new.inner(), v_new.clone(), diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index fe0dc4cec..dff412b72 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -15,7 +15,7 @@ use halo2_gadgets::{ Hash as PoseidonHash, PoseidonSpongeInstructions, Pow5Chip as PoseidonChip, }, sinsemilla::{chip::SinsemillaChip, merkle::chip::MerkleChip}, - utilities::mux::{MuxChip, MuxInstructions}, + utilities::cond_swap::CondSwapChip, }; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, @@ -73,8 +73,8 @@ impl super::Config { NoteCommitChip::construct(self.old_note_commit_config.clone()) } - pub(super) fn mux_chip(&self) -> MuxChip { - MuxChip::construct(self.mux_config.clone()) + pub(super) fn cond_swap_chip(&self) -> CondSwapChip { + CondSwapChip::construct(self.cond_swap_config.clone()) } } @@ -170,7 +170,7 @@ pub(in crate::circuit) fn derive_nullifier< poseidon_chip: PoseidonChip, add_chip: AddChip, ecc_chip: EccChip, - mux_chip: MuxChip, + cond_swap_chip: CondSwapChip, rho: AssignedCell, psi: &AssignedCell, cm: &Point, @@ -223,7 +223,7 @@ pub(in crate::circuit) fn derive_nullifier< // Select the desired nullifier according to split_flag Ok(Point::from_inner( ecc_chip, - mux_chip.mux_on_points( + cond_swap_chip.mux_on_points( layouter.namespace(|| "mux on nf"), &split_flag, nf.inner(), diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 857020c58..934238e94 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -22,9 +22,7 @@ use halo2_gadgets::{ CommitDomain, Message, MessagePiece, }, utilities::{ - bool_check, - lookup_range_check::LookupRangeCheckConfig, - mux::{MuxChip, MuxInstructions}, + bool_check, cond_swap::CondSwapChip, lookup_range_check::LookupRangeCheckConfig, FieldValue, RangeConstrained, }, }; @@ -1747,7 +1745,7 @@ pub(in crate::circuit) mod gadgets { chip: SinsemillaChip, ecc_chip: EccChip, note_commit_chip: NoteCommitChip, - mux_chip: MuxChip, + cond_swap_chip: CondSwapChip, g_d: &NonIdentityEccPoint, pk_d: &NonIdentityEccPoint, value: AssignedCell, @@ -1902,7 +1900,7 @@ pub(in crate::circuit) mod gadgets { Value::known(zsa_domain.q_init()), )?; - mux_chip.mux_on_non_identity_points( + cond_swap_chip.mux_on_non_identity_points( layouter.namespace(|| "mux on hash point"), &is_native_asset, q_init_zsa.inner(), @@ -1939,7 +1937,7 @@ pub(in crate::circuit) mod gadgets { // hash_point = hash_zsa if is_native_asset is false let hash_point = Point::from_inner( ecc_chip, - mux_chip.mux_on_points( + cond_swap_chip.mux_on_points( layouter.namespace(|| "mux on hash point"), &is_native_asset, &(hash_point_zsa.inner().clone().into()), @@ -2342,8 +2340,8 @@ mod tests { }, sinsemilla::chip::SinsemillaChip, utilities::{ + cond_swap::{CondSwapChip, CondSwapConfig}, lookup_range_check::LookupRangeCheckConfig, - mux::{MuxChip, MuxConfig}, }, }; @@ -2370,7 +2368,11 @@ mod tests { } impl Circuit for MyCircuit { - type Config = (NoteCommitConfig, EccConfig, MuxConfig); + type Config = ( + NoteCommitConfig, + EccConfig, + CondSwapConfig, + ); type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -2446,10 +2448,10 @@ mod tests { range_check, ); - let mux_config = - MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + let cond_swap_config = + CondSwapChip::configure(meta, advices[0..5].try_into().unwrap()); - (note_commit_config, ecc_config, mux_config) + (note_commit_config, ecc_config, cond_swap_config) } fn synthesize( @@ -2457,7 +2459,7 @@ mod tests { config: Self::Config, mut layouter: impl Layouter, ) -> Result<(), Error> { - let (note_commit_config, ecc_config, mux_config) = config; + let (note_commit_config, ecc_config, cond_swap_config) = config; // Load the Sinsemilla generator lookup table used by the whole circuit. SinsemillaChip::< @@ -2476,8 +2478,8 @@ mod tests { // Construct a NoteCommit chip let note_commit_chip = NoteCommitChip::construct(note_commit_config.clone()); - // Construct a Mux chip - let mux_chip = MuxChip::construct(mux_config); + // Construct a CondSwap chip + let cond_swap_chip = CondSwapChip::construct(cond_swap_config); // Witness g_d let g_d = NonIdentityPoint::new( @@ -2544,7 +2546,7 @@ mod tests { sinsemilla_chip, ecc_chip.clone(), note_commit_chip, - mux_chip, + cond_swap_chip, g_d.inner(), pk_d.inner(), value_var, diff --git a/src/circuit_description b/src/circuit_description index 903fb3017..6513b720e 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -10,7 +10,7 @@ PinnedVerificationKey { num_fixed_columns: 33, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 63, + num_selectors: 61, gates: [ Product( Product( @@ -13750,144 +13750,6 @@ PinnedVerificationKey { ), ), ), - Sum( - Scaled( - Fixed { - query_index: 0, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Product( - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), - Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - Negated( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - ), - ), - ), - ), - ), - Product( - Product( - Product( - Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), Sum( Scaled( Advice { @@ -14349,7 +14211,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -14458,7 +14320,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -14567,7 +14429,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -14608,53 +14470,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14664,12 +14494,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14679,12 +14509,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14729,53 +14559,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14785,12 +14583,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14800,12 +14598,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14874,53 +14672,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14930,12 +14696,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14945,12 +14711,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -14993,53 +14759,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -15049,12 +14783,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -15064,12 +14798,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -15198,11 +14932,11 @@ PinnedVerificationKey { ), Sum( Scaled( - Fixed { - query_index: 4, - column_index: 5, + Advice { + query_index: 21, + column_index: 6, rotation: Rotation( - 0, + -1, ), }, 0x0000000000000000000000000000000000000000000000000000000000000002, @@ -15279,41 +15013,72 @@ PinnedVerificationKey { ), ), Product( - Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, + Sum( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, ), Negated( - Fixed { - query_index: 28, - column_index: 28, + Advice { + query_index: 5, + column_index: 5, rotation: Rotation( 0, ), }, ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), Negated( - Fixed { - query_index: 28, - column_index: 28, + Advice { + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), @@ -15321,214 +15086,13 @@ PinnedVerificationKey { ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Scaled( - Advice { - query_index: 21, - column_index: 6, - rotation: Rotation( - -1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Product( - Sum( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - ), - ), - ), - ), - ), - Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), - }, - Sum( - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Sum( - Sum( - Product( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, + }, ), ), ), @@ -15791,8 +15355,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15803,8 +15367,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15818,8 +15382,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15833,8 +15397,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15848,8 +15412,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15863,8 +15427,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15932,8 +15496,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15944,8 +15508,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15959,8 +15523,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15974,8 +15538,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15989,8 +15553,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16004,8 +15568,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16073,8 +15637,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16085,8 +15649,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16100,8 +15664,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16115,8 +15679,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16130,8 +15694,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16145,8 +15709,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16223,7 +15787,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16344,7 +15908,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16489,7 +16053,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16608,7 +16172,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -16742,7 +16306,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -16854,7 +16418,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -16966,7 +16530,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17097,7 +16661,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17216,7 +16780,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17347,7 +16911,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17490,7 +17054,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17595,7 +17159,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17700,7 +17264,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17819,7 +17383,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17924,7 +17488,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18029,7 +17593,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18134,7 +17698,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18265,7 +17829,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18385,7 +17949,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18497,7 +18061,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18609,7 +18173,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18684,8 +18248,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18696,8 +18260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18711,8 +18275,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18722,12 +18286,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18737,12 +18301,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18752,12 +18316,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18796,8 +18360,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18808,8 +18372,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18823,8 +18387,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18834,12 +18398,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18849,12 +18413,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18864,12 +18428,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18908,8 +18472,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18920,8 +18484,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18935,8 +18499,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18946,12 +18510,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18961,12 +18525,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -18976,12 +18540,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 29, - column_index: 29, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -19074,7 +18638,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19089,7 +18653,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19208,7 +18772,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19223,7 +18787,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19320,7 +18884,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19335,7 +18899,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19466,7 +19030,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19481,7 +19045,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19578,7 +19142,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19593,7 +19157,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19697,7 +19261,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19712,7 +19276,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19774,37 +19338,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19814,12 +19362,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19829,12 +19377,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19844,12 +19392,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19859,12 +19407,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19902,37 +19450,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19942,12 +19474,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19957,12 +19489,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19972,12 +19504,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -19987,12 +19519,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20030,37 +19562,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20070,12 +19586,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20085,12 +19601,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20100,12 +19616,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20115,12 +19631,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20165,37 +19681,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20205,12 +19705,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20220,12 +19720,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20235,12 +19735,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20250,12 +19750,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20312,37 +19812,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20352,12 +19836,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20367,12 +19851,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20382,12 +19866,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20397,12 +19881,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20447,37 +19931,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20487,12 +19955,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20502,12 +19970,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20517,12 +19985,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20532,12 +20000,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20568,37 +20036,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20608,12 +20060,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20623,12 +20075,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20638,12 +20090,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20653,12 +20105,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20689,37 +20141,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 30, - column_index: 30, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20729,12 +20165,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20744,12 +20180,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20759,12 +20195,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20774,12 +20210,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 30, - column_index: 30, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -20820,7 +20256,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20835,7 +20271,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20967,7 +20403,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20982,7 +20418,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21114,7 +20550,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21129,7 +20565,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21235,7 +20671,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21250,7 +20686,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21371,7 +20807,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21386,7 +20822,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21533,7 +20969,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21548,7 +20984,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21680,7 +21116,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21695,7 +21131,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21827,7 +21263,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21842,7 +21278,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -21948,7 +21384,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21963,7 +21399,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22084,7 +21520,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22099,7 +21535,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22243,7 +21679,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22258,7 +21694,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22390,7 +21826,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22405,7 +21841,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22511,7 +21947,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22526,7 +21962,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22632,7 +22068,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22647,7 +22083,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22768,7 +22204,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22783,7 +22219,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -22896,7 +22332,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22911,7 +22347,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23043,7 +22479,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23058,7 +22494,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23190,7 +22626,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23205,7 +22641,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23325,7 +22761,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23340,7 +22776,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23446,7 +22882,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23461,7 +22897,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23567,7 +23003,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -23582,7 +23018,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -23620,20 +23056,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23643,12 +23079,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23658,12 +23094,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23673,12 +23109,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23688,12 +23124,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23707,8 +23143,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23748,20 +23184,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23771,12 +23207,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23786,12 +23222,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23801,12 +23237,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23816,12 +23252,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23835,8 +23271,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23876,20 +23312,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23899,12 +23335,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23914,12 +23350,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23929,12 +23365,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23944,12 +23380,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -23963,8 +23399,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24035,8 +23471,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24047,8 +23483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24058,12 +23494,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24073,12 +23509,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24088,12 +23524,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24103,12 +23539,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24118,12 +23554,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24163,8 +23599,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24175,8 +23611,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24186,12 +23622,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24201,12 +23637,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24216,12 +23652,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24231,12 +23667,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24246,12 +23682,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24291,8 +23727,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24303,8 +23739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24314,12 +23750,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24329,12 +23765,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24344,12 +23780,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24359,12 +23795,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24374,12 +23810,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 31, - column_index: 31, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -24458,7 +23894,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24473,7 +23909,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24608,7 +24044,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24623,7 +24059,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24736,7 +24172,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24751,7 +24187,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24898,7 +24334,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24913,7 +24349,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25026,7 +24462,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -25041,7 +24477,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25161,7 +24597,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -25176,7 +24612,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25323,7 +24759,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25338,7 +24774,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25451,7 +24887,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25466,7 +24902,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25579,7 +25015,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -25594,7 +25030,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25729,7 +25165,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25744,7 +25180,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -25876,7 +25312,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -25891,7 +25327,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26011,7 +25447,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26026,7 +25462,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26132,7 +25568,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26147,7 +25583,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26253,7 +25689,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -26268,7 +25704,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26304,21 +25740,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26332,8 +25784,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26347,8 +25799,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26362,8 +25814,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26373,12 +25825,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26435,21 +25887,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26463,8 +25931,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26478,8 +25946,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26493,8 +25961,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26504,12 +25972,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26566,21 +26034,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26594,8 +26078,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26609,8 +26093,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26624,8 +26108,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26635,12 +26119,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26671,21 +26155,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26699,8 +26199,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26714,8 +26214,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26729,8 +26229,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26740,12 +26240,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26776,21 +26276,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26804,8 +26320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26819,8 +26335,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26834,8 +26350,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26849,8 +26365,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 32, - column_index: 32, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -26905,48 +26421,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -26961,7 +26445,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -26976,7 +26460,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27036,50 +26520,18 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( Fixed { query_index: 32, column_index: 32, @@ -27092,7 +26544,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27107,7 +26559,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27167,48 +26619,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -27223,7 +26643,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27238,7 +26658,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27272,48 +26692,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -27328,7 +26716,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27343,7 +26731,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27377,48 +26765,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -27433,7 +26789,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27448,7 +26804,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27520,48 +26876,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -27576,7 +26900,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27591,7 +26915,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27651,50 +26975,18 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Fixed { query_index: 32, column_index: 32, @@ -27707,7 +26999,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27722,7 +27014,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27756,48 +27048,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -27812,7 +27072,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27827,7 +27087,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27861,48 +27121,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -27917,7 +27145,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -27932,7 +27160,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -27966,48 +27194,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28022,7 +27218,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28037,7 +27233,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28078,48 +27274,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28134,7 +27298,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28149,7 +27313,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28209,48 +27373,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28265,7 +27397,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28280,7 +27412,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28340,48 +27472,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28396,7 +27496,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28411,7 +27511,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28459,48 +27559,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28515,7 +27583,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28530,7 +27598,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28564,48 +27632,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28620,7 +27656,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28635,7 +27671,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28669,48 +27705,16 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28725,7 +27729,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28740,7 +27744,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -28774,8 +27778,18 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Fixed { query_index: 32, column_index: 32, @@ -28783,39 +27797,106 @@ PinnedVerificationKey { 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 32, - column_index: 32, - rotation: Rotation( - 0, - ), - }, - ), + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Product( Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 32, - column_index: 32, + Advice { + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, ), ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -28830,7 +27911,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -28845,7 +27926,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -28859,56 +27940,136 @@ PinnedVerificationKey { ), ), Sum( - Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Advice { - query_index: 0, - column_index: 0, + Fixed { + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), }, ), ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, ), - Product( - Advice { - query_index: 0, - column_index: 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), }, + ), + ), + ), + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Advice { - query_index: 2, - column_index: 2, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, ), ), - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), ), ), ], @@ -30310,50 +29471,50 @@ PinnedVerificationKey { (0x0decb727cf32e573604ae3928a761b450d9460f2a7283c8cf88a2b38b796e575, 0x044c0a88bc6aa468e75fc709f9eb21b6e309dd8a6ca62f7a3da86299141ea3a9), (0x285e16cead69d5fef9441d4d4ac695fe8880120d209e1e631d8a4bc5f55e90e6, 0x3700fd2dfcfac5b2cb6d33c60ac79dfac3fb95518cd0aa97c75a51d62281f2c1), (0x2dc11f4f0000da15c59cd395ea5f32b4e79783d958c290c821c89e0bcb50eaf1, 0x2c53e12ce0a2022516ef31f0224b0bc1b119861078358f78d245ba5d2f180099), - (0x3fb934de80a76b78bb5daf3fb368ebcefabc5b6b9ebae5cddc1e39c82b122b48, 0x130a034bee7622c60e8a53f70216e48696f5d9457aade41f0ef09166091c66e7), - (0x19e589077358b9abcb3e21a71537113cf43c43aea7e300fdfb755bb29449a5b6, 0x1da596141c740b648dabc4961ed014ed0dd8dfcc03b2d02cf6ff9e8a3ff0e42e), - (0x1af56c46ba6aaab50db1acd46003c05c3fee103776681f61100b1b6aef07c284, 0x38eea07b7f5881eff963d114e50084bb5bf5cf359f023fc855f3a01b0ca1e432), - (0x0cfb7c9b0bfcf398a53c13d6e1068989805f1cf254dddcaa4ab57da05ad0616e, 0x37fcd5b873385ee44169fe3870a9feeadbf64c21fa2c4b130f718e47f29ff8dc), - (0x03c0cdbe7ea6296a9eb724d225d0adf451999dd9686aaa5659e23102b5daec07, 0x1ec2e8d39dd47c991a31f9476467800bf49655e7293efc4e5261b7ffb15af542), - (0x1314cd9c9d35b73165e86972dc6007ec35aab9ef8f6358cc090043cf68c4c2f5, 0x3d9e921baede6846e7fd2f0805deec1da2395e7d3f647ef8f6e5ecdb456c22c3), - (0x3e3c175e12e425f9f5b499541aba80122e8c346ab329e8d2400debb7a4298473, 0x3621561ea96a7834b55250be2bc137fffa02705ca49848c61955417883a289c1), - (0x0491089f80b3aa79defa2923388ba287c07ff7b5d805932133b249b674c69dcb, 0x2463e5cde6ef2b91fbd72d8d1511556bf6d9ec460f19b890544bc6886906741c), - (0x2b8e5f9c2efdb6cca222b066bd10be6c1ec15951b5f22f11e7bdad199936d91e, 0x2579a5ebe80abe31205c73ebfe4012559a9c00f9ed2a7303c08420dd46ecccc8), - (0x06abaaea1008f82ba485632d1e6d130e8bd9baf450cee1210b5780fae7df1012, 0x0b21835ef9aed7d7b1a0dc9b2af53fab3a6c4f1a8a3568c2570d06ba392a73a1), - (0x1f18cb4d7fc46f1fe4aecbaf07fae7d29a0cb49317f60c17161837443e2f32a0, 0x3827b12472ab9f40d713702752e542832f8e812ca73b14e975b42ab7c56f10b9), - (0x1880c0651fead5ccae365349f9158252d6846f24f3d4c1fa9c190ee0b9020f3f, 0x05fb1b7ad97f29412f5a50cd0369f7c2a4cc07f98e2e4ddc0b677a97ac3617a6), + (0x17e9ee15383a32a80bd1d4b3ae53c19389748922e9bf4dbc4884e20a472b10ef, 0x1947806a1f43a3f2b675ec6d46d1678d1f18374ef89ec2654152e454346b3add), + (0x365c3f7dfaa40ec708988a9392112df6725a65eb5f70b809025ee47e9dae145b, 0x1661613acd8709d05038f6d5ca5a8508c0dd881d5879d85dcd4ea48aa12875fc), + (0x178d86d072746921f193c4a1f24e0bc252c810e7fb4ca7dbb8258f7dfb45a547, 0x153d91d5ea619d522d5a4dfdbcef80686ed1328980f1dab8aea30357ce57bd0a), + (0x35d8b6e2ebbc57d08dea9e510d450b40b5a3dd4359f9f2a888610aff29ee3c23, 0x360e4b2ce85b08d0a9576207382c26de7ad35ce33f582b6eeedd72d406ff9cef), + (0x309fd7b620087579d276623592c791f36cd3424b2230a8e7d45dcaf586ed288b, 0x0e77ac0389e400aba724c636c13e01de338bbaa8c992a0174be3504204c15a26), + (0x3bd856be3b91aea580396400bc03d30de759946141fd92cda5d975b64b4f48c7, 0x1b8fb47363e53a6235dc03a8d1ee9e81ed13e8affb1ea7fc2228df24d6d795d5), + (0x15e059df5a9a5c7e33e31e5ab4f2629efc513bf6cffca27de6b279632b8f7b06, 0x2e715a322fad2b5bf21dbcb66c26dbffa26c4c00bb2a45ae30c456daa3a75a86), + (0x307aa50de381ca85af5aa98cb4b8f3c74d0e4b49d02929dda1e4f187de911e19, 0x032f3980542054f73b659cb328e7db6cef6ac537fc9cae3b09fb7b164cb542f5), + (0x0d0c4b42b87439e56df6f41f07d93367df6f5a64d273338b0d4c8c242b908849, 0x2ab0f7f461b85408e4d007d0fcb5fa6f70a18b42c373d515f7c1e55bc20c384c), + (0x251b9a858904eb93ea4b89b3a65ceacd637db066f16d1fa896eda84434d72950, 0x2c60a586cb79bcca811be1d1092a23131a6884ccb2d809f92e94c5a4d174b167), + (0x3b09db3011d8047afc6ea9c8f3787f9b1870affc14ab64a9433508050cd41d9f, 0x3903a28dcf729c1132353036fc2819a0d0dce6ceda266a388ae401026274e99a), + (0x244649d7c67dab9df822ad21a4a3e46afcc7e020c31c54563d78b81bc4ec4f18, 0x2d5ba72aca69c6a3d5a2c3fa22c5d0c4b91b340bd757b344caae739cece6efbe), (0x18b67544d4466429760be2b231418b43d35d79462f8743051c8e437dd710035d, 0x2ca31a6106310316da5633fe4e16e2a0affafc4541b280a9722ae86219127aa0), - (0x0477cc6f6292f9d3dcbcdb6b896dbc2b76b8716db8d80f36af610738a89e58e0, 0x0fb4d1d92e0606c83e4d1359ad9e607a936339871c9c606cc9218225c8a762d4), - (0x027f5c9006d53a989091caa780c6b4ec009e328d03836f95ee05bfb2178ba931, 0x2c7612c86a27585617aa8b0202e638d57b079417ca8722a4f47c3c12892cbea9), - (0x1b9d2736bed08950ac569b6bc5d2a8bdd48cec8a206030c306f665af83c4df12, 0x2b8e0e07c521db751c386d011504b5f4c8fd2b09ace077e54f05bd0fbe0a2def), - (0x3d7f0951711965e07ab0e4c1451361e5b536793dcf76176e4e854285a7bdabba, 0x13780fb58b9b717ebd2040e8d79be7bc7f32c5d9b31b0766c6eea63ccc6c6ff1), - (0x2ebee709b368779cf6bc2bec772f19fee25938985b94fef3a86c9950adcc9ae0, 0x18af23ba308d2e8a6d9bf544def217546a8e9816192ce2c29841379a935b74ff), - (0x2a9ef8f91987bd8f2f6101abfc05caf7e30c7d79faba1022d547a00b04333f7c, 0x153a1907977cf09f557085c0f256b877f72567b3a2f92179e33d468fbfc8b10a), + (0x1bc437a546b233020c7dfb4a62ec2720348e39160b45d0a6739df91eff962d75, 0x11f3c7e8df45cbd7d0e089000d0af3192b29e31edef31414897229edbf23b9e8), + (0x36579b3969fa8bb60eb3ea82410d5b440f5cadc10bba33c2f952d6e6e0647d2c, 0x332696aaf0ece706b633aeae97764c7b867e4be79c53f1a1ebed9053716d95df), + (0x2c47c46efa6b729a216455d1887eb910e21f50bedb97d48fd76f89e3abf4e5a4, 0x20da2ca8dde7430e2b663c22d10eeb6b511e341b6a29fe9dd094ab249da4f5db), + (0x12da47c8091b8de4fc979e49f7b173d352504f18ccc461ecc5bbe4a798078ba8, 0x2d7eb25b36bb9419d081f457f4424ffc9c3b47d558063bc5c58de550c041cdf9), + (0x33a7a93684fd8f5890cc6df73bfee688ff4c778b237afac6a00807d74750f07e, 0x09ba011a18d53d7cf20a020d179ba3a2dd93c1c5fa1c5906d51c16e78c15b2e1), + (0x00f0d0db9c11b86736183d8ef1c4e621a045ad11e4ece8b32e65cd3937193ff0, 0x173d130f6ce49e3ac2be51d550dc1854fec456c82f6ddaa46bcb4c29c9be3601), (0x334105dd96996a08df56e88261dcd87c5356cfc0f2b8ae0a9419899d5def147b, 0x09ddf24ae765eda056cf59b16ac14464240c83e253135682c02e6546f89dd396), - (0x2dac89c801000721a4422cb8bb1def97cd3bfce7c64ac6327e335b3c0071a049, 0x2e2575abf15aa7424617ae9c7c9749c67c38a3e68082c4f937e4dbcff98b4dfc), + (0x04706edf95516db26def46d92def64d6a61cb357ac5ace44a1015c33238778fa, 0x03560c6396e34aac8e541a7811eb0b7fb1b70262af59976f933135f3bf5b21b1), (0x0b89c282c8f2d54e66c7a11e6b4338a2f06a7c9430f7d3376328f12fa001cac5, 0x098b5c8ee6548183ccb4e60cdfee10b509db34ed136daf3530a426e8f200e89d), (0x2f7f85b86b6adcf714d0df7878f4604d33fd319f39bd00fd5c34378247a155b5, 0x3a2f025447b83b65d148e99c93fe8bb991a81ef6d2f827f010680467361c47fc), - (0x121fe2a31c21b4d21266dde870a72ca2e96ea0fd80ca2ca59436c8cad25ae150, 0x0d2aff2c6e65712a354da894209b75ff8479cb958ab050156f63f3760b8a05ca), - (0x14815e90ec334c51da36b50c69b8f192f1cfd63fcd3257c7a16691b7be2a1759, 0x0711e90858dbade5aac1c82b1000a59e2beccfd84db4e212368b1a5b5a8ecf3a), - (0x3bd7f461093bd6b774837199b58d3d6741f80ce738345b18800adf8fedf37286, 0x3f9162dc512623e1c62b2360fb6db7400f9c545b2028af0f4580d308fd44818c), - (0x1f64379a921e197082d9e2afe9baa825f2af8fa02bbfa653772604bf22125eaa, 0x348d5a1de410f8c0ec8f9fe4514709c6cbc0882dc8d6ec0f8562f05c535ab2a9), - (0x12e6bba88452419d3d1632edf16b02a63a5ac81241118845ea41ed70111f1f83, 0x3f0899ae3f41bea051afee8df4dddb13d78857773df79d2e6eeae02b0c8f423d), - (0x0f59f5bdf3fbc2551cff44f3444bdb84ca5956aa0ec424cb8d8318abc12370d8, 0x219d1021cfd377e3ea006ed15485437702218e0cc6e76975025f7632bd66d072), + (0x2f6abda2aac141daa71c4840e9219e8436e17490a00d8515671b680f46ffbfab, 0x2c75aee9bdf500ef2a0168b6fa0f10c842985c5c426815e19e6f6636d6cf398a), + (0x0efdfd083488fd21fd34b09babfcea5e011189a37a52b4dc0afb218d5e604059, 0x397ed924bd171cf27208fe866cc124716d635d44f0cba045700e4136a3185179), + (0x0bb5f4d46d728f99749505115a25d8c8f281f46b5fe187a5ed722a68c1f0d8ac, 0x3e31c0c30fb0b01202f35c9336e40e91791d6b92800b2ab62bc9e0d7736a91b8), + (0x2c129e36dba381b51ffea33bf3a8ee685044217aa05865845e870971284b3d80, 0x0a07fed35f5d06923fcec6487e015d1c591d1be2d0028445227fecf733d765b0), + (0x2341c41103ad0c10434f84c82e13070b4018d325e0340f71a980600bac88dba8, 0x18965a11e1ebaea864ccd67f34faf358b5aa34690213eecda9cd94f3ea0db644), + (0x045ceb3c0119d08391456db1c30335869ee9bd9d90898c4d9f65d6486f2e3a60, 0x138805b0eab5b97ecc613077f5d91c5690f642d1d40801e6ace05a2e4947aa0c), ], permutation: VerifyingKey { commitments: [ - (0x05625166f1bf876dd59af0e45b068df3dc22e28accb12418d5111fc12b563d4a, 0x102be9e1b4fe8a6d8c00ffbf6513e8410b9a940a7b559914fdeb45a2b170cdb3), - (0x2319a6b8fdaca310c4042b98fe068ce93913270e534c3d88029fc5f8ba6ab3d9, 0x1a4374fb532ec3d030217dc66c6e0db4ac456bee8641cfe049190973c8b5c72f), - (0x0765958f562227c7838c73baba821f9c2f40868c58654dcf675b718feef1a01e, 0x378fb34b8ab337872d942b99123219ffe532124adc9cd3c31437aa6a5becd763), - (0x1df175a3908c91e4d9c1e4fd6e8f30d3fde110f9dc379eec7db39ceaa53f2ad6, 0x3b419848016ad53c7aaa29602b85580c499016ceb49ccf8496f7e9b3f413d4df), - (0x171cad3d3e6e7a153ff12d86ee56a01505acc1ee38fb9a11b68abfa5ad1a1e46, 0x37343f7a56d7e180ddd2ae2ca4301d5128becaec07cafcad1b7d3610e49f453d), - (0x207970fdc943d5b65689b132d27fdc46ed25c8d84042acf0e855c8bb00a60f2b, 0x364ad7be4b0b40da9d5df01c50967ee14cabc8bd669872613c1d62ad1f52f38b), - (0x19a1a3391e950797dbb98811f2ba3b4622147959449f9cb1c7f454aa047afe76, 0x079ae13ad5b0083006b06de42808f517d9797e5f42fc87a9947c761fa8784fea), - (0x08035a60101d47769ed0a30ce647c0e5d5c7850f1630247af48f351c7ac5b6e7, 0x3b0c43b451b947f7adbffa12d9e4c7ca94ac5c12eda34cee77b640f25a42d04b), - (0x116e9d6aef40f13742fb573a0779c99f5a12f59fab1246d64a55d94e3856800c, 0x0d595f9d79e749dbd9d69ca28b15f80a17b5312be520568e1f959f1b958bf1aa), - (0x3bf0f0b99e15ad38e2d9d5a9e12aa428f55db0cb878e058ea592eee7d16edfb4, 0x32a0e3bb91ab0ee8f25ab4d8f93782724cd68675e823e66369f0c6a36ece62d8), - (0x2cdb9602b74f420b08e5307df902d13340d3b1b53d081b110149e01d731dd862, 0x0b7b5bbb0b5b19148a410ce3c2625364660d100aad28542e75282ff7cc5926a7), - (0x20dc0d54e1617ea5a6251e447e06e8a98030d79b426bbe946fe960f85550efa8, 0x25f833bd3ee582088cf25891465c3908192d77eca169f8c7d3d373fd12c2fade), + (0x0a10cdf73732c92a9bfccca2a25375be5b665c4bec263a273de481f9cf0b5295, 0x3a00666c4f8b7e78be743934fcde87d488bed7562c7d9058e6216eb6c02d913f), + (0x3e39086d109bc5cacb5876df02e676d8a45de411fb6060582dfde9935d4c9eb5, 0x23b2462b03a2f4a16fc1a85afb3add387576544976a9a79d6d8fa7b6470e7433), + (0x0113540e4a2c0f5abdd94d0cac1560ae76e123321f2eb00ab54b2af05a342d24, 0x35c1e8432935ea039417295e65156588fc7073b51ff6295c698e6a80a3b54d8f), + (0x365d7cd6bfef5ffe3ad7a119137e07c833648fe14e705cb4a1cf8ee26ea1a20a, 0x18ee51fd1b2a568be36f26daaebcb86cc6938fd2d5e46f072bcc275ad709fded), + (0x39d1e52ce9c0cafc4c1a1626b1e0d8bf6a656cf8766f01f6e56fa9636d751c09, 0x3b5d5f81057a46a881474047ded09537dddb788eec68649b41d115bf97ef2a7a), + (0x2489c689eb055e5b8e7905aba42e69cf32ff72f53413a0aff1a21111b22754c0, 0x05fc261835cd944336ec75d4dd2e763693b68137f79838b7e68a144190c2142a), + (0x0be557c80085a65b612710201b738d5b78966eb79515355dab5a95fbfe486dc6, 0x0b658d0f6f39f59dbd4b422edcf73303176a8d5ff2b4126786cce72c1222bd69), + (0x3b9be0eb6f48b9b85d25517d30e5e97da5a888c9cc0440945dbaa62836a996c2, 0x15f297866cfc657bcd6f0e2214fbcb7443a3d6cf3acba1702220949539ed22bf), + (0x178fe0b2e7f7bf3008b0f2b3cf31c0cb4feee66e1a77ae310d81274e357eca08, 0x396df2ba8eb452acc143f2d240ef7d0f641cc2b9601ef2b25b5258e4107b663f), + (0x3972e2487754d8ccc6cfffa905f883c9c2338334894bd59e379a2be11b367df7, 0x2d64ca17acc3ae2a3948b80c2943a40137806607e979d43a834e66ae6e6913aa), + (0x135852e8c481f1e13f3facb7a11ffb358046ef6463757e69208f430652eda7e1, 0x3eccd189556c08b0cad7659259b7ab3336815134c1c1e26a1a55437d17d7fa93), + (0x3a4d8286e222f01440ecedf6873305351edccac685093cdc42395043a6838ebc, 0x19dace40c3d00ae4a842708359d5c2e4c67d1490676b601a57285297f94d290f), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 97e15d58205d44afb2165e5137b7b4e81b843d4d..e64bc990c57fa43775d9c4cd66922d7c0f00d09d 100644 GIT binary patch literal 5283 zcmV;U6kO|q79F&ynyrOo?Rz;nC#<8qHy!g}(q+nU7>cTw)CdZ$w8PA)uIS?TcgwAG zF?(=$F5)wZyZbPmmur1>{a}}5ih;;i*bZqm&@pf|v^9!Bmtc-A45cpBOCoHQpoA7A zdTm&8yrIY`cD2)yOQFp-=GsgEAQD4n! zV%F&#_)=#6g9MuQzrzh_G6{TfzP_e&&MVsaS5M*iY%nhS7>$;TzwTKlc6!;lofhD6 zA=mYYV2ufQL}g-9Sn+~4UYj;)yXfp@3I*sLcRADiFY2NrLXTpl(ePPPqbfCc)T#7> zlLSW<5P$WrKX7KuAWydho+yGjz#C@9gsSb*oDPKf1)?z`3lKsbulY#Zy*K>l4(5Cm);>>9Hez&$+wI+Q}N~%zGBim7M;p zfC!R_JVFt1C7K=1d1s(6JL}0U!6zv1MF~oWGtIo1(!B5A@q%9FVvl{jZwg~EKE`Cg zkaiSTACzrz5<#m4Ujl>EQ+lGad^3Gn2Q^c(UU~;Ar!eqJik6 z7%c^f{>UoDlBl>6YrFU_gNkCNcDeGc%MqX{emx_w`cL&ikTSi881mocH#Lu{5n631 zwuww~YREP8dpoq&R?77Nhn7)A1W?UXug}!&{mmb|upAasP)B||PGWxvW%Ak(^qy1Fc?|mT z7#98kq&9=pqdk>==u8o=1~{|2oyiKZ*vm{9n z84{`2?t%CzzKxGgA0-9-!wK?vGhqVYel!#y;eIZ6I0bs|r-O_!kyaB+Txqpa9-s{( zzs`adoSFw3Rfff0CzDU*jUICrq}|2pA`jGhYkAiuaso^ta1f>j_&|OiaC6SzQ4qUw zv|WR1(L~GyroA{jvT|7r90Ukq^Un}R#um3t3ZBAu-hc6LxPCMcqgdd!0QVtEp}krloEm0$zYF=B5&Plt27MPg zMgU^d<&qRuX9)2zpdr0!`EjfK!WQ89?p4Cukazi4e{#*#;~#LPBBY7CF#p3zaaJ{D zPC90#ryNz_Qp$@2gfxu2EXwMo?A%8E9?R{-WCmp;J_Tc6Zg1V~^)jD@2M}W_r03EL z}&B>X<{n>m(Z)fgBIP_okYs7BE^S=y9LH9>0`*yo&osN9Py`1sz*Qg2;3t zvuJg{L|Nw!!IBmpIx6Bed?d){{_Ky2+Z%DgsT1EMVobl|X+6!eyCq_Vsx=5dc3hG+ zYLO;z8VJg0yWVrWhD}IZmhsutZJ z7iGJBjLoQ?X&xEi5vRB94n529!k$qd*fwV9(t|*ibRXrLNOFOCa@-gQ#F9HrI3Q;j7+x^vm_GU`G za|VwQ)?h#UM#5kiOCe~u$JJ9z;I^CMJ7ZgRbH2-si#!>uXD){s_? zt~ok$3HrU6qHKp5J^}~9kDiV!wG4D@10mpE4e4~6g@&xIYoEq{A*QV6u>;iFn1KNT zyL4}{+oRfA0yk%Kv9zfKiB#q0txR#D<{2gI&mBi&IBeVq)F~Ns(3L`~DzB_;*>j5zm;lN>fWsIb@srJ_e z^Q3*n(UStp=qF(b(K(sxMF2!l$XOCw{ME9Ff_b>q&(irg-dqPm%TOOOY^b$0TRuaI z=*1UoGBNi}=d4XH=}6(sh5M%`BAV&x?6UjE2NEMeC|(G8k&mU1$55)5i_oAFo%ZI; zLDvxPa4X2T(g39;qP&6nwJ>qQo#Vl_m?`Y3q*~BnrT4|wL+Np(d?gKe6s87rgGq#) zLu<1};;9 zBoTT0V6JgBJL|G=<1uE2flS&_=*~5tQx3(YUth!ZYdKssvGOYk?Faetqb;@vs6bW< zS4SYt(X~tsjEASmPB}6&k+`yzv&~xPLkUGN89sOboGP0$b9B{%CUYaJd^dt~Zg`Ivb= z`2gPp=MPZInCuoLJdg36#_avHU=_~9jAO4p;h)qU4sC~}!Ce1IYc#WT*8e02z?HF9(Z(CsWc3nlM zbkuE%190kxVCAJ>OSXqC=P?dOYzq9)v>LJ{n3l<(9vD3aa>)l@l!u$#wIwcY@(E;t zp$~wC-YWV$6c|-1Flv@#M(;WDiA-i^h=un@d@Q6;SN7SsV zJjw^I8V9Z#IKN5~j08Yo)B>lWrbvU);FfZcL4Kk&{C!!c4wXh0Y(S(Cg%`&S*&O;v z=Iz>8-)6g9vO^%X_!unU(FVVHN|}YiaSk&)*ySh@nq@r^n1$2dctik30GiAM?F8zF z{;jwSPcN!DqIIyy5(G9z8&tvzu+W=4?KQ%$B0;Oc!AwkxLnQAVNM-4nvnQrdV0-wh z8<+>F{IFb1(w8aWpEgrUb}n;d%;TqO8e3(lYg0^BltTm=?b|&=ed|v&vc^aPMg>R~ z5<7AKPR_oP(cqPVniWY6j0NNisPJGFXf*$M8c*qXG zxD&2&Hfx_3X9tm0Kv--hxBYH)y=qozy+2M4yVRGjc_oZX+Lx8s>>#p-UTzD?aIi!z|5vi2OU_Dda}1w-+hDWGeYdc-EZ{Nw|HR2friquT6=FW%vJUGgDpE!Ain0qjgsezd-k@fr zJtc)3%jhC2n8!CXmKl||KfW1fiSFOfx+vX|nz7%^lcVe>ghoMVG|9lxQ!nLbRMk_C zh$m~@>Q@iWel@&rS0~??=YI{Jh)cn5S`R}s9^3Ps&gm!8LfFLn>*shUlI$-MZyw+pHg_yO1eoy^gYKPu-IEoJhRnNz9IUc>jC>4b+K-_ zJylPlfpmPAoUVd^+$nAo9OUEplqDi?L_NCrj_{i1p?f%cun}iZx~MvD0T)#Dt|uxg z@jCg0peJi{!ZG+}R>##!!|psTick;tMZ4XKA6W$Jo-dvKS~cTK0ej zp>-ieQ&IJCZ%1QrW(>^rD?%G#)5F9IDVL;bD39ec4v+w0hi-{4(>He9zYi~^q*@Eu z0NmJ=&^Qk-=bXHcs}T4&Y$Y1vu+nK_P6cKG}4OaA=ANkrFtp(uDOk z`h}dxwjOFBUHAivaxwE#hWq6;)FOlY)a_>%l+)&tEbgrRo;Edkqm#;aoNsW2)5F=p zZ4b*C>7i;&4Zu++8VFrilndssPP}^!9|rlQdXd}RFmAV9D@`F_L#Sdp>$dC<@B%?$ zqNo3pulvZ?h@UI~v&x+KggX)XIZOYcaJitE@F1pjAf)iY2t$DjK3T68DhM}MAjo=j+6Uf)5$>*%=O$I{t z;WZ90U|Bq*Ioi`1Q`9&`Jt3+PNL0iHP%8GDq|>clwI6<4e>*85z$P%bM>*dkuDI5R-sI# z#Vg_e4y~e$RYA$=LJnVxdd~ zs*A{GNSsuWK4s%5c{l(e2`1ap!goA_Em)==A5-oT!O$JjNg!mq`VbFhNy4t%&9H|} z_2K>DQzJ~Hi$-DRh=~4X>+nx`4n4$9I?<||Kq53RHtyTik=LMBhe~d3(3X32)h(SwLt5#3_;0T8-n}e0;3n9w{U3)e> z>4rtO5)m)EH27tTFU{SlUa~eKQni4!0K9Mkq%k8%+L$Q!y3uTHXb^uhR zMc}T@%@0hCF5<-d024jyu<1dXU2n=abIhUc?o%Ke?C2`T(mhd|4UFI@lP#C(*)VO! z&!My~5PqL*kR5&)$|Jl_lKwpj@2-y9_=UL|L*!LsK$WvI!R%;|aDXW_HODZ&z40Wd z*;|sS{~TZb05jnSw+jYVu*D9J{(yCP<$5=naaf}m?8J{9QUyZ>>vwkXlYgGXoovP; zS)XgELWVh(>6hMwB|a!#<$-E|iF`rO4mMD_7ClkO-Qr|_7{&Tfz40AKHQkx^-Ii0{ zC`@bFY34}6XuDsJa6vAX5e}?%wVEnq{W}rYXAzkxrl4Fsz%tVX zN9mlSq=$&0?0h=Y!|vbiMd`CiKeboI+H#kfFS~2bLB1Ny9>>q14k4heM?~^n2b5rr z|B4s8tP=n&gI)G~14&VnHTCYjJ%5}fma&b`f!e8G8?IRH52R_N=tlt)vRXbaUS`=BFfqF=5k>$2 literal 5283 zcmV;U6kO}ApVR6dDSUdNx^}UTK(XA}sViHF!RuG;#F4%r8T$xBUG9Jn<}stEau7(g z3HySxg1K3$7rmYLD@gf83ULtC`#Ee=-ig(8m4XjZ)@&wt^{67&bDx+$2bYJu+jT$i zM^6q5k3c2{!aI`K3@e)Z4H(k5pQfJilW0F+O?9GXxZ_;L-$!4HYRULdUTGANxnTAk zYD}|3w5IHAWwitW0RRbt=wk^Cy!-q#u6<&-C@es`rZm3clj}fc0+E(ptPEWTk-ByE z27xxsjuWZ^GslCOCE&ymOXC$70fbwY`kWX|WTO@KCcl~l{OYYI`O(|izJ0<1j?wKD z5*`WefGK3fX#Qge-#XQi`cyvOL~nQHa}|b2KtY&f10bTf`M#yRNGzd;4^TN6s5<=d zK7<8pGSc)I#cP%>_)pjxN~0*~v|SSyuwe3fHhb>4V4spZ$FfvS!LYcqIp7AtuDG@< zCi#6nf!1#5K+;r9+EH6BKC!R10+)*bai^V@_>E)k?IdR&77T5mywAOx_A1~s{V>L* z9>zhKCj((|Tc%eIPE;2ztIUt=xY5lSn>G+yg)Qu&_Z`7ed0Z2cD6da%SWzJ$R8G$u zI9&Yn`SpyvBtn)OPBC1}NvyQRJgTKAeusUqZN0U4x(G&UudS_fB)Z;Qpy$vQ+E6-J z1h;wYtGj64BQhT^DI@*-1E9%uE3*a$p581mMU2!IY8ZlzDMyz&h1NVFBbD0@eU@WY zHC8y^l?5Ssa01^FWdRe4e1RK|9RW!AW4Uo_grp5bf0Vb~Tn%PwUH!|f0Tc`L;wRKZ9y4A1@?8mijd z4sBaCz_V!)*H$H*A@jo!^8zxn)%a&2uYg)rNvt`FzBhjItJf)FE{%@G9nx(b#Uz5G zLueGxdO5wTXqZ74?g7%D?ZC}Gf7C+Uygdu~A+Pk#l%ZuoTrEZ=Z&@QrKF*6%LC3i^ zqpn1Y#$=_e9+`|v#+(iqUYqTs2< zTcUTI9}4e+?iO7O%L87q(GY?YxH$fmcPqvEkN6`<*zNKEed*g<`LiZmZ>Om4g!f0g z@3IKP;Xk<7uL!U6(P89uXMwBGgex7&;+HMh zkQ?)^zru{F3Z=<&=e~ z+VZO;VxDSOV&D#v03!6^noY(EiUp{_T7ilOH;W=$W_G$00i%FiGUzJ^kV`CCD*uI0 z?MH*=B?x?m#vDYz>2^L(HCr7iyEwBJ>%q`i|sFq4CBUdMXO-W_e3>9Cr zN~N8apd45k0Xb|CN_|4Hm$!%@WV7)(R8W5t*QaZL!$~?&ychi`-zx(B6Oq{)?rd1klZT?{y zW(V24Q6){PTL(tWa4pI~RaE5R>`(n1tPv-x%z(?!icnbAXG%SmLli>I{nV^+ges;k zut(KmrNgRf&ZTR>kZdjxlH}J)DHP6Mml;kJED=rQVz1hv4L&V)p|i*s<I3M@Wr&XjY@9F>)KmzjCmHe%>me!a(XJQo75L5w(-!Rb=i!$zdz#AUq(s2+6fh!6 zlhFVQwN21+@3`3EgErH}l{^q&lN&v;Xw4O)NmHy9JG$&e#ZIU2V)K zPK31|ha3+E!2o7uXlJ!bNH-0}uvz?)*Ej|I0xB1HNiAOQ=pM92tu22-q0M0-gJL8} zTO)ETjt8QjYx*ZF8f!vTZfRi&=KR9MX^(TD)oOkqf2oOZ2|V%|xIbs>Mmf1g(}RDl z^ZsByj_xf?2-4L;rK$REN)#`*6HeRA8tX8cyNPloY2?<|1;8)HEx9Lu)c}Va(=Uk(Jmm>M;BX&M0tVVP+3D}57_Nf&D zK{VQStmd3Vn|uJ8@RmvCKLY8z>1-X_fg9Mhd}kLxNF5+J3r#3FVBd5x*~tuh6F188 zv6yco3-9sJdvZNb>@$<(L*!~R(ZplhA!r;-TL|@c?dijCCM?Xr9m~7xn>E4ar~SWv zv~b3}T?Gk5r8c^Qf{9O{KiD6F%-PB+bv3i@k{|9^aAWRoiDbhLd0{|^t*IwE@NjZV zj&lsSyC&;y_}FCldhBv1%Fm1m|2c#LBlWK-qI+Ib;l2(%nKh38I>e3ir=HXB29K~% zB8lM;M-VJoKEdDGXr}NA>>}~xSGayj%5eVtt<|FaZav?2q?ty4{;Q7V6yDQmbPRwB zAB^0Ugu}m*5b<6nt3qp(zQplDmIeYm!1*aV&oz_Quo;V>dNoQw-=w>A18r6j=VVMO zCxV90+zq?wFcS9ew0yozJrj&_Q-+b#Rd5|W25CM!DRHacHsCb+CnEB(x4>cAj%SK) zbQ`ote@c0IzEh09?x|1}$J9lE))AOxQx`4j50TUv5Q6nAM)S*e0F2-CEn@9F8ieaX z{TllWf*O+hPTY}i`WU#iQHGyb^LO6E*?Nv)p^lepZzD#|nMOB+zO*}=QJf-p*2#Ds z&eNqbWLn8-sMlQ;fp(Cy5`~HnXEh~ou+|0?$&#pN!?M6m4 z=t{a^Ne|wor>s~mj7-Ics>c=&-pOkwDoV?R)~nY6HwxidaWNJeR35dlMDaVIvv4H$ zP!fbU()3ZQC<+`^?O2m@&lR+PCJa*z50*j0?=7q^%y!3g&kkGJoves_J=LD71t}a1 zT6KEBQizo;i1QKPKz_T&&LPL{M701J`v$R;gD9}JfKy4R_hbe*G;W4I4dcY4864w! zZ!TZ>zbTo}ckoL`hbILo1rn2ssv2#5)Rt%?TEUwN zks|?l22c;#AUnY;EH_lm0MT%U&_9;;H=y;U=G9`Wza%3k9j2*eaw~!D;y@-Yd*|Fk z{MN*6z&-aKH6`lcurTlcbgF!-3IgCaM^=dAG4dNIqm)h z;3pbO2_?`sDZvX73q8Q?>vo;>bFLY9fAmXFzhtr6?b7H^NCf4iAv$#WLFa1^cozCY z!b0tql2cH)a23cXf~1 z^oGkUQ+8>h&{^6tN-}Zk1V%F22n=@p#wlqH_%c+;1P(nz3j!z|;E<@G;$GcbgE90iTOqXVHaz%%t)hcSJhbF>87s zxk_3Y2O2F`8For4v*SICz=z^ zMLWJp%1Fn4>gRmNde}cPyB6)NGd@8TCCJwFrI3BoEgqsh0?;@+WAL8|kF!J8mPG`* z|2=C9rw(#Ugv+SLB`Doyy9*2RdGo5&xK1L!^Q^nIyfO;S@=OiJW5aXc=Ur*-I&z*5 z7%w*Sbu~}LJGPBTfC_3UCOkvQhXqc$=@ z#t3Y2d4;C?s7eBYAyBkr5EjD{&%x=MHeW-~Br z2Kp#-k1Zs@P2oiBLHW00`8c0B?XF&Q4{@fkl^=659-af>(UoE!%`ND%w=<&Ccn9=A zI<2nOKSBE+`T%vQu>Q+~PYhJz{bBN|zTRsd93dQ8yM4O0s*&c97$dUCI`PLG-O_NT z+p8cw(+8Q|gLbBr)+&*3AW!0w5IJOE715BFwyme?6Hao(LvEUeA{cyH##`e>0I&aB&=F#V6-h5#yz+ zX`bDR>cOOmk0Su;z;7V0o? z>ASFbcPBa`J@AYv%NIio&gwWPBu-LZ`@SG5rf5x_yOU>SHywJUU_@deUx;JhY0jbw ziwO{v9~39~-0>(3K(O&#nrjzk`o6M|CRKMc*93SU(6M;7I(`(<*aVh%iEdQJVtLXj4pl z?nc5b3xZsKy%qbDZHBdhYsbwkqHbi}d*^VresumLvEibwpJfIC)0Ut@H&)%X5Vn)gm5)nBJO);EM1oon#`mo$&1Qrxdk20Bm!oQ4@*o?Q7 zVt`=IybLmWbqQI8z4#54NEOvkB5%JUOjXYhV-wLkcaoV4ULi!3oyX5+M;LBY^c${f z{y}8Yd&DqI9QR8ewd=`OYfb>Gg4Y;d_SFtK&0>_(qKx=@#%i<^{l_@yfhmQvRCa+J< z?f*gp!#1gU5~Pmz#Ro}Qi)CkEq?R<1M7-w3+@7(Bo7f{ULP;Fs-ciflSh|A%ic77m z%02dG;FU=kvzfK~*c{B9w1PJ;Nt@&yWdDRoD|T_ZeWHp5+*E8*I77wJ3Ke+~xbUI$ z<@nyI$W`b=3I@bXq&}i42OjREs^e9h6R~nO2zYF-?)eZvfi?w*mwH>J93N6Uj1s=# zpY8Bw%k}(i3xf5i?GZs3Y@EoYc(_M*)xQI9+r<2A-7v2iCBtn9?}0i za;wt0D-*Qy zA7#wn@+?bNQ8$o^H%gS9awc$6uF!(cLHRT7<|LXCb#`>edC31k&p*c}Y-h8peFeX= zog9lH{kU*QH-ju85WRCSSE&?76Uokbba=1{c29&7t(LjWtvB`t>Zw$57^8ZEB(Seo zjFqO4b*0ksj%BI|SC0t{Ih#2)372hjc>&@++3%1dwJAE(ZGmXN^43{ zw1_D!w|%~LDWErznze`ng)G|gU|*n`Qy2^_<>0lcJ-LXI!cil7Z+pT_@#~V`F6zc#0 diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 995b13693..09a7d45f4 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -77,8 +77,8 @@ impl NoteCommitment { NOTE_COMMITMENT_PERSONALIZATION, ); - let zec_hash_point = zec_domain.M.hash_to_point(zec_note_bits); - let zsa_hash_point = zsa_domain.M.hash_to_point(zsa_note_bits); + let zec_hash_point = zec_domain.hash_to_point(zec_note_bits); + let zsa_hash_point = zsa_domain.hash_to_point(zsa_note_bits); // Select the desired hash point in constant-time let hash_point = zsa_hash_point.and_then(|zsa_hash| { @@ -176,7 +176,7 @@ mod tests { // Evaluating the commitment in one step with `commit` or in two steps with `hash_to_point` // and `commit_from_hash_point` must give the same commitment. - let hash_point = domain_zsa.M.hash_to_point(msg.into_iter()); + let hash_point = domain_zsa.hash_to_point(msg.into_iter()); let commit_r_zsa = domain_zsa.commit_from_hash_point(hash_point, &rcm.0); assert_eq!(expected_commit.unwrap(), commit_r_zsa.unwrap()); From 344b647d54ce59a3cf3d48d3fbfc130b5fbf1493 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Fri, 22 Dec 2023 09:28:00 +0300 Subject: [PATCH 53/67] Update zcash_note_encryption dependency reference (#95) This PR updates the dependency reference for `zcash_note_encryption` in `orchard` crate's `Cargo.toml`. Instead of using `zcash_note_encryption` crate from the `librustzcash` repository, we are now referencing the crate from the newly separate `zcash_note_encryption` repository. Co-authored-by: Dmitry Demin --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 69165bdfc..e30cba95e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ reddsa = "0.5" nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" -zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/librustzcash", branch = "zsa1-zebra" } +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1" } incrementalmerkletree = "0.5" # Logging @@ -57,7 +57,7 @@ criterion = "0.4" # 0.5 depends on clap 4 which has MSRV 1.70 halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" -zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/librustzcash", branch = "zsa1-zebra", features = ["pre-zip-212"] } +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.5", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] From 1a1f3e7caeb72710b095e4e8197df66a5a9a4e76 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Wed, 31 Jan 2024 22:38:24 +0530 Subject: [PATCH 54/67] Changing the Issuance Authorization Signature to the BIP 340 Schnorr scheme (#93) This changes the issuance authorization signature from the redpallas signature scheme to the BIP 340 Schnorr signature scheme, as detailed in ZIP 227. --- Cargo.toml | 9 +- src/action.rs | 6 +- src/bundle.rs | 6 +- src/bundle/burn_validation.rs | 2 +- src/circuit.rs | 4 +- src/circuit/note_commit.rs | 2 +- src/circuit/value_commit_orchard.rs | 2 +- src/issuance.rs | 119 ++- src/keys.rs | 160 ++-- src/note.rs | 4 +- src/note/asset_base.rs | 15 +- src/supply_info.rs | 2 +- src/test_vectors.rs | 3 +- src/test_vectors/asset_base.rs | 1032 ++++++++++++++++++++++++ src/test_vectors/asset_id.rs | 1032 ------------------------ src/test_vectors/issuance_auth_sig.rs | 277 +++++++ src/test_vectors/keys.rs | 1038 ++++++++++++------------- src/value.rs | 8 +- tests/zsa.rs | 7 +- 19 files changed, 2005 insertions(+), 1723 deletions(-) create mode 100644 src/test_vectors/asset_base.rs delete mode 100644 src/test_vectors/asset_id.rs create mode 100644 src/test_vectors/issuance_auth_sig.rs diff --git a/Cargo.toml b/Cargo.toml index e30cba95e..74dae4945 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ group = { version = "0.13", features = ["wnaf-memuse"] } halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } halo2_proofs = { git = "https://github.com/QED-it/halo2", branch = "zsa1", default-features = false, features = ["batch", "floor-planner-v1-legacy-pdqsort"] } hex = "0.4" +k256 = { version = "0.13.0", features = ["arithmetic", "schnorr"] } lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } pasta_curves = "0.5" @@ -53,16 +54,18 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] bridgetree = "0.4" -criterion = "0.4" # 0.5 depends on clap 4 which has MSRV 1.70 +criterion = "0.4" #Pinned: 0.5 depends on clap 4 which has MSRV 1.70 halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.5", features = ["test-dependencies"] } +ahash = "=0.8.6" #Pinned: 0.8.7 depends on Rust 1.72 +half = "=2.2.1" #Pinned: 2.3.1 requires Rust 1.70 [target.'cfg(unix)'.dev-dependencies] -inferno = "0.11" -clap = "=4.2.0" # Used by inferno. Last version required rust 1.70 +inferno = "0.11" #Pinned +clap = "=4.2.0" #Pinned: Used by inferno. Later version requires Rust 1.70 pprof = { version = "0.11", features = ["criterion", "flamegraph"] } [lib] diff --git a/src/action.rs b/src/action.rs index c9e989c27..58b273f17 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,7 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; - use crate::note::asset_base::testing::arb_asset_id; + use crate::note::asset_base::testing::arb_asset_base; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -147,7 +147,7 @@ pub(crate) mod testing { nf in arb_nullifier(), rk in arb_spendauth_verification_key(), note in arb_note(output_value), - asset in arb_asset_id() + asset in arb_asset_base() ) -> Action<()> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( @@ -180,7 +180,7 @@ pub(crate) mod testing { note in arb_note(output_value), rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), - asset in arb_asset_id() + asset in arb_asset_base() ) -> Action> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( diff --git a/src/bundle.rs b/src/bundle.rs index f37011754..60cd3d75f 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -553,7 +553,7 @@ pub mod testing { use super::{Action, Authorization, Authorized, Bundle, Flags}; pub use crate::action::testing::{arb_action, arb_unauthorized_action}; - use crate::note::asset_base::testing::arb_zsa_asset_id; + use crate::note::asset_base::testing::arb_zsa_asset_base; use crate::note::AssetBase; use crate::value::testing::arb_value_sum; @@ -619,10 +619,10 @@ pub mod testing { /// Create an arbitrary vector of assets to burn. pub fn arb_asset_to_burn() ( - asset_id in arb_zsa_asset_id(), + asset_base in arb_zsa_asset_base(), value in arb_value_sum() ) -> (AssetBase, ValueSum) { - (asset_id, value) + (asset_base, value) } } diff --git a/src/bundle/burn_validation.rs b/src/bundle/burn_validation.rs index 0fdf35dd1..d8ef0ce81 100644 --- a/src/bundle/burn_validation.rs +++ b/src/bundle/burn_validation.rs @@ -83,7 +83,7 @@ mod tests { pub fn get_burn_tuple(asset_desc: &str, value: i64) -> (AssetBase, i64) { use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; - let isk = IssuanceAuthorizingKey::from_bytes([0u8; 32]).unwrap(); + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); ( AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc), diff --git a/src/circuit.rs b/src/circuit.rs index 0199d281f..0134ead77 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1486,7 +1486,7 @@ mod tests { let asset_base = if is_native_asset { AssetBase::native() } else { - AssetBase::random(&mut rng) + AssetBase::random() }; // Create spent_note @@ -1578,7 +1578,7 @@ mod tests { pallas::Point::random(&mut rng).to_affine().to_bytes(), pallas::Point::random(&mut rng).to_affine().to_bytes(), NoteValue::from_raw(rng.next_u64()), - AssetBase::random(&mut rng), + AssetBase::random(), pallas::Base::random(&mut rng), pallas::Base::random(&mut rng), NoteCommitTrapdoor(pallas::Scalar::random(&mut rng)), diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 934238e94..47d928fc0 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -2596,7 +2596,7 @@ mod tests { let two_pow_254 = pallas::Base::from_u128(1 << 127).square(); let mut rng = OsRng; - let random_asset = AssetBase::random(&mut rng); + let random_asset = AssetBase::random(); // Test different values of `ak`, `nk` let mut circuits = vec![]; diff --git a/src/circuit/value_commit_orchard.rs b/src/circuit/value_commit_orchard.rs index 4356ad583..d9871a5bc 100644 --- a/src/circuit/value_commit_orchard.rs +++ b/src/circuit/value_commit_orchard.rs @@ -305,7 +305,7 @@ mod tests { let mut circuits = vec![]; let mut instances = vec![]; let native_asset = AssetBase::native(); - let random_asset = AssetBase::random(&mut rng); + let random_asset = AssetBase::random(); for split_flag in [false, true] { for asset in [native_asset, random_asset] { let v_old = NoteValue::from_raw(rng.next_u64()); diff --git a/src/issuance.rs b/src/issuance.rs index 9fe38c82a..f2eec90c6 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -1,8 +1,9 @@ //! Structs related to issuance bundles and the associated logic. use blake2b_simd::Hash as Blake2bHash; use group::Group; +use k256::schnorr; use nonempty::NonEmpty; -use rand::{CryptoRng, RngCore}; +use rand::RngCore; use std::collections::HashSet; use std::fmt; @@ -15,13 +16,9 @@ use crate::issuance::Error::{ use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use crate::note::asset_base::is_asset_desc_of_valid_size; use crate::note::{AssetBase, Nullifier}; -use crate::primitives::redpallas::Signature; use crate::value::{NoteValue, ValueSum}; -use crate::{ - primitives::redpallas::{self, SpendAuth}, - Address, Note, -}; +use crate::{Address, Note}; use crate::supply_info::{AssetSupply, SupplyInfo}; @@ -183,19 +180,14 @@ pub struct Prepared { /// Marker for an authorized bundle. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Signed { - signature: redpallas::Signature, + signature: schnorr::Signature, } impl Signed { /// Returns the signature for this authorization. - pub fn signature(&self) -> &redpallas::Signature { + pub fn signature(&self) -> &schnorr::Signature { &self.signature } - - /// Constructs an `Signed` from its constituent parts. - pub fn from_parts(signature: Signature) -> Self { - Signed { signature } - } } impl IssueAuth for Unauthorized {} @@ -408,12 +400,8 @@ impl IssueBundle { impl IssueBundle { /// Sign the `IssueBundle`. - /// The call makes sure that the provided `isk` matches the `ik` and the driven `asset` for each note in the bundle. - pub fn sign( - self, - mut rng: R, - isk: &IssuanceAuthorizingKey, - ) -> Result, Error> { + /// The call makes sure that the provided `isk` matches the `ik` and the derived `asset` for each note in the bundle. + pub fn sign(self, isk: &IssuanceAuthorizingKey) -> Result, Error> { let expected_ik: IssuanceValidatingKey = (isk).into(); // Make sure the `expected_ik` matches the `asset` for all notes. @@ -422,12 +410,15 @@ impl IssueBundle { Ok(()) })?; + // Make sure the signature can be generated. + let signature = isk + .try_sign(&self.authorization.sighash) + .map_err(|_| IssueBundleInvalidSignature)?; + Ok(IssueBundle { ik: self.ik, actions: self.actions, - authorization: Signed { - signature: isk.sign(&mut rng, &self.authorization.sighash), - }, + authorization: Signed { signature }, }) } } @@ -501,7 +492,7 @@ pub fn verify_issue_bundle( bundle .ik .verify(&sighash, &bundle.authorization.signature) - .map_err(IssueBundleInvalidSignature)?; + .map_err(|_| IssueBundleInvalidSignature)?; let supply_info = bundle @@ -543,7 +534,7 @@ pub enum Error { /// Verification errors: /// Invalid signature. - IssueBundleInvalidSignature(reddsa::Error), + IssueBundleInvalidSignature, /// The provided `AssetBase` has been previously finalized. IssueActionPreviouslyFinalizedAssetBase(AssetBase), @@ -551,8 +542,6 @@ pub enum Error { ValueSumOverflow, } -impl std::error::Error for Error {} - impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { @@ -580,7 +569,7 @@ impl fmt::Display for Error { "the AssetBase is the identity point of the Pallas curve, which is invalid." ) } - IssueBundleInvalidSignature(_) => { + IssueBundleInvalidSignature => { write!(f, "invalid signature") } IssueActionPreviouslyFinalizedAssetBase(_) => { @@ -616,7 +605,6 @@ mod tests { use pasta_curves::pallas::{Point, Scalar}; use rand::rngs::OsRng; use rand::RngCore; - use reddsa::Error::InvalidSignature; use std::collections::HashSet; fn setup_params() -> ( @@ -628,7 +616,7 @@ mod tests { ) { let mut rng = OsRng; - let isk = IssuanceAuthorizingKey::random(&mut rng); + let isk = IssuanceAuthorizingKey::random(); let ik: IssuanceValidatingKey = (&isk).into(); let fvk = FullViewingKey::from(&SpendingKey::random(&mut rng)); @@ -684,12 +672,7 @@ mod tests { fn identity_point_test_params( note1_value: u64, note2_value: u64, - ) -> ( - OsRng, - IssuanceAuthorizingKey, - IssueBundle, - [u8; 32], - ) { + ) -> (IssuanceAuthorizingKey, IssueBundle, [u8; 32]) { let (mut rng, isk, ik, recipient, sighash) = setup_params(); let note1 = Note::new( @@ -713,7 +696,7 @@ mod tests { let bundle = IssueBundle::from_parts(ik, NonEmpty::new(action), Unauthorized); - (rng, isk, bundle, sighash) + (isk, bundle, sighash) } #[test] @@ -734,7 +717,7 @@ mod tests { #[test] fn verify_supply_invalid_for_asset_base_as_identity() { - let (_, _, bundle, _) = identity_point_test_params(10, 20); + let (_, bundle, _) = identity_point_test_params(10, 20); assert_eq!( bundle.actions.head.verify_supply(&bundle.ik), @@ -928,7 +911,7 @@ mod tests { ) .unwrap(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); ik.verify(&sighash, &signed.authorization.signature) .expect("signature should be valid"); @@ -949,11 +932,11 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(&mut OsRng); + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(); let err = bundle .prepare([0; 32]) - .sign(rng, &wrong_isk) + .sign(&wrong_isk) .expect_err("should not be able to sign"); assert_eq!(err, IssueBundleIkMismatchAssetBase); @@ -987,7 +970,7 @@ mod tests { let err = bundle .prepare([0; 32]) - .sign(rng, &isk) + .sign(&isk) .expect_err("should not be able to sign"); assert_eq!(err, IssueBundleIkMismatchAssetBase); @@ -1008,7 +991,7 @@ mod tests { ) .unwrap(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = &mut HashSet::new(); let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); @@ -1037,7 +1020,7 @@ mod tests { .finalize_action(String::from("Verify with finalize")) .unwrap(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = &mut HashSet::new(); let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); @@ -1102,7 +1085,7 @@ mod tests { ) .unwrap(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = &mut HashSet::new(); let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); @@ -1146,7 +1129,7 @@ mod tests { ) .unwrap(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = &mut HashSet::new(); let final_type = AssetBase::derive(&ik, &String::from("already final")); @@ -1168,7 +1151,7 @@ mod tests { } } - let (mut rng, isk, ik, recipient, sighash) = setup_params(); + let (rng, isk, ik, recipient, sighash) = setup_params(); let (bundle, _) = IssueBundle::new( ik, @@ -1181,19 +1164,19 @@ mod tests { ) .unwrap(); - let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(&mut rng); + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(); - let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); signed.set_authorization(Signed { - signature: wrong_isk.sign(&mut rng, &sighash), + signature: wrong_isk.try_sign(&sighash).unwrap(), }); let prev_finalized = &HashSet::new(); assert_eq!( verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), - IssueBundleInvalidSignature(InvalidSignature) + IssueBundleInvalidSignature ); } @@ -1212,12 +1195,12 @@ mod tests { .unwrap(); let sighash: [u8; 32] = bundle.commitment().into(); - let signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = &HashSet::new(); assert_eq!( verify_issue_bundle(&signed, random_sighash, prev_finalized).unwrap_err(), - IssueBundleInvalidSignature(InvalidSignature) + IssueBundleInvalidSignature ); } @@ -1236,7 +1219,7 @@ mod tests { ) .unwrap(); - let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); // Add "bad" note let note = Note::new( @@ -1274,9 +1257,9 @@ mod tests { ) .unwrap(); - let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); - let incorrect_isk = IssuanceAuthorizingKey::random(&mut rng); + let incorrect_isk = IssuanceAuthorizingKey::random(); let incorrect_ik: IssuanceValidatingKey = (&incorrect_isk).into(); // Add "bad" note @@ -1320,7 +1303,7 @@ mod tests { ) .unwrap(); - let mut signed = bundle.prepare(sighash).sign(rng, &isk).unwrap(); + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); let prev_finalized = HashSet::new(); // 1. Try too long description @@ -1345,23 +1328,23 @@ mod tests { #[test] fn issue_bundle_cannot_be_signed_with_asset_base_identity_point() { - let (rng, isk, bundle, sighash) = identity_point_test_params(10, 20); + let (isk, bundle, sighash) = identity_point_test_params(10, 20); assert_eq!( - bundle.prepare(sighash).sign(rng, &isk).unwrap_err(), + bundle.prepare(sighash).sign(&isk).unwrap_err(), AssetBaseCannotBeIdentityPoint ); } #[test] fn issue_bundle_verify_fail_asset_base_identity_point() { - let (mut rng, isk, bundle, sighash) = identity_point_test_params(10, 20); + let (isk, bundle, sighash) = identity_point_test_params(10, 20); let signed = IssueBundle { ik: bundle.ik, actions: bundle.actions, authorization: Signed { - signature: isk.sign(&mut rng, &sighash), + signature: isk.try_sign(&sighash).unwrap(), }, }; @@ -1398,24 +1381,20 @@ mod tests { pub mod testing { use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; use crate::keys::testing::arb_issuance_validating_key; - use crate::note::asset_base::testing::zsa_asset_id; + use crate::note::asset_base::testing::zsa_asset_base; use crate::note::testing::arb_zsa_note; - use crate::primitives::redpallas::Signature; + use k256::schnorr; use nonempty::NonEmpty; use proptest::collection::vec; use proptest::prelude::*; use proptest::prop_compose; - use reddsa::orchard::SpendAuth; prop_compose! { /// Generate a uniformly distributed signature pub(crate) fn arb_signature()( - half_bytes in prop::array::uniform32(prop::num::u8::ANY) - ) -> Signature { - // prop::array can only generate 32 elements max, so we duplicate it - let sig_bytes: [u8; 64] = [half_bytes, half_bytes].concat().try_into().unwrap(); - let sig: Signature = Signature::from(sig_bytes); - sig + sig_bytes in vec(prop::num::u8::ANY, 64) + ) -> schnorr::Signature { + schnorr::Signature::try_from(sig_bytes.as_slice()).unwrap() } } @@ -1423,7 +1402,7 @@ pub mod testing { /// Generate an issue action pub fn arb_issue_action(asset_desc: String) ( - asset in zsa_asset_id(asset_desc.clone()), + asset in zsa_asset_base(asset_desc.clone()), ) ( note in arb_zsa_note(asset), diff --git a/src/keys.rs b/src/keys.rs index 4748bebdc..418c57413 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,7 +1,10 @@ //! Key structures for Orchard. use core::mem; -use std::io::{self, Read, Write}; +use std::{ + fmt::{Debug, Formatter}, + io::{self, Read, Write}, +}; use aes::Aes256; use blake2b_simd::{Hash as Blake2bHash, Params}; @@ -11,8 +14,16 @@ use group::{ prime::PrimeCurveAffine, Curve, GroupEncoding, }; +use k256::{ + schnorr, + schnorr::{ + signature::hazmat::{PrehashSigner, PrehashVerifier}, + Signature, VerifyingKey, + }, + NonZeroScalar, +}; use pasta_curves::{pallas, pallas::Scalar}; -use rand::{CryptoRng, RngCore}; +use rand::{rngs::OsRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zcash_note_encryption_zsa::EphemeralKeyBytes; @@ -218,28 +229,13 @@ fn check_structural_validity( } } -/// We currently use `SpendAuth` as the `IssuanceAuth`. -type IssuanceAuth = SpendAuth; - /// An issuance key, from which all key material is derived. /// /// $\mathsf{isk}$ as defined in [ZIP 227][issuancekeycomponents]. /// /// [issuancekeycomponents]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation -#[derive(Debug, Copy, Clone)] -pub struct IssuanceAuthorizingKey([u8; 32]); - -impl From for IssuanceAuthorizingKey { - fn from(sk: SpendingKey) -> Self { - IssuanceAuthorizingKey(*sk.to_bytes()) - } -} - -impl ConstantTimeEq for IssuanceAuthorizingKey { - fn ct_eq(&self, other: &Self) -> Choice { - self.to_bytes().ct_eq(other.to_bytes()) - } -} +#[derive(Copy, Clone)] +pub struct IssuanceAuthorizingKey(NonZeroScalar); impl IssuanceAuthorizingKey { /// Generates a random issuance key. @@ -248,21 +244,23 @@ impl IssuanceAuthorizingKey { /// Real issuance keys should be derived according to [ZIP 32]. /// /// [ZIP 32]: https://zips.z.cash/zip-0032 - pub(crate) fn random(rng: &mut impl RngCore) -> Self { - SpendingKey::random(rng).into() + pub(crate) fn random() -> Self { + IssuanceAuthorizingKey(NonZeroScalar::random(&mut OsRng)) } /// Constructs an Orchard issuance key from uniformly-random bytes. /// /// Returns `None` if the bytes do not correspond to a valid Orchard issuance key. - pub fn from_bytes(isk_bytes: [u8; 32]) -> CtOption { - let isk = IssuanceAuthorizingKey(isk_bytes); - CtOption::new(isk, 1u8.into()) + pub fn from_bytes(isk_bytes: [u8; 32]) -> Option { + NonZeroScalar::try_from(&isk_bytes as &[u8]) + .ok() + .map(IssuanceAuthorizingKey) } /// Returns the raw bytes of the issuance key. - pub fn to_bytes(&self) -> &[u8; 32] { - &self.0 + /// Unwrap call never fails since the issuance authorizing key is exactly 32 bytes. + pub fn to_bytes(&self) -> [u8; 32] { + self.0.to_bytes().try_into().unwrap() } /// Derives the Orchard-ZSA issuance key for the given seed, coin type, and account. @@ -277,81 +275,74 @@ impl IssuanceAuthorizingKey { ChildIndex::try_from(coin_type)?, ChildIndex::try_from(account)?, ]; - ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE) - .map(|esk| esk.sk().into()) - } - /// Derives the RedPallas signing key from isk. Internal use only, does not enforce all constraints. - fn derive_inner(&self) -> pallas::Scalar { - to_scalar(PrfExpand::ZsaIsk.expand(&self.0)) + // we are reusing zip32 logic for deriving the key, zip32 should be updated as discussed + let &isk_bytes = + ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE)? + .sk() + .to_bytes(); + + IssuanceAuthorizingKey::from_bytes(isk_bytes).ok_or(zip32::Error::InvalidSpendingKey) } /// Sign the provided message using the `IssuanceAuthorizingKey`. - pub fn sign( - &self, - rng: &mut (impl RngCore + CryptoRng), - msg: &[u8], - ) -> redpallas::Signature { - conditionally_negate(self.derive_inner()).sign(rng, msg) + /// Only supports signing of messages of length 32 bytes, since we will only be using it to sign 32 byte SIGHASH values. + pub fn try_sign(&self, msg: &[u8; 32]) -> Result { + schnorr::SigningKey::from(self.0).sign_prehash(msg) + } +} + +impl Debug for IssuanceAuthorizingKey { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("IssuanceAuthorizingKey") + .field(&self.0.to_bytes()) + .finish() } } /// A key used to validate issuance authorization signatures. /// /// Defined in [ZIP 227: Issuance of Zcash Shielded Assets § Issuance Key Generation][IssuanceZSA]. -/// Note that this is $\mathsf{ik}^\mathbb{P}$, which by construction is equivalent to -/// $\mathsf{ik}$ but stored here as a RedPallas verification key. /// /// [IssuanceZSA]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation -#[derive(Debug, Clone, PartialOrd, Ord)] -pub struct IssuanceValidatingKey(VerificationKey); +#[derive(Debug, Clone)] +pub struct IssuanceValidatingKey(schnorr::VerifyingKey); impl From<&IssuanceAuthorizingKey> for IssuanceValidatingKey { fn from(isk: &IssuanceAuthorizingKey) -> Self { - IssuanceValidatingKey((&(conditionally_negate(isk.derive_inner()))).into()) - } -} - -impl From<&IssuanceValidatingKey> for pallas::Point { - fn from(issuance_validating_key: &IssuanceValidatingKey) -> pallas::Point { - pallas::Point::from_bytes(&(&issuance_validating_key.0).into()).unwrap() + IssuanceValidatingKey(*schnorr::SigningKey::from(isk.0).verifying_key()) } } impl PartialEq for IssuanceValidatingKey { fn eq(&self, other: &Self) -> bool { - <[u8; 32]>::from(&self.0).eq(&<[u8; 32]>::from(&other.0)) + self.to_bytes().eq(&other.to_bytes()) } } impl Eq for IssuanceValidatingKey {} impl IssuanceValidatingKey { - /// Converts this spend validating key to its serialized form, - /// I2LEOSP_256(ik). + /// Converts this issuance validating key to its serialized form, + /// in big-endian order as defined in BIP 340. + /// Unwrap call never fails since the issuance validating key is exactly 32 bytes. pub fn to_bytes(&self) -> [u8; 32] { - // This is correct because the wrapped point must have ỹ = 0, and - // so the point repr is the same as I2LEOSP of its x-coordinate. - <[u8; 32]>::from(&self.0) + self.0.to_bytes().try_into().unwrap() } - /// Constructs an Orchard issuance validating key from uniformly-random bytes. + /// Constructs an Orchard issuance validating key from the provided bytes. + /// The bytes are assumed to be encoded in big-endian order. /// /// Returns `None` if the bytes do not correspond to a valid key. pub fn from_bytes(bytes: &[u8]) -> Option { - <[u8; 32]>::try_from(bytes) + VerifyingKey::from_bytes(bytes) .ok() - .and_then(check_structural_validity) .map(IssuanceValidatingKey) } /// Verifies a purported `signature` over `msg` made by this verification key. - pub fn verify( - &self, - msg: &[u8], - signature: &redpallas::Signature, - ) -> Result<(), reddsa::Error> { - self.0.verify(msg, signature) + pub fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), schnorr::Error> { + self.0.verify_prehash(msg, signature) } } @@ -1118,8 +1109,8 @@ pub mod testing { key in prop::array::uniform32(prop::num::u8::ANY) .prop_map(IssuanceAuthorizingKey::from_bytes) .prop_filter( - "Values must correspond to valid Orchard issuance keys.", - |opt| bool::from(opt.is_some()) + "Values must correspond to valid Orchard-ZSA issuance keys.", + |opt| opt.is_some() ) ) -> IssuanceAuthorizingKey { key.unwrap() @@ -1198,6 +1189,21 @@ mod tests { )); } + #[test] + fn issuance_authorizing_key_from_bytes_fail_on_zero() { + // isk must not be the zero scalar. + let isk = IssuanceAuthorizingKey::from_bytes([0; 32]); + assert!(isk.is_none()); + } + + #[test] + fn issuance_authorizing_key_from_bytes_to_bytes_roundtrip() { + let isk = IssuanceAuthorizingKey::random(); + let isk_bytes = isk.to_bytes(); + let isk_roundtrip = IssuanceAuthorizingKey::from_bytes(isk_bytes).unwrap(); + assert_eq!(isk_bytes, isk_roundtrip.to_bytes()); + } + proptest! { #[test] fn key_agreement( @@ -1235,13 +1241,13 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); - let isk = IssuanceAuthorizingKey::from_bytes(tv.sk).unwrap(); + let isk = IssuanceAuthorizingKey::from_bytes(tv.isk).unwrap(); let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); let ik: IssuanceValidatingKey = (&isk).into(); - assert_eq!(<[u8; 32]>::from(ik.0), tv.ik); + assert_eq!(ik.to_bytes(), tv.ik); let nk: NullifierDerivingKey = (&sk).into(); assert_eq!(nk.0.to_repr(), tv.nk); @@ -1288,4 +1294,22 @@ mod tests { assert_eq!(internal_ovk.0, tv.internal_ovk); } } + + #[test] + fn issuance_auth_sig_test_vectors() { + for tv in crate::test_vectors::issuance_auth_sig::test_vectors() { + let isk = IssuanceAuthorizingKey::from_bytes(tv.isk).unwrap(); + + let ik = IssuanceValidatingKey::from(&isk); + assert_eq!(ik.to_bytes(), tv.ik); + + let message = tv.msg; + + let signature = isk.try_sign(&message).unwrap(); + let sig_bytes: [u8; 64] = signature.to_bytes(); + assert_eq!(sig_bytes, tv.sig); + + assert!(ik.verify(&message, &signature).is_ok()); + } + } } diff --git a/src/note.rs b/src/note.rs index 61a9f9a99..ca2e83e11 100644 --- a/src/note.rs +++ b/src/note.rs @@ -334,7 +334,7 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; - use crate::note::asset_base::testing::arb_asset_id; + use crate::note::asset_base::testing::arb_asset_base; use crate::note::AssetBase; use crate::value::testing::arb_note_value; use crate::{ @@ -358,7 +358,7 @@ pub mod testing { recipient in arb_address(), rho in arb_nullifier(), rseed in arb_rseed(), - asset in arb_asset_id(), + asset in arb_asset_base(), ) -> Note { Note { recipient, diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs index ba8c80825..6856bee74 100644 --- a/src/note/asset_base.rs +++ b/src/note/asset_base.rs @@ -2,7 +2,6 @@ use blake2b_simd::{Hash as Blake2bHash, Params}; use group::{Group, GroupEncoding}; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; -use rand::RngCore; use std::hash::{Hash, Hasher}; use subtle::{Choice, ConstantTimeEq, CtOption}; @@ -101,8 +100,8 @@ impl AssetBase { /// Generates a ZSA random asset. /// /// This is only used in tests. - pub(crate) fn random(rng: &mut impl RngCore) -> Self { - let isk = IssuanceAuthorizingKey::random(rng); + pub(crate) fn random() -> Self { + let isk = IssuanceAuthorizingKey::random(); let ik = IssuanceValidatingKey::from(&isk); let asset_descr = "zsa_asset"; AssetBase::derive(&ik, asset_descr) @@ -139,7 +138,7 @@ pub mod testing { prop_compose! { /// Generate a uniformly distributed note type - pub fn arb_asset_id()( + pub fn arb_asset_base()( is_native in prop::bool::ANY, isk in arb_issuance_authorizing_key(), str in "[A-Za-z]{255}", @@ -154,7 +153,7 @@ pub mod testing { prop_compose! { /// Generate the native note type - pub fn native_asset_id()(_i in 0..10) -> AssetBase { + pub fn native_asset_base()(_i in 0..10) -> AssetBase { // TODO: remove _i AssetBase::native() } @@ -162,7 +161,7 @@ pub mod testing { prop_compose! { /// Generate an asset ID - pub fn arb_zsa_asset_id()( + pub fn arb_zsa_asset_base()( isk in arb_issuance_authorizing_key(), str in "[A-Za-z]{255}" ) -> AssetBase { @@ -172,7 +171,7 @@ pub mod testing { prop_compose! { /// Generate an asset ID using a specific description - pub fn zsa_asset_id(asset_desc: String)( + pub fn zsa_asset_base(asset_desc: String)( isk in arb_issuance_authorizing_key(), ) -> AssetBase { assert!(super::is_asset_desc_of_valid_size(&asset_desc)); @@ -182,7 +181,7 @@ pub mod testing { #[test] fn test_vectors() { - let test_vectors = crate::test_vectors::asset_id::test_vectors(); + let test_vectors = crate::test_vectors::asset_base::test_vectors(); for tv in test_vectors { let description = std::str::from_utf8(&tv.description).unwrap(); diff --git a/src/supply_info.rs b/src/supply_info.rs index 1752fbd64..1e3c8d28f 100644 --- a/src/supply_info.rs +++ b/src/supply_info.rs @@ -82,7 +82,7 @@ mod tests { fn create_test_asset(asset_desc: &str) -> AssetBase { use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; - let isk = IssuanceAuthorizingKey::from_bytes([0u8; 32]).unwrap(); + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc) } diff --git a/src/test_vectors.rs b/src/test_vectors.rs index 945cfc2b7..3cea120cd 100644 --- a/src/test_vectors.rs +++ b/src/test_vectors.rs @@ -1,5 +1,6 @@ -pub(crate) mod asset_id; +pub(crate) mod asset_base; pub(crate) mod commitment_tree; +pub(crate) mod issuance_auth_sig; pub(crate) mod keys; pub(crate) mod merkle_path; pub(crate) mod note_encryption; diff --git a/src/test_vectors/asset_base.rs b/src/test_vectors/asset_base.rs new file mode 100644 index 000000000..041d80471 --- /dev/null +++ b/src/test_vectors/asset_base.rs @@ -0,0 +1,1032 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_asset_base) + +pub(crate) struct TestVector { + pub(crate) key: [u8; 32], + pub(crate) description: [u8; 512], + pub(crate) asset_base: [u8; 32], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + key: [ + 0x16, 0x88, 0x4f, 0x1d, 0xbc, 0x92, 0x90, 0x89, 0xa4, 0x17, 0x6e, 0x84, 0x0b, 0xb5, + 0x81, 0xc8, 0x0e, 0x16, 0xe9, 0xb1, 0xab, 0xd6, 0x54, 0xe6, 0x2c, 0x8b, 0x0b, 0x95, + 0x70, 0x20, 0xb7, 0x48, + ], + description: [ + 0x31, 0xc3, 0x85, 0xc7, 0xa7, 0x38, 0xc6, 0x88, 0x66, 0xc7, 0x8d, 0xc6, 0xa9, 0xc7, + 0xae, 0xc5, 0xb7, 0xc3, 0xaf, 0xc6, 0x85, 0xc7, 0x9f, 0xc6, 0x88, 0xe2, 0xb1, 0xbc, + 0xe1, 0x9a, 0xb7, 0xc3, 0x8c, 0xc7, 0x86, 0xc5, 0xbd, 0xc9, 0x80, 0xc3, 0x84, 0x4e, + 0x76, 0xc6, 0xa9, 0xc3, 0x91, 0x32, 0xc4, 0xab, 0xc9, 0x81, 0xce, 0x8c, 0xc4, 0xa7, + 0xc5, 0x97, 0xc6, 0xa6, 0xc4, 0xb3, 0xc5, 0xaa, 0xc7, 0x95, 0xc8, 0x99, 0xe1, 0x9b, + 0x91, 0xe1, 0x9a, 0xb5, 0xc7, 0x83, 0xc2, 0xa9, 0xc7, 0x80, 0xc7, 0xa5, 0xc8, 0x9d, + 0xce, 0x88, 0xc9, 0x8a, 0xc5, 0x92, 0xc7, 0x91, 0x5d, 0xc3, 0x93, 0x43, 0xc4, 0xa9, + 0xc8, 0x82, 0x25, 0xc3, 0xbb, 0xc3, 0x9d, 0xc8, 0xaf, 0xe1, 0x9a, 0xa5, 0xc8, 0xa0, + 0xc8, 0x8c, 0xc6, 0x86, 0xc3, 0xa4, 0xe1, 0x9b, 0x80, 0xc4, 0xbc, 0xc6, 0xb3, 0xc5, + 0x81, 0xe1, 0x9b, 0x97, 0xc5, 0x8e, 0xc8, 0x9d, 0xc6, 0xa1, 0xce, 0x8a, 0xc7, 0x88, + 0xc6, 0xb5, 0xc8, 0x83, 0xc3, 0xa2, 0xc4, 0x92, 0xc5, 0xb0, 0xc3, 0x8f, 0xc7, 0xab, + 0xe1, 0x9a, 0xac, 0xc2, 0xaf, 0xc7, 0x8a, 0x37, 0x72, 0x74, 0xe2, 0xb1, 0xbb, 0xc5, + 0x83, 0xe1, 0x9a, 0xa9, 0xe2, 0xb1, 0xa5, 0x5c, 0xc3, 0xbd, 0xc3, 0x88, 0xc9, 0x86, + 0x77, 0xc2, 0xb1, 0xc5, 0x9d, 0xc7, 0xa4, 0xc8, 0x9b, 0xcd, 0xb4, 0xc7, 0x81, 0xc4, + 0x9c, 0xc2, 0xbe, 0xe2, 0xb1, 0xa9, 0xc8, 0x82, 0xc6, 0xa0, 0xe1, 0x9a, 0xb5, 0xc2, + 0xa8, 0xc5, 0x82, 0xc3, 0x9a, 0xc6, 0xac, 0xc4, 0xa0, 0xc4, 0xb5, 0xc8, 0x93, 0xe2, + 0xb1, 0xa0, 0xc3, 0xbe, 0xc9, 0x84, 0x77, 0xc4, 0xb4, 0xc8, 0xbe, 0x5c, 0xc6, 0xbe, + 0xc3, 0xb0, 0xc9, 0x84, 0x28, 0xc6, 0x8d, 0xc3, 0xb2, 0xc8, 0xaa, 0xc8, 0x8f, 0xc8, + 0xb2, 0xc7, 0x8b, 0xcd, 0xba, 0xc3, 0xb5, 0xc9, 0x8e, 0xc4, 0xb4, 0xe2, 0xb1, 0xaa, + 0xe1, 0x9a, 0xab, 0xc2, 0xbd, 0xc8, 0xac, 0xc7, 0x8e, 0xc8, 0x95, 0xc2, 0xa9, 0xe1, + 0x9a, 0xa2, 0xe1, 0x9b, 0x8b, 0xc7, 0x98, 0xc6, 0x94, 0xe1, 0x9b, 0x9f, 0xc5, 0x98, + 0xc4, 0xbd, 0x39, 0x40, 0xc8, 0xa9, 0xc5, 0x94, 0x53, 0xe1, 0x9b, 0xac, 0xc8, 0xa0, + 0xc5, 0xb3, 0x76, 0x74, 0xc8, 0xa3, 0xc3, 0x81, 0x68, 0xcd, 0xbc, 0xc7, 0xba, 0x6e, + 0x73, 0xc5, 0x8f, 0xce, 0x8c, 0xc7, 0x9d, 0xc5, 0xaf, 0x45, 0xc3, 0xb0, 0xc3, 0x86, + 0xc4, 0x91, 0xc8, 0x94, 0xc5, 0x93, 0xc4, 0x81, 0xe2, 0xb1, 0xa1, 0xc7, 0x92, 0xc4, + 0xb0, 0xc8, 0x87, 0x4e, 0x51, 0xc6, 0xab, 0xc4, 0xb2, 0xe1, 0x9b, 0x8d, 0xc4, 0x8a, + 0xc4, 0xa9, 0xc3, 0xb3, 0xe1, 0x9b, 0x8f, 0xce, 0x8a, 0x3b, 0xc7, 0xa9, 0xc5, 0x9c, + 0x45, 0xe2, 0xb1, 0xab, 0xc6, 0xbc, 0xc2, 0xb5, 0xe1, 0x9b, 0x8d, 0xc4, 0x84, 0xe2, + 0xb1, 0xa8, 0xc7, 0xa9, 0xc6, 0x94, 0xc6, 0xa6, 0xc6, 0xba, 0xe1, 0x9b, 0xab, 0xc2, + 0xac, 0xc4, 0x8e, 0xe2, 0xb1, 0xb9, 0xc2, 0xb0, 0xce, 0x88, 0xc5, 0xb7, 0x70, 0xe2, + 0xb1, 0xac, 0xce, 0x86, 0x54, 0xc9, 0x8d, 0xc4, 0xa6, 0xcd, 0xb7, 0xc4, 0xaf, 0x75, + 0x3b, 0x3f, 0xc6, 0x81, 0xc8, 0xab, 0xc8, 0xa4, 0x78, 0xc8, 0xab, 0xc4, 0xbb, 0x2e, + 0xc8, 0x89, 0xc3, 0xb0, 0xc5, 0x90, 0x74, 0xc2, 0xa8, 0xc4, 0xa4, 0xc5, 0xbf, 0xe1, + 0x9a, 0xb2, 0xc2, 0xbc, 0x4b, 0xc6, 0xbf, 0xc7, 0xbc, 0xc7, 0xa5, 0xc3, 0xba, 0xc3, + 0x86, 0xc4, 0xb4, 0xc8, 0xa4, 0xc3, 0x9c, 0xe2, 0xb1, 0xb0, 0xc5, 0x92, 0xc4, 0x97, + 0xe1, 0x9b, 0xaa, 0xc6, 0xbf, 0xc5, 0x9e, 0xc7, 0x84, 0xc4, 0xaf, 0xc8, 0xaa, 0xc8, + 0x89, 0xc4, 0xb3, 0xc2, 0xbb, 0xc4, 0x97, 0x5a, + ], + asset_base: [ + 0x41, 0xb7, 0x75, 0x0a, 0x66, 0x59, 0xb2, 0xc8, 0x0f, 0x56, 0x7d, 0x67, 0x78, 0xd1, + 0x2d, 0x81, 0xc4, 0x7a, 0x46, 0xef, 0xdf, 0xfb, 0x63, 0x80, 0x6c, 0x01, 0x7c, 0xa5, + 0x61, 0x50, 0xa7, 0xa6, + ], + }, + TestVector { + key: [ + 0x72, 0x73, 0xb6, 0x57, 0xd9, 0x71, 0xa4, 0x5e, 0x72, 0x24, 0x0c, 0x7a, 0xaa, 0xa7, + 0xd0, 0x68, 0x5d, 0x06, 0xd7, 0x99, 0x9b, 0x0a, 0x19, 0xc4, 0xce, 0xa3, 0x27, 0x88, + 0xa6, 0xab, 0x51, 0x3d, + ], + description: [ + 0xc5, 0x96, 0xc6, 0xac, 0xc4, 0xb3, 0x28, 0x5f, 0xc2, 0xa5, 0x66, 0xe1, 0x9b, 0x8c, + 0xc8, 0xa5, 0xc3, 0x95, 0xc4, 0xaa, 0xc3, 0xa9, 0xc2, 0xbd, 0xe2, 0xb1, 0xbb, 0x52, + 0x48, 0xe1, 0x9b, 0x9f, 0xe2, 0xb1, 0xaf, 0xe1, 0x9b, 0x87, 0xc7, 0x9f, 0x2b, 0xe1, + 0x9a, 0xab, 0xc6, 0x97, 0x6b, 0xc8, 0x8e, 0xe1, 0x9a, 0xbb, 0xc6, 0xa0, 0xc7, 0x89, + 0xc2, 0xbd, 0xc8, 0xad, 0xc4, 0xbe, 0xe1, 0x9b, 0x82, 0xc8, 0x9c, 0xe1, 0x9a, 0xac, + 0x3f, 0xe1, 0x9a, 0xa2, 0xc9, 0x8c, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x86, 0xc5, 0x9d, + 0xc4, 0xb4, 0xc7, 0x80, 0xc3, 0xb5, 0x71, 0x6b, 0x6c, 0xc8, 0x96, 0xc7, 0xbb, 0xc8, + 0x9a, 0xc7, 0x90, 0xc2, 0xb1, 0xc4, 0x89, 0xc3, 0x99, 0xc3, 0xbd, 0xc7, 0xae, 0xc2, + 0xa3, 0xc4, 0xa7, 0x58, 0xc4, 0x80, 0xc4, 0x9f, 0xc7, 0xbb, 0xc4, 0x8b, 0xc6, 0x8d, + 0xc5, 0x98, 0xc2, 0xb4, 0xc5, 0x93, 0xc4, 0x9c, 0xc8, 0x83, 0xc7, 0xbc, 0x30, 0xc4, + 0x87, 0xc3, 0x85, 0xe1, 0x9a, 0xb2, 0xc4, 0xa8, 0xc7, 0xb8, 0xc6, 0xab, 0x36, 0xc4, + 0xa6, 0x3b, 0xc7, 0xa3, 0xc7, 0x82, 0xcd, 0xb2, 0xc7, 0x80, 0xc3, 0xb0, 0xc2, 0xbd, + 0xe2, 0xb1, 0xb4, 0xc6, 0x93, 0xc4, 0x8f, 0x5d, 0xc6, 0x8f, 0x35, 0xc9, 0x85, 0xe1, + 0x9b, 0x95, 0xc7, 0xa4, 0xe2, 0xb1, 0xbf, 0xc4, 0x85, 0xc5, 0xa4, 0xc7, 0x83, 0xc8, + 0x81, 0xc8, 0x89, 0xc8, 0x98, 0xc5, 0xac, 0xe2, 0xb1, 0xb4, 0xc8, 0x8a, 0xc7, 0xa1, + 0xc7, 0x9d, 0xc6, 0xae, 0xc6, 0x9c, 0xc6, 0x98, 0xc3, 0xa3, 0xc4, 0x9b, 0x43, 0xe1, + 0x9b, 0x82, 0xc2, 0xa3, 0xc3, 0xa6, 0xc5, 0x85, 0xc8, 0x89, 0xe1, 0x9b, 0x99, 0x5f, + 0xc4, 0xa9, 0xe1, 0x9b, 0x95, 0xc2, 0xb7, 0xc3, 0x89, 0xe2, 0xb1, 0xb7, 0xc4, 0x96, + 0xe2, 0xb1, 0xa2, 0x5b, 0xc3, 0xac, 0x58, 0xc6, 0xa9, 0xcd, 0xbd, 0xc8, 0xa1, 0xe2, + 0xb1, 0xa6, 0xc8, 0x8e, 0xc5, 0xb3, 0xc7, 0x93, 0xc6, 0xa1, 0xc9, 0x8d, 0xc5, 0xa2, + 0x29, 0xce, 0x8c, 0xe1, 0x9b, 0x99, 0xc5, 0xaf, 0xc8, 0xbd, 0x2b, 0xc7, 0xb2, 0xc7, + 0xba, 0xcd, 0xb7, 0xc2, 0xbc, 0xe1, 0x9b, 0xa4, 0xc7, 0xb9, 0xc3, 0x8d, 0xe2, 0xb1, + 0xa0, 0xc2, 0xa4, 0xc8, 0x98, 0xc8, 0xa4, 0x49, 0xc5, 0xbb, 0xc3, 0x96, 0xc3, 0x94, + 0x5c, 0xc5, 0x8e, 0xe2, 0xb1, 0xae, 0x73, 0x74, 0xc6, 0xab, 0xc7, 0x86, 0xe2, 0xb1, + 0xb3, 0xe1, 0x9b, 0x8f, 0xc8, 0xb3, 0xc4, 0xa6, 0xc6, 0xb2, 0xc8, 0xa4, 0xc7, 0x86, + 0xc7, 0xa8, 0xe1, 0x9b, 0xa2, 0xc8, 0xaa, 0xc4, 0x92, 0xcd, 0xb2, 0x7e, 0xc9, 0x8d, + 0x4e, 0x45, 0xc6, 0x8a, 0xc6, 0xae, 0xc4, 0x8d, 0x3f, 0x59, 0xc5, 0x96, 0xe2, 0xb1, + 0xbd, 0xe1, 0x9a, 0xbc, 0xc3, 0x90, 0xc8, 0x8e, 0xc3, 0xa1, 0xc7, 0xad, 0xe1, 0x9a, + 0xb9, 0xc5, 0x8e, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb5, 0xc6, 0x83, 0xc7, 0x8e, 0xc8, + 0xbf, 0xc2, 0xbc, 0xc5, 0x8a, 0xc4, 0x8e, 0xcd, 0xb5, 0xc5, 0x97, 0xc4, 0x8f, 0xc2, + 0xaa, 0xc7, 0xaf, 0xc3, 0xbb, 0xc2, 0xa2, 0x49, 0x32, 0xc7, 0xa9, 0xc2, 0xb4, 0xe1, + 0x9b, 0xa1, 0xe1, 0x9b, 0xa3, 0xe2, 0xb1, 0xbf, 0x53, 0xc8, 0x96, 0xc8, 0xac, 0xc8, + 0xa3, 0xc3, 0xa0, 0x29, 0xe1, 0x9b, 0x89, 0xc5, 0xb3, 0xc6, 0xb2, 0xc3, 0xab, 0xc3, + 0x99, 0xc4, 0x9d, 0xc6, 0xb6, 0xc4, 0xa3, 0x3b, 0xe1, 0x9b, 0xa6, 0xc6, 0x95, 0xe1, + 0x9b, 0xa5, 0xc2, 0xbc, 0xc7, 0xa0, 0xc7, 0xa3, 0xe1, 0x9b, 0x8a, 0xc4, 0xb4, 0xc9, + 0x80, 0x64, 0x6f, 0xc6, 0x9e, 0xc4, 0x94, 0xc8, 0x8c, 0xc6, 0xa4, 0xc7, 0x96, 0xc3, + 0x9b, 0xc7, 0x91, 0xc5, 0x9d, 0x6d, 0xc7, 0x8a, + ], + asset_base: [ + 0xea, 0x1b, 0xf2, 0x91, 0x8d, 0xe2, 0xfb, 0x1a, 0x26, 0x10, 0x83, 0x25, 0x20, 0xbd, + 0x80, 0x71, 0x98, 0xe1, 0x26, 0x73, 0xab, 0xd2, 0x3b, 0x24, 0x1d, 0xba, 0x06, 0x08, + 0x20, 0x2e, 0x56, 0x17, + ], + }, + TestVector { + key: [ + 0xec, 0x05, 0xbb, 0x7f, 0x06, 0x5e, 0x25, 0x6f, 0xf4, 0x54, 0xf8, 0xa8, 0xdf, 0x6f, + 0x2f, 0x9b, 0x8a, 0x8c, 0x95, 0x08, 0xca, 0xac, 0xfe, 0xe9, 0x52, 0x1c, 0xbe, 0x68, + 0x9d, 0xd1, 0x12, 0x0f, + ], + description: [ + 0xc7, 0x82, 0x7e, 0xc5, 0xb9, 0xc6, 0xa6, 0xc5, 0xa3, 0xe1, 0x9a, 0xae, 0xe2, 0xb1, + 0xa6, 0xc8, 0xb2, 0xc8, 0xbc, 0xc5, 0x9f, 0xc8, 0x83, 0xc3, 0x82, 0xc4, 0x9a, 0xe2, + 0xb1, 0xa8, 0xc4, 0x88, 0xe2, 0xb1, 0xad, 0xc8, 0x98, 0xc3, 0xbb, 0xc3, 0x92, 0xc4, + 0xb7, 0xc7, 0xba, 0xc7, 0x8b, 0x72, 0xc6, 0x8d, 0x75, 0xc3, 0x82, 0xc3, 0xad, 0xc5, + 0x8a, 0xc7, 0xb1, 0xc8, 0xbb, 0xc5, 0x9e, 0xe2, 0xb1, 0xb3, 0xc3, 0xa5, 0xe1, 0x9a, + 0xb8, 0xc5, 0x81, 0x63, 0xc5, 0x98, 0xe1, 0x9b, 0x80, 0xc5, 0x86, 0xc4, 0xa9, 0xe1, + 0x9b, 0xa4, 0x60, 0xc8, 0xa0, 0xc3, 0x97, 0xc4, 0xa4, 0xc5, 0x81, 0xc3, 0x95, 0xc4, + 0xb0, 0xc2, 0xb2, 0xe1, 0x9b, 0x94, 0xc7, 0x8c, 0x46, 0x60, 0xe2, 0xb1, 0xa0, 0xc4, + 0xa5, 0xc7, 0xa9, 0xc6, 0xa8, 0xe1, 0x9b, 0x9c, 0xc5, 0xb4, 0xc5, 0x82, 0xc8, 0x80, + 0xc4, 0x9b, 0xe2, 0xb1, 0xa7, 0xc4, 0x95, 0xc5, 0x93, 0xc8, 0x83, 0xc4, 0x9f, 0xc4, + 0xa1, 0xc4, 0xb1, 0xc3, 0xb0, 0xc8, 0xa5, 0xc6, 0x87, 0xc5, 0xb5, 0xe1, 0x9b, 0xaf, + 0xc9, 0x8e, 0xc2, 0xac, 0xe2, 0xb1, 0xba, 0xc7, 0x9f, 0xc5, 0xa1, 0xc6, 0x94, 0xc3, + 0xa5, 0xc8, 0x8b, 0xc8, 0xa5, 0xe2, 0xb1, 0xb2, 0xc7, 0xab, 0xe1, 0x9b, 0x91, 0xc3, + 0xaa, 0xc6, 0xb5, 0xc4, 0xbf, 0xc5, 0x80, 0xc4, 0xb4, 0xc3, 0xb6, 0xe2, 0xb1, 0xb3, + 0x5e, 0xc8, 0xb6, 0xe1, 0x9a, 0xab, 0xe2, 0xb1, 0xa7, 0xc5, 0x98, 0xe1, 0x9b, 0x9e, + 0x69, 0xe1, 0x9b, 0x8b, 0xe2, 0xb1, 0xbf, 0xc9, 0x88, 0xe2, 0xb1, 0xb5, 0x71, 0x29, + 0xc6, 0x85, 0xc7, 0xab, 0xe1, 0x9b, 0xa9, 0x6d, 0xc7, 0x90, 0xc3, 0x9b, 0xc5, 0x8e, + 0xe1, 0x9b, 0x87, 0xc7, 0x9f, 0xc5, 0xa3, 0xc5, 0xb9, 0x74, 0x7d, 0xc4, 0x94, 0xe1, + 0x9b, 0x93, 0xc7, 0xbc, 0xc8, 0x96, 0x58, 0xe2, 0xb1, 0xaf, 0xe2, 0xb1, 0xbc, 0xc2, + 0xb4, 0xc8, 0xbd, 0xc8, 0xab, 0xc4, 0xb7, 0x42, 0xc2, 0xb5, 0xc7, 0xa5, 0xc5, 0x9c, + 0xcd, 0xb3, 0xc9, 0x87, 0xe2, 0xb1, 0xa0, 0xc4, 0xa3, 0xc8, 0xad, 0xc5, 0x90, 0xe1, + 0x9b, 0x81, 0xc5, 0x9a, 0xc4, 0xa8, 0xc4, 0xb0, 0x7e, 0xc5, 0xaf, 0x60, 0xe1, 0x9a, + 0xa1, 0xc3, 0xb3, 0xc6, 0xb2, 0xe1, 0x9b, 0x97, 0x3c, 0xc4, 0xba, 0xc5, 0xbb, 0x42, + 0xc4, 0x97, 0x66, 0xc8, 0x91, 0xc3, 0xb2, 0xc2, 0xa5, 0xe1, 0x9b, 0xa0, 0xc4, 0xaf, + 0xc8, 0xbf, 0xc8, 0x8a, 0xc5, 0xa1, 0xc3, 0x98, 0xc8, 0x8c, 0xc5, 0x82, 0xe1, 0x9b, + 0x89, 0xc5, 0x88, 0xc8, 0xa4, 0xc6, 0xbc, 0x7a, 0xc4, 0xa1, 0xc3, 0xb0, 0xc5, 0x88, + 0x7b, 0xe1, 0x9b, 0xa1, 0xc2, 0xae, 0xc7, 0x88, 0xc5, 0x9b, 0x71, 0xc7, 0xa7, 0xe1, + 0x9a, 0xa2, 0xc3, 0x8d, 0x50, 0xc6, 0x82, 0xc2, 0xb8, 0xc8, 0xab, 0xc6, 0xa5, 0xc7, + 0x9a, 0xe1, 0x9b, 0x81, 0xc6, 0xb8, 0xc8, 0xb8, 0x32, 0xe1, 0x9b, 0x9a, 0xc5, 0x92, + 0x21, 0xc2, 0xb1, 0xe1, 0x9b, 0xa4, 0xe2, 0xb1, 0xab, 0xe2, 0xb1, 0xbc, 0xc3, 0x9d, + 0xc4, 0xad, 0xc5, 0x83, 0xc7, 0x91, 0x7d, 0xc3, 0xb3, 0xc8, 0x9f, 0xc4, 0x94, 0x40, + 0xc4, 0xb2, 0xc8, 0x92, 0xc7, 0xa1, 0xc3, 0xbc, 0xe1, 0x9b, 0x97, 0xc2, 0xbb, 0xc5, + 0x9a, 0xc2, 0xb2, 0x52, 0xe1, 0x9a, 0xa9, 0x4c, 0xc2, 0xa2, 0xe2, 0xb1, 0xa9, 0xe1, + 0x9b, 0x87, 0xc5, 0x9c, 0xc4, 0x81, 0xc7, 0xb9, 0xe2, 0xb1, 0xad, 0xc4, 0xb3, 0xc5, + 0xa1, 0x64, 0xc5, 0x96, 0xc3, 0x9c, 0xc8, 0xaf, 0xc8, 0x91, 0xe2, 0xb1, 0xaf, 0xc4, + 0x9d, 0xc8, 0x98, 0xe1, 0x9b, 0x8c, 0xc6, 0x89, 0xc6, 0xbc, 0xc8, 0xbc, 0xc5, 0x81, + 0x37, 0x45, 0xc7, 0xa3, 0xc5, 0x81, 0x5a, 0x5a, + ], + asset_base: [ + 0x67, 0x0a, 0x16, 0x33, 0xc7, 0xae, 0x83, 0x6f, 0x14, 0x68, 0xb0, 0x6e, 0x24, 0xd0, + 0x8b, 0x84, 0x27, 0x6d, 0xf6, 0x78, 0xe7, 0xe5, 0x0d, 0x6c, 0x35, 0xce, 0x42, 0x98, + 0xbd, 0xc6, 0xb7, 0x92, + ], + }, + TestVector { + key: [ + 0x81, 0x8f, 0x50, 0xce, 0x47, 0x10, 0xf4, 0xeb, 0x11, 0xe7, 0x43, 0xe6, 0x40, 0x85, + 0x44, 0xaa, 0x3c, 0x12, 0x3c, 0x7f, 0x07, 0xe2, 0xaa, 0xbb, 0x91, 0xaf, 0xc4, 0xec, + 0x48, 0x78, 0x8d, 0xe9, + ], + description: [ + 0xc7, 0x98, 0xe1, 0x9a, 0xb2, 0x2a, 0xc2, 0xa5, 0xc7, 0xb7, 0xc8, 0xaa, 0xc4, 0x9b, + 0xc9, 0x84, 0xc5, 0xaf, 0x4d, 0xc3, 0x83, 0xc2, 0xa3, 0xc7, 0xaf, 0xc6, 0x92, 0xe2, + 0xb1, 0xbe, 0xc8, 0xbf, 0xe1, 0x9b, 0x83, 0xc7, 0x80, 0xc2, 0xb8, 0xc7, 0xa1, 0x6c, + 0xe1, 0x9b, 0xad, 0xc3, 0xa3, 0xc7, 0x97, 0x3b, 0xc9, 0x87, 0xce, 0x8a, 0x51, 0xc8, + 0xbc, 0xc7, 0xa4, 0xc2, 0xa4, 0x2d, 0xc3, 0xb6, 0x34, 0xc9, 0x8e, 0xc5, 0x8f, 0xc9, + 0x86, 0xc5, 0xba, 0xe1, 0x9b, 0x99, 0x76, 0xc6, 0x85, 0xc3, 0xa2, 0xc8, 0x99, 0xc3, + 0x91, 0xc4, 0xb3, 0xc5, 0xa1, 0xe2, 0xb1, 0xbb, 0xc7, 0xa0, 0xc6, 0x9d, 0xc3, 0x89, + 0xc9, 0x86, 0xc5, 0xa1, 0xe1, 0x9b, 0x98, 0xc5, 0xb7, 0xc5, 0xae, 0xc5, 0xb6, 0xe1, + 0x9b, 0x89, 0xc8, 0x98, 0x36, 0xc6, 0x95, 0xc4, 0xb5, 0xc8, 0x85, 0x5c, 0xe1, 0x9b, + 0x99, 0xe2, 0xb1, 0xaf, 0xc3, 0x92, 0xc7, 0x89, 0xc7, 0xb5, 0xc5, 0xbd, 0xc3, 0xa5, + 0xc6, 0x93, 0xc4, 0xac, 0xe1, 0x9b, 0x87, 0xc6, 0x9e, 0xc5, 0xa5, 0xcd, 0xbd, 0xe1, + 0x9b, 0x8a, 0xc6, 0x9d, 0xc9, 0x85, 0xc4, 0xa4, 0x5c, 0x6f, 0xc6, 0x93, 0x76, 0xc3, + 0xa6, 0xe1, 0x9a, 0xad, 0xcd, 0xbb, 0xc2, 0xab, 0xc2, 0xa3, 0xe2, 0xb1, 0xaf, 0xc3, + 0xb6, 0xc6, 0x9f, 0xc5, 0xa5, 0x37, 0x34, 0xe1, 0x9b, 0x8c, 0xc5, 0x8e, 0xc2, 0xb9, + 0xe2, 0xb1, 0xba, 0xc9, 0x88, 0xc8, 0xba, 0xc7, 0x95, 0xc3, 0xa2, 0xc5, 0x9a, 0xc7, + 0x83, 0xc6, 0xb5, 0xc9, 0x8a, 0xc7, 0xb0, 0xe2, 0xb1, 0xab, 0xc5, 0xab, 0xc7, 0x8f, + 0xc3, 0xb6, 0xc4, 0xa7, 0xe1, 0x9a, 0xbb, 0x4e, 0xe1, 0x9b, 0x85, 0x5a, 0xc8, 0xb7, + 0x21, 0xe1, 0x9b, 0x87, 0x25, 0xc6, 0xb4, 0xc5, 0x92, 0xc8, 0xba, 0xc2, 0xa3, 0xc2, + 0xae, 0xe1, 0x9b, 0x89, 0xc5, 0xac, 0x67, 0xc5, 0x98, 0xc7, 0x81, 0xce, 0x85, 0xe2, + 0xb1, 0xb5, 0xc3, 0xab, 0xe2, 0xb1, 0xbd, 0xe1, 0x9b, 0x93, 0xc7, 0x91, 0xc8, 0xa0, + 0xc5, 0x83, 0xc6, 0xb4, 0xc8, 0xb6, 0xc8, 0x9a, 0xe1, 0x9b, 0x93, 0xc7, 0xa3, 0xe1, + 0x9a, 0xba, 0xc9, 0x81, 0xc5, 0xa5, 0xc5, 0xb8, 0x33, 0xc5, 0x86, 0xc8, 0x97, 0x77, + 0xe1, 0x9a, 0xb7, 0xc7, 0xa2, 0xc2, 0xaf, 0xce, 0x88, 0xe1, 0x9a, 0xaa, 0x33, 0xc8, + 0x8f, 0xc4, 0xb9, 0xc8, 0xaf, 0xc3, 0x81, 0xc6, 0xbc, 0xc9, 0x80, 0xc7, 0xb6, 0x46, + 0xe1, 0x9a, 0xa3, 0x6a, 0xc4, 0x85, 0xe1, 0x9b, 0x85, 0xc5, 0x8f, 0xcd, 0xbe, 0x71, + 0x2a, 0xc7, 0x95, 0xc6, 0xa1, 0xc3, 0xaf, 0xe1, 0x9b, 0xa6, 0xc3, 0x93, 0xc3, 0xa5, + 0xc7, 0x9a, 0xc5, 0xb4, 0x50, 0xc7, 0x81, 0xc3, 0x88, 0xc7, 0x87, 0x5a, 0xc3, 0x87, + 0xc3, 0xa2, 0xc7, 0x8a, 0xc8, 0xb9, 0xc3, 0xbb, 0xe1, 0x9a, 0xab, 0xc3, 0xaa, 0xc7, + 0x99, 0xc7, 0x89, 0xc3, 0x98, 0x7c, 0xc6, 0x83, 0x2d, 0xe2, 0xb1, 0xa2, 0xc6, 0x96, + 0xe1, 0x9a, 0xb1, 0x46, 0xe2, 0xb1, 0xa9, 0xc6, 0xaf, 0xc3, 0xbe, 0xe1, 0x9b, 0xa2, + 0xe1, 0x9b, 0x91, 0xc2, 0xb1, 0xc8, 0x8c, 0xc4, 0xb2, 0x75, 0xc4, 0xb9, 0xc5, 0xa6, + 0x52, 0xc6, 0xbc, 0xc3, 0xab, 0xe1, 0x9a, 0xb9, 0xc4, 0xb6, 0xc6, 0xb4, 0xc7, 0xa7, + 0xc2, 0xa1, 0x2d, 0x73, 0x6c, 0xc3, 0xae, 0xc3, 0x98, 0xc8, 0x91, 0xe2, 0xb1, 0xa1, + 0xc4, 0x9c, 0xc5, 0xa9, 0xe1, 0x9b, 0x80, 0xc2, 0xba, 0x71, 0xc3, 0x8c, 0x3b, 0xc3, + 0xb6, 0xc7, 0x95, 0xc5, 0xab, 0xc3, 0x81, 0xc6, 0xbf, 0xc5, 0x9a, 0xe1, 0x9b, 0xab, + 0xc8, 0x9c, 0xc8, 0x83, 0xc5, 0x9f, 0xc5, 0x9a, 0xc5, 0xae, 0xe1, 0x9a, 0xb4, 0xc5, + 0x9a, 0xc3, 0xa4, 0xc8, 0xab, 0xc7, 0xba, 0x69, + ], + asset_base: [ + 0x7e, 0x26, 0x94, 0x4d, 0x61, 0xa6, 0xc8, 0xfe, 0x89, 0x5e, 0xda, 0x8d, 0x1c, 0x72, + 0x77, 0x13, 0xe9, 0x65, 0x61, 0xb7, 0x56, 0x56, 0xfd, 0xa2, 0x07, 0x0b, 0x2b, 0x0c, + 0x9d, 0xe1, 0x4d, 0x85, + ], + }, + TestVector { + key: [ + 0xae, 0x36, 0xb6, 0x1a, 0x3d, 0x10, 0xf1, 0xaa, 0x75, 0x2a, 0xb1, 0xdc, 0x16, 0xe3, + 0xe4, 0x9b, 0x6a, 0xc0, 0xd2, 0xae, 0x19, 0x07, 0xd2, 0xe6, 0x94, 0x25, 0xec, 0x12, + 0xc9, 0x3a, 0xae, 0xbc, + ], + description: [ + 0xc4, 0x9e, 0xe2, 0xb1, 0xa6, 0xe1, 0x9a, 0xb3, 0x2e, 0xe2, 0xb1, 0xb4, 0xc7, 0x8a, + 0xe1, 0x9b, 0xaf, 0xc4, 0xa9, 0xe2, 0xb1, 0xb5, 0x26, 0xc5, 0x8a, 0xc3, 0xa9, 0x7b, + 0xc7, 0xac, 0xc8, 0xb4, 0xe1, 0x9a, 0xb1, 0xe1, 0x9b, 0x85, 0xc6, 0x88, 0xc6, 0x80, + 0xe1, 0x9a, 0xb0, 0xc5, 0xa2, 0x23, 0xc4, 0x9f, 0xc2, 0xa1, 0xe1, 0x9b, 0xac, 0xc6, + 0x98, 0x70, 0x5c, 0xc9, 0x89, 0xc4, 0xa0, 0xc4, 0xaa, 0xc5, 0xa3, 0x79, 0xc3, 0xab, + 0xce, 0x89, 0xc9, 0x83, 0xc3, 0xab, 0xe2, 0xb1, 0xa0, 0x3d, 0x6a, 0xc4, 0x93, 0xe1, + 0x9b, 0xab, 0x7a, 0xe1, 0x9b, 0x87, 0xe1, 0x9b, 0x95, 0xc2, 0xa5, 0xc9, 0x86, 0xc7, + 0xb5, 0xc2, 0xaf, 0xe1, 0x9b, 0x9a, 0xc4, 0xa9, 0xc3, 0x8a, 0xc9, 0x80, 0xc3, 0xaf, + 0xc6, 0x8f, 0xc6, 0x89, 0xc4, 0xa9, 0xc4, 0xb4, 0xe1, 0x9b, 0x8d, 0x4b, 0xc8, 0x96, + 0xc6, 0x87, 0x40, 0xc4, 0x8e, 0xc6, 0x81, 0xc3, 0x9b, 0xc8, 0x9b, 0x49, 0xe2, 0xb1, + 0xa0, 0xc4, 0xb4, 0xc6, 0xa8, 0xc6, 0x8c, 0xc3, 0xb7, 0x34, 0xc8, 0x89, 0xc2, 0xb8, + 0xc2, 0xb2, 0xc4, 0xa8, 0xc4, 0xa0, 0xc7, 0xbb, 0xe2, 0xb1, 0xac, 0xe1, 0x9b, 0x97, + 0xc3, 0xa9, 0xc2, 0xbe, 0xc6, 0x85, 0xc2, 0xa9, 0xcd, 0xb5, 0xc3, 0x95, 0xc8, 0x8b, + 0xc5, 0x94, 0xe2, 0xb1, 0xa0, 0xc2, 0xb5, 0xc6, 0x94, 0xc4, 0xba, 0xe2, 0xb1, 0xbb, + 0xe1, 0x9b, 0x88, 0xc4, 0xa2, 0xc5, 0xa2, 0xcd, 0xbc, 0xc6, 0x88, 0xc3, 0x80, 0xc8, + 0x9d, 0xc5, 0x9b, 0xc7, 0xbe, 0xc5, 0x8c, 0xc5, 0xa8, 0xc5, 0xb0, 0xc9, 0x8c, 0xc2, + 0xa5, 0xc7, 0xbd, 0xc8, 0xaf, 0xc3, 0xb2, 0xc7, 0x8b, 0xc2, 0xb8, 0x25, 0xe1, 0x9b, + 0x80, 0xc9, 0x8f, 0xe1, 0x9b, 0xaa, 0xc5, 0xb1, 0xe1, 0x9b, 0x9d, 0xc5, 0xa5, 0xc2, + 0xa3, 0xc8, 0xaf, 0xc8, 0xb1, 0xc6, 0xb3, 0x3f, 0xc6, 0xb9, 0xc7, 0x91, 0xc7, 0x81, + 0xc7, 0xbc, 0x5d, 0x7c, 0x69, 0xc7, 0x96, 0xe1, 0x9b, 0x8c, 0xc7, 0xb7, 0xc6, 0xa3, + 0xe2, 0xb1, 0xb0, 0xc6, 0xb7, 0xce, 0x88, 0xc9, 0x81, 0xc3, 0x80, 0xe1, 0x9b, 0xaf, + 0xc7, 0xae, 0xc5, 0xbc, 0xc4, 0x8c, 0xc4, 0xa7, 0x71, 0x6e, 0xc6, 0x91, 0xc4, 0x96, + 0xc6, 0x88, 0xc6, 0x97, 0xc5, 0xa4, 0xc5, 0xbf, 0xc7, 0x8d, 0xc8, 0xb9, 0xc7, 0xb5, + 0xe1, 0x9a, 0xb0, 0xc4, 0xa8, 0xc7, 0xa3, 0xc6, 0xba, 0xe1, 0x9a, 0xb5, 0xc6, 0x86, + 0xe1, 0x9b, 0x80, 0xc9, 0x82, 0x4a, 0xc7, 0xa3, 0x7e, 0xc3, 0x9f, 0xc8, 0xb9, 0x7a, + 0x3b, 0xc6, 0xa7, 0xc8, 0x97, 0xc6, 0x92, 0xe1, 0x9b, 0xa1, 0xc7, 0x97, 0xc7, 0xa7, + 0xe1, 0x9a, 0xa3, 0xc9, 0x8d, 0xc6, 0xa0, 0xe1, 0x9b, 0xa0, 0xc4, 0x90, 0xc3, 0x9a, + 0xc4, 0x8f, 0xc7, 0xbc, 0xc4, 0x8b, 0xc2, 0xaa, 0x5d, 0xc3, 0xb0, 0xc3, 0x8b, 0xc4, + 0x90, 0xc3, 0xac, 0xc4, 0xad, 0xe1, 0x9a, 0xb8, 0xc5, 0x93, 0xc8, 0x92, 0xc3, 0x81, + 0xe1, 0x9a, 0xbc, 0xc4, 0xb3, 0xc6, 0x83, 0xc8, 0x9b, 0xc8, 0x81, 0x45, 0xe1, 0x9b, + 0x89, 0xc7, 0xbb, 0xc9, 0x87, 0xc6, 0xb6, 0x4c, 0xc6, 0x88, 0x60, 0xe1, 0x9b, 0x8c, + 0xc6, 0xa7, 0xcd, 0xbc, 0xc3, 0xbe, 0xc2, 0xb3, 0xc7, 0xab, 0xcd, 0xb6, 0xc8, 0xa2, + 0xc2, 0xbc, 0xe2, 0xb1, 0xa5, 0xc5, 0x8f, 0xc6, 0xa0, 0xc6, 0xa6, 0xc6, 0x9b, 0xc8, + 0x94, 0xe1, 0x9a, 0xa0, 0xe2, 0xb1, 0xb6, 0x3f, 0xcd, 0xb2, 0xc8, 0x81, 0xc3, 0x88, + 0xc3, 0xb9, 0xe1, 0x9b, 0x81, 0xe2, 0xb1, 0xa8, 0xc5, 0xb8, 0x48, 0x60, 0xc6, 0xb0, + 0xc5, 0xb1, 0xc3, 0x8e, 0x4a, 0xc5, 0x84, 0xc8, 0xaf, 0xc4, 0xb2, 0xc4, 0x97, 0xe2, + 0xb1, 0xbd, 0xc4, 0xb6, 0x3f, 0xc8, 0x89, 0x5a, + ], + asset_base: [ + 0xcc, 0x07, 0x9a, 0xf8, 0x84, 0x69, 0xe9, 0xbd, 0x7e, 0x67, 0x8e, 0xcf, 0x7f, 0x9f, + 0x79, 0xfa, 0x4d, 0x30, 0x89, 0x27, 0x28, 0xad, 0x87, 0x32, 0xe9, 0xcc, 0x99, 0x7d, + 0x3c, 0x7c, 0x64, 0x1f, + ], + }, + TestVector { + key: [ + 0x49, 0x26, 0x53, 0x80, 0xd2, 0xb0, 0x2e, 0x0a, 0x1d, 0x98, 0x8f, 0x3d, 0xe3, 0x45, + 0x8b, 0x6e, 0x00, 0x29, 0x1d, 0xb0, 0xe6, 0x2e, 0x17, 0x47, 0x91, 0xd0, 0x09, 0x29, + 0x9f, 0x61, 0xfe, 0xc4, + ], + description: [ + 0xc7, 0x88, 0xc2, 0xa3, 0xe2, 0xb1, 0xa7, 0xc5, 0x84, 0xc6, 0xac, 0xc8, 0xaa, 0x63, + 0xc6, 0xa7, 0xc5, 0xa7, 0x75, 0xc7, 0x97, 0xe1, 0x9b, 0xaf, 0x71, 0xc8, 0x95, 0xe1, + 0x9a, 0xba, 0x44, 0x45, 0xc3, 0xa1, 0xe1, 0x9b, 0xac, 0xc6, 0xbf, 0xc4, 0xbc, 0xc4, + 0x88, 0xe1, 0x9b, 0x82, 0xe2, 0xb1, 0xb1, 0x5d, 0xc3, 0xa7, 0xe1, 0x9b, 0xa0, 0xc7, + 0xb4, 0x5a, 0xc4, 0xad, 0xe1, 0x9b, 0x8f, 0xc5, 0x88, 0xc9, 0x8c, 0xc8, 0xab, 0xe1, + 0x9a, 0xaf, 0xc7, 0xb6, 0xc2, 0xb8, 0x59, 0xc5, 0xbb, 0xc5, 0xbd, 0x2e, 0xc5, 0x86, + 0xe2, 0xb1, 0xbb, 0xe2, 0xb1, 0xb1, 0xc3, 0xb4, 0xc5, 0xb2, 0xc4, 0x96, 0xc5, 0x99, + 0xc7, 0x8c, 0x71, 0xc6, 0xa2, 0xc3, 0x91, 0xc5, 0xb9, 0xcd, 0xbe, 0x26, 0xe1, 0x9a, + 0xa8, 0xe1, 0x9b, 0x86, 0xc3, 0x99, 0xc8, 0xa7, 0xc4, 0x8b, 0xe2, 0xb1, 0xb4, 0xc5, + 0x8c, 0xc5, 0x9e, 0xc5, 0xa5, 0xc4, 0xbd, 0x3c, 0xc5, 0x89, 0xc4, 0x88, 0x29, 0xc2, + 0xa6, 0x2c, 0xc7, 0xa9, 0xc5, 0xb6, 0xc8, 0x92, 0xc5, 0xb8, 0x3c, 0xc6, 0x8b, 0xc6, + 0x83, 0xe1, 0x9b, 0x9b, 0xc6, 0x88, 0xe2, 0xb1, 0xba, 0x32, 0x63, 0xc7, 0xbe, 0xc6, + 0x8a, 0xc7, 0x8d, 0xc6, 0xa5, 0xc6, 0x9f, 0xc8, 0x98, 0xc4, 0xb0, 0xc8, 0xac, 0xc8, + 0xb1, 0xc5, 0xa3, 0xc2, 0xb1, 0xc9, 0x8f, 0xc4, 0xbf, 0xe1, 0x9b, 0xa3, 0xe2, 0xb1, + 0xad, 0xc4, 0x88, 0xc5, 0x8d, 0xc7, 0x98, 0xc8, 0xb4, 0xc3, 0xab, 0xc3, 0x9b, 0xc6, + 0xa5, 0xe1, 0x9b, 0x89, 0xc2, 0xa8, 0xce, 0x88, 0xe2, 0xb1, 0xb9, 0xe1, 0x9b, 0x83, + 0xc6, 0x83, 0xce, 0x8c, 0xc3, 0xbc, 0x65, 0xe1, 0x9a, 0xaf, 0xc4, 0x88, 0xe1, 0x9a, + 0xa1, 0xc8, 0x87, 0xc8, 0x98, 0xc5, 0x8e, 0xc8, 0xbd, 0x30, 0xc4, 0xb8, 0xc7, 0xa4, + 0x48, 0xc8, 0xa1, 0xe1, 0x9b, 0x93, 0xc4, 0xa8, 0xc5, 0xba, 0x52, 0xc3, 0xbc, 0xc6, + 0xbe, 0xc6, 0x96, 0xc9, 0x8c, 0x3a, 0xc8, 0xa9, 0xc2, 0xac, 0xe1, 0x9b, 0x8c, 0xc3, + 0x9d, 0xe2, 0xb1, 0xb0, 0xc4, 0xaf, 0x34, 0xc5, 0xb2, 0xc7, 0xb3, 0xc6, 0xb2, 0xe1, + 0x9a, 0xb9, 0xc7, 0x98, 0xc8, 0xbe, 0x7a, 0xc2, 0xa7, 0xe1, 0x9b, 0x85, 0xc9, 0x8b, + 0xc5, 0x98, 0xc7, 0xa3, 0xe2, 0xb1, 0xab, 0xc3, 0xbf, 0xc3, 0xb1, 0xc8, 0x88, 0xc4, + 0x9d, 0xc4, 0x80, 0xc7, 0xac, 0xc7, 0xbe, 0xe1, 0x9a, 0xa3, 0xc6, 0x8c, 0xe1, 0x9b, + 0xa5, 0xc8, 0x8f, 0xc4, 0xbf, 0xc4, 0xbf, 0xc8, 0x84, 0xc3, 0x81, 0xc7, 0xa6, 0xe2, + 0xb1, 0xa3, 0xc3, 0xb2, 0x5a, 0xe1, 0x9b, 0xa2, 0xe1, 0x9a, 0xba, 0xc4, 0x92, 0xc8, + 0xaa, 0xe1, 0x9a, 0xaf, 0xc5, 0x8b, 0xc6, 0xa3, 0x73, 0xc6, 0x87, 0xc4, 0x82, 0xc8, + 0xa0, 0xc8, 0xaf, 0x6f, 0xe2, 0xb1, 0xbb, 0xc7, 0x9c, 0x55, 0xe1, 0x9a, 0xbf, 0xc2, + 0xa6, 0xc8, 0xab, 0xc6, 0xa5, 0xc8, 0x8b, 0xc5, 0x90, 0xc5, 0xbf, 0xc8, 0x94, 0xc6, + 0xa3, 0xc4, 0xbe, 0xc4, 0xab, 0xc7, 0xb8, 0xc4, 0x91, 0xc6, 0xa6, 0xc5, 0xb6, 0xc3, + 0x9b, 0xc8, 0xae, 0xc4, 0x8f, 0x62, 0xc2, 0xa4, 0xc8, 0x99, 0xcd, 0xba, 0xc4, 0x96, + 0xc2, 0xb2, 0xc6, 0x92, 0xc5, 0xb5, 0xc5, 0x83, 0xc6, 0x92, 0xc6, 0x8d, 0xe1, 0x9b, + 0xb0, 0xe1, 0x9b, 0x99, 0xc7, 0xae, 0xe1, 0x9a, 0xa7, 0x64, 0x33, 0x3c, 0xc6, 0xab, + 0xc4, 0x95, 0xc3, 0xbd, 0xc8, 0xad, 0xc5, 0xa5, 0x5e, 0xe2, 0xb1, 0xbe, 0xe1, 0x9a, + 0xb6, 0xc8, 0x83, 0x54, 0x25, 0xc8, 0x80, 0xc6, 0xa9, 0xe1, 0x9a, 0xb2, 0xc5, 0x98, + 0xc8, 0xb3, 0xc6, 0x96, 0xc7, 0x87, 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0x92, 0xc6, 0xaa, + 0x72, 0x67, 0xe2, 0xb1, 0xb4, 0x4d, 0xc3, 0xb2, + ], + asset_base: [ + 0xaa, 0xb9, 0x9e, 0x01, 0x44, 0xfb, 0xf5, 0x9f, 0x87, 0xd2, 0xe5, 0xf6, 0x32, 0x63, + 0x82, 0xf6, 0x3a, 0x46, 0x83, 0x83, 0xb4, 0x74, 0x40, 0xd7, 0x84, 0xe9, 0x4e, 0x6b, + 0x3a, 0xb6, 0x45, 0x28, + ], + }, + TestVector { + key: [ + 0x9a, 0x0e, 0x46, 0x39, 0xb4, 0x69, 0x1f, 0x02, 0x7c, 0x0d, 0xb7, 0xfe, 0xf1, 0xbb, + 0x5e, 0xf9, 0x0a, 0xcd, 0xb7, 0x08, 0x62, 0x6d, 0x2e, 0x1f, 0x3e, 0x38, 0x3e, 0xe7, + 0x5b, 0x31, 0xcf, 0x57, + ], + description: [ + 0xc3, 0xaa, 0xc3, 0xa0, 0xe2, 0xb1, 0xba, 0xc6, 0x8d, 0x34, 0xc4, 0xb0, 0xc4, 0x8b, + 0xc2, 0xba, 0xc5, 0xa9, 0xe2, 0xb1, 0xa6, 0xc3, 0xa8, 0x6f, 0x2c, 0x45, 0xc5, 0xaf, + 0xc4, 0xbb, 0xc7, 0x8b, 0xc6, 0x8e, 0xc8, 0x94, 0xc3, 0xac, 0xc2, 0xab, 0xc8, 0x8b, + 0xe1, 0x9a, 0xb4, 0xc5, 0x9d, 0xc8, 0xb3, 0xc7, 0xb9, 0xe1, 0x9a, 0xac, 0xc6, 0x9b, + 0xc4, 0x9d, 0xc2, 0xa3, 0xe1, 0x9a, 0xb6, 0xc5, 0x92, 0xc7, 0x87, 0x46, 0xc4, 0x99, + 0xce, 0x88, 0xc5, 0x91, 0xc8, 0x92, 0xc4, 0xa9, 0xc3, 0xab, 0x78, 0xc9, 0x8e, 0xc7, + 0xac, 0xc5, 0xba, 0xc4, 0x88, 0xc5, 0x80, 0xc7, 0x91, 0xc5, 0xb7, 0xc5, 0xaa, 0xe1, + 0x9b, 0x97, 0x30, 0xc8, 0x8d, 0x5c, 0xc2, 0xb3, 0xc4, 0x9f, 0x2a, 0xc3, 0xb8, 0xc7, + 0xae, 0xc7, 0xbd, 0xc4, 0xa0, 0xe1, 0x9a, 0xa1, 0xe1, 0x9a, 0xbf, 0xc7, 0x9e, 0xe1, + 0x9b, 0x84, 0xc8, 0x9c, 0xc5, 0x86, 0x2b, 0xc4, 0x96, 0xcd, 0xb4, 0xc3, 0x82, 0x6a, + 0xc8, 0xa6, 0xc5, 0x8c, 0xc3, 0x8a, 0xc2, 0xbf, 0xc6, 0x9e, 0x32, 0xe2, 0xb1, 0xa0, + 0xc5, 0xa2, 0xc8, 0x8b, 0x3e, 0xc4, 0x91, 0xc6, 0xab, 0xc3, 0x92, 0xc7, 0xa7, 0xc8, + 0xa3, 0xc4, 0xa7, 0xe1, 0x9a, 0xb0, 0xc4, 0x9c, 0xcd, 0xb6, 0xe1, 0x9a, 0xa1, 0xc6, + 0x8b, 0xe1, 0x9b, 0x9e, 0xc2, 0xb5, 0xc6, 0x89, 0x33, 0x46, 0xc6, 0x8d, 0xc4, 0xb3, + 0xc8, 0xac, 0xc5, 0x97, 0xc3, 0xb7, 0xc7, 0xab, 0xe2, 0xb1, 0xa1, 0xe1, 0x9b, 0x9f, + 0xc4, 0x94, 0xe1, 0x9b, 0xb0, 0xc8, 0x8e, 0xc4, 0xa8, 0xc5, 0x8b, 0xc6, 0xbb, 0xc2, + 0xa6, 0xe1, 0x9b, 0xae, 0xc2, 0xac, 0xe1, 0x9b, 0x84, 0xc2, 0xb1, 0x4c, 0xc2, 0xb7, + 0xc5, 0x9c, 0x5d, 0xc9, 0x8c, 0xe1, 0x9b, 0x8b, 0x31, 0xc6, 0xb5, 0x62, 0xc7, 0x9e, + 0xc3, 0xa8, 0xc8, 0x82, 0xc7, 0xb7, 0x69, 0xe1, 0x9a, 0xbf, 0xe1, 0x9a, 0xa3, 0xe1, + 0x9b, 0xb0, 0x6e, 0xc6, 0xb9, 0xc9, 0x89, 0xc8, 0xb1, 0xc6, 0xaf, 0xe1, 0x9b, 0x90, + 0x55, 0xc4, 0xb1, 0xe1, 0x9b, 0xac, 0xe1, 0x9b, 0x8b, 0xc7, 0xaa, 0xe1, 0x9b, 0x88, + 0xc3, 0xbf, 0xe1, 0x9a, 0xa5, 0xc5, 0xa9, 0xc2, 0xb7, 0x62, 0xc3, 0x91, 0xc5, 0x93, + 0xc4, 0xbd, 0xc3, 0x90, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0x8e, 0xcd, 0xbc, 0xc8, 0x86, + 0xe2, 0xb1, 0xb2, 0xc2, 0xbe, 0xc6, 0xbd, 0x64, 0xc2, 0xb2, 0xcd, 0xbb, 0xc3, 0x90, + 0xc7, 0x9c, 0xcd, 0xb5, 0xc8, 0x9f, 0xc7, 0xa0, 0x75, 0xc8, 0x9f, 0xe1, 0x9b, 0x99, + 0xc5, 0x9a, 0xe2, 0xb1, 0xae, 0xc6, 0x90, 0xc4, 0xad, 0xc3, 0x89, 0xc2, 0xba, 0xc4, + 0x91, 0xc6, 0x83, 0xe1, 0x9a, 0xa6, 0xc3, 0x93, 0xc3, 0x9b, 0xc7, 0x8f, 0xc4, 0xa3, + 0xc5, 0xae, 0x40, 0xc5, 0xb4, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, 0xbf, 0xc6, 0xb3, 0xe2, + 0xb1, 0xb2, 0xe1, 0x9a, 0xae, 0xc3, 0x95, 0xc4, 0x80, 0xc5, 0x9b, 0xc5, 0xa9, 0xc5, + 0xa8, 0xe1, 0x9b, 0xa7, 0xc8, 0x98, 0x75, 0x53, 0xe2, 0xb1, 0xb4, 0xe1, 0x9a, 0xb4, + 0xc3, 0xa3, 0x4b, 0xc3, 0x86, 0xe1, 0x9a, 0xa9, 0xc3, 0x80, 0xe1, 0x9b, 0xb0, 0xc3, + 0x81, 0xc4, 0x86, 0xc9, 0x83, 0xc8, 0xbb, 0xc3, 0x88, 0xc8, 0x96, 0xc7, 0xac, 0xc4, + 0x9a, 0xc5, 0xb7, 0x7e, 0xc7, 0xbe, 0xc6, 0xba, 0xc2, 0xb6, 0xe1, 0x9a, 0xb5, 0xc7, + 0xbd, 0xc7, 0x80, 0x73, 0xc7, 0xab, 0xc8, 0xbd, 0xc7, 0xb7, 0xc3, 0x89, 0xe1, 0x9b, + 0x92, 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xb7, 0xc8, 0x8c, 0xc4, 0xb8, 0xc8, 0xa2, 0xc3, + 0xa6, 0xc4, 0x9c, 0xc5, 0x9b, 0xc2, 0xa3, 0xc8, 0x8b, 0xc2, 0xbd, 0xe2, 0xb1, 0xb0, + 0xc5, 0xa6, 0xce, 0x87, 0xc2, 0xb3, 0xc5, 0xbc, + ], + asset_base: [ + 0x9c, 0x67, 0xc9, 0x2b, 0xeb, 0x8d, 0x82, 0xb5, 0x8a, 0x3d, 0x24, 0xba, 0xaa, 0x0a, + 0xa1, 0x5c, 0x30, 0x64, 0x16, 0xb2, 0x63, 0x72, 0x16, 0xe9, 0xb7, 0x83, 0x05, 0x43, + 0x4c, 0x57, 0x96, 0xb6, + ], + }, + TestVector { + key: [ + 0xbb, 0xf4, 0x49, 0x82, 0xf1, 0xba, 0x3a, 0x2b, 0x9d, 0xd3, 0xc1, 0x77, 0x4d, 0x71, + 0xce, 0x33, 0x60, 0x59, 0x9b, 0x07, 0xf2, 0x11, 0xc8, 0x16, 0xb8, 0xc4, 0x3b, 0x98, + 0x42, 0x23, 0x09, 0x24, + ], + description: [ + 0xc4, 0xa8, 0xc5, 0x96, 0xc2, 0xb6, 0xc6, 0xb1, 0x7c, 0xc7, 0xa0, 0x36, 0xc6, 0x9f, + 0x75, 0xc2, 0xa1, 0xc3, 0xbe, 0xc8, 0x90, 0xc2, 0xa6, 0xc3, 0x86, 0xc9, 0x86, 0xe2, + 0xb1, 0xa7, 0xe1, 0x9b, 0xa8, 0xc5, 0x9c, 0xc7, 0xa6, 0xc7, 0xbd, 0xe1, 0x9b, 0xa2, + 0x37, 0xc2, 0xbd, 0xc3, 0x97, 0xc4, 0x8f, 0xc3, 0x80, 0xc4, 0x8f, 0xc6, 0xa6, 0xc5, + 0x8e, 0xce, 0x89, 0xc4, 0xa6, 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x8f, 0xe2, 0xb1, 0xb7, + 0xc9, 0x84, 0xe1, 0x9a, 0xa1, 0xc6, 0x97, 0xe1, 0x9b, 0x85, 0xc3, 0xaf, 0xc6, 0xbf, + 0x3e, 0xe2, 0xb1, 0xbf, 0xc7, 0xa9, 0x39, 0xc4, 0x80, 0xc3, 0x80, 0xc6, 0x87, 0xc3, + 0xa9, 0x4c, 0x66, 0xc8, 0xa5, 0x3b, 0xc5, 0x83, 0x48, 0xc6, 0xbd, 0xc5, 0xbd, 0xc7, + 0x8f, 0xc8, 0xaf, 0xc7, 0x9c, 0xe1, 0x9a, 0xb5, 0xcd, 0xbc, 0xc5, 0x9a, 0xc2, 0xa1, + 0xe2, 0xb1, 0xbf, 0xe1, 0x9b, 0x91, 0xc4, 0x8d, 0xc5, 0x9b, 0xc3, 0x9d, 0xc5, 0x90, + 0xe1, 0x9b, 0x82, 0x71, 0xc2, 0xb9, 0xc7, 0xa4, 0xcd, 0xbc, 0xc5, 0x80, 0xc8, 0x8e, + 0xc7, 0x83, 0x53, 0xc8, 0xb1, 0xc4, 0x83, 0xe2, 0xb1, 0xa0, 0xc5, 0x86, 0xc5, 0xa7, + 0xc4, 0xb0, 0xc6, 0x9b, 0xc8, 0xa6, 0xc8, 0xb2, 0xc5, 0x89, 0xc8, 0xb7, 0xc9, 0x83, + 0xc5, 0xaa, 0xc3, 0x9a, 0xc4, 0xae, 0xc4, 0xbb, 0xc6, 0x9f, 0xc6, 0xac, 0xc8, 0x8b, + 0xc9, 0x8e, 0x70, 0xc5, 0x88, 0x6e, 0xc6, 0x9e, 0xe1, 0x9a, 0xb7, 0xcd, 0xb5, 0xc3, + 0x9d, 0xe2, 0xb1, 0xb2, 0xc4, 0x90, 0xe1, 0x9b, 0x97, 0xc7, 0xb0, 0xc6, 0xa0, 0xe2, + 0xb1, 0xaa, 0xc7, 0x8e, 0xc5, 0xb4, 0x3c, 0xc7, 0xa8, 0xc9, 0x81, 0xc2, 0xb6, 0xc5, + 0xa8, 0x21, 0x78, 0xe2, 0xb1, 0xab, 0xce, 0x84, 0xc5, 0x85, 0xc6, 0x83, 0xc4, 0x82, + 0xc7, 0x90, 0xc6, 0xb5, 0xc6, 0xb9, 0xc8, 0xac, 0xc7, 0xb9, 0xc3, 0xb1, 0xc5, 0x85, + 0xe1, 0x9a, 0xa5, 0x50, 0x44, 0xc5, 0xb7, 0xe1, 0x9a, 0xac, 0xc4, 0x9c, 0xc7, 0x90, + 0xc5, 0x85, 0xc8, 0xbe, 0xc2, 0xb5, 0xc6, 0xb7, 0xc7, 0xba, 0xc6, 0x98, 0xe1, 0x9b, + 0xa8, 0xe2, 0xb1, 0xb9, 0xc5, 0xae, 0xc7, 0x83, 0xc5, 0xb4, 0xc4, 0x98, 0xc6, 0x9f, + 0xc5, 0x84, 0xc3, 0x92, 0xe1, 0x9b, 0x85, 0xc5, 0x95, 0x31, 0xc3, 0x8e, 0xe1, 0x9a, + 0xa0, 0x66, 0xc8, 0xbf, 0xc6, 0x96, 0xc7, 0xbb, 0xc2, 0xb2, 0xe2, 0xb1, 0xbf, 0xc4, + 0x96, 0xe1, 0x9a, 0xb6, 0xc8, 0xa5, 0xc5, 0xb6, 0xc6, 0xa7, 0xc8, 0x8d, 0xc3, 0xa0, + 0xc7, 0xae, 0xc7, 0xb8, 0xe1, 0x9b, 0x85, 0xc7, 0x8a, 0xc4, 0xa4, 0xc4, 0x9d, 0xc4, + 0xbe, 0xe1, 0x9a, 0xb5, 0xc4, 0x85, 0xc9, 0x83, 0xc3, 0xb5, 0xc3, 0xba, 0xc4, 0x9d, + 0xc6, 0xad, 0x68, 0xe1, 0x9b, 0xb0, 0xc4, 0x86, 0xc7, 0xb6, 0xc6, 0x92, 0xc9, 0x80, + 0xc5, 0x80, 0xcd, 0xb1, 0xc7, 0x85, 0xc4, 0xae, 0xc6, 0x95, 0xe2, 0xb1, 0xb2, 0xc5, + 0x9d, 0xc8, 0x99, 0xc4, 0x91, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0x91, 0xc4, 0xbc, 0xc4, + 0x85, 0xe1, 0x9b, 0xa1, 0xc5, 0x86, 0x26, 0xc3, 0xa8, 0xc3, 0x88, 0xc4, 0xb8, 0xe2, + 0xb1, 0xa7, 0xc2, 0xa5, 0xe1, 0x9b, 0x98, 0xc4, 0xb3, 0x7c, 0xc3, 0xb1, 0xe1, 0x9b, + 0x94, 0xc6, 0x9b, 0xcd, 0xbc, 0xcd, 0xb2, 0xc8, 0x8c, 0xc6, 0x8c, 0xe2, 0xb1, 0xb0, + 0x52, 0xc3, 0x9b, 0xc3, 0x8c, 0x5e, 0xc5, 0x90, 0xc3, 0xa4, 0xc3, 0x8a, 0x58, 0xc8, + 0x9e, 0xc5, 0xba, 0xc5, 0xb3, 0x6c, 0xc2, 0xab, 0xc4, 0xa1, 0x38, 0xc6, 0xb6, 0xe1, + 0x9b, 0x9f, 0x71, 0xc9, 0x84, 0xe2, 0xb1, 0xb9, 0xc3, 0x9a, 0xc6, 0x83, 0xe1, 0x9a, + 0xa4, 0xc6, 0x85, 0xc3, 0x8c, 0x25, 0x4e, 0x5a, + ], + asset_base: [ + 0x08, 0x32, 0x00, 0xcc, 0x9c, 0xa5, 0x39, 0xbe, 0xc9, 0x29, 0x51, 0x50, 0x4d, 0xca, + 0xf2, 0xc5, 0xe0, 0xe8, 0xe3, 0x57, 0xd7, 0xea, 0xed, 0x18, 0xb0, 0x15, 0x8b, 0x69, + 0x2c, 0xe4, 0xce, 0x9d, + ], + }, + TestVector { + key: [ + 0xff, 0x63, 0xc7, 0x89, 0x25, 0x1c, 0x10, 0x43, 0xc6, 0xf9, 0x6c, 0x66, 0xbf, 0x5b, + 0x0f, 0x61, 0xc9, 0xd6, 0x5f, 0xef, 0x5a, 0xaf, 0x42, 0x84, 0xa6, 0xa5, 0x69, 0x94, + 0x94, 0x1c, 0x05, 0xfa, + ], + description: [ + 0xc8, 0x8a, 0xc5, 0xb0, 0xe1, 0x9a, 0xb2, 0xc8, 0xbc, 0xc8, 0xbc, 0xc5, 0x9e, 0x63, + 0xcd, 0xb4, 0xc7, 0xbf, 0xc6, 0xbd, 0xc8, 0x99, 0xc3, 0x8c, 0xc8, 0x9c, 0x45, 0xc9, + 0x85, 0xcd, 0xb3, 0xc6, 0xb8, 0xc8, 0x91, 0x4e, 0xc9, 0x82, 0xc5, 0xab, 0xc5, 0x8a, + 0xce, 0x87, 0xe1, 0x9a, 0xbd, 0xc8, 0xa3, 0xc8, 0xa9, 0xc7, 0x90, 0xc6, 0x9c, 0xe1, + 0x9b, 0xa0, 0x41, 0x4c, 0xc2, 0xbb, 0xc7, 0x93, 0xe1, 0x9a, 0xa3, 0xc5, 0xba, 0xc6, + 0x86, 0xcd, 0xbd, 0xc5, 0x8d, 0xc4, 0xa4, 0xc8, 0xb5, 0xc3, 0x9d, 0xc3, 0xae, 0xc5, + 0x98, 0xe1, 0x9b, 0x91, 0x63, 0x66, 0xc3, 0xbc, 0xc8, 0xae, 0x7e, 0x40, 0xc2, 0xa8, + 0xc3, 0x8a, 0xc4, 0xac, 0x35, 0x3d, 0xcd, 0xbd, 0xc6, 0xad, 0xc3, 0x9b, 0xc6, 0x81, + 0xc5, 0xab, 0xc4, 0x8f, 0x28, 0xc4, 0x9d, 0xe1, 0x9b, 0x8e, 0xe1, 0x9b, 0xa4, 0xc5, + 0x86, 0xe1, 0x9a, 0xba, 0x50, 0xc6, 0xbc, 0xc6, 0x9b, 0xc7, 0xac, 0xc4, 0xb4, 0xe1, + 0x9a, 0xa9, 0xe1, 0x9b, 0xae, 0xc3, 0x91, 0xc6, 0x82, 0xc4, 0xa8, 0xc5, 0xa8, 0xc6, + 0xae, 0x2d, 0xe1, 0x9b, 0x9e, 0xc8, 0x8e, 0xe1, 0x9b, 0xa7, 0xc5, 0x8e, 0xc8, 0x8d, + 0xc3, 0x96, 0xc7, 0x9f, 0xc3, 0xb4, 0x3a, 0xcd, 0xb6, 0xc6, 0x8a, 0x6c, 0xc3, 0x9e, + 0xc9, 0x81, 0x65, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0xa2, 0xc7, 0x82, 0xe2, 0xb1, 0xad, + 0xe2, 0xb1, 0xa8, 0xc8, 0x96, 0xc8, 0xaa, 0xc6, 0xbc, 0x6b, 0xe1, 0x9a, 0xb4, 0xc5, + 0x9f, 0xc4, 0x92, 0xc6, 0x8e, 0xc3, 0x80, 0xc5, 0xb8, 0xc3, 0xa4, 0x2d, 0x38, 0xc5, + 0xb9, 0xc7, 0xb7, 0xc3, 0x8f, 0xc2, 0xb3, 0x62, 0xc5, 0x87, 0x21, 0xc6, 0x8f, 0xc7, + 0xb7, 0xe1, 0x9a, 0xb4, 0xc4, 0x84, 0x3e, 0xc7, 0x89, 0xc8, 0xaf, 0xc6, 0x98, 0xc6, + 0xb7, 0xc8, 0x9f, 0xc7, 0x9a, 0xc7, 0x96, 0xc3, 0xbb, 0x55, 0xe2, 0xb1, 0xb5, 0xc5, + 0xad, 0x2e, 0xc3, 0x86, 0xe1, 0x9b, 0x95, 0xc8, 0x81, 0xc3, 0x9b, 0xe1, 0x9b, 0xa4, + 0xcd, 0xb6, 0xc8, 0x8d, 0xc3, 0xa4, 0xc3, 0x89, 0xc8, 0x9d, 0xc8, 0xbe, 0x37, 0x25, + 0xc6, 0x99, 0x32, 0xc6, 0x92, 0xe1, 0x9b, 0x8b, 0x3a, 0x5f, 0x36, 0xc8, 0x9a, 0xc7, + 0xb3, 0x73, 0xc7, 0xaf, 0x7a, 0xc4, 0xac, 0xc7, 0x8b, 0xc8, 0x96, 0xc7, 0x82, 0xc8, + 0x8f, 0xc6, 0xb7, 0x37, 0xc3, 0xbc, 0xc5, 0x89, 0x2c, 0xc9, 0x84, 0xc5, 0xb7, 0xc6, + 0xb9, 0xc6, 0x90, 0xc7, 0x9f, 0xe2, 0xb1, 0xa5, 0xc5, 0x89, 0xc8, 0x8e, 0xc6, 0x8e, + 0xe1, 0x9b, 0x8e, 0xc8, 0xa6, 0xe1, 0x9a, 0xa4, 0xc5, 0xac, 0xc3, 0xa2, 0xc5, 0x9a, + 0x50, 0xc6, 0xa3, 0x44, 0xc6, 0x90, 0xc3, 0xae, 0x60, 0xc3, 0x8c, 0xc4, 0xb9, 0xc4, + 0x94, 0xc4, 0x9f, 0xc4, 0xa3, 0xc8, 0xb6, 0xc2, 0xa8, 0xc2, 0xa5, 0xc5, 0xb4, 0xe2, + 0xb1, 0xa2, 0x3a, 0xc7, 0xbd, 0x78, 0x78, 0xc3, 0xa9, 0xc2, 0xbc, 0xc4, 0xba, 0xc7, + 0x84, 0xc5, 0xb8, 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0x83, 0xc3, 0x98, 0xc3, 0xb7, 0xc8, + 0x84, 0xcd, 0xbc, 0xcd, 0xba, 0xc4, 0xbe, 0xc2, 0xa9, 0xe1, 0x9a, 0xa0, 0xc5, 0xbd, + 0x5d, 0xc6, 0x92, 0xc8, 0xa0, 0x42, 0xc3, 0xb8, 0xe1, 0x9b, 0x8e, 0xc9, 0x89, 0xc2, + 0xb6, 0xc2, 0xb6, 0xc5, 0xbc, 0xc3, 0x88, 0xc5, 0x9b, 0xc8, 0xae, 0xc6, 0x98, 0xc7, + 0x9a, 0xc4, 0x82, 0xc6, 0x90, 0xc6, 0xa3, 0xc4, 0x98, 0xc9, 0x8f, 0xe1, 0x9a, 0xb1, + 0xe2, 0xb1, 0xbb, 0xc3, 0x97, 0xc8, 0xba, 0xc8, 0xab, 0xc7, 0xad, 0x4a, 0x3f, 0xe2, + 0xb1, 0xbb, 0xce, 0x8a, 0xc3, 0xa6, 0xc7, 0xbe, 0xc5, 0x8b, 0xe2, 0xb1, 0xbe, 0xc2, + 0xac, 0xc8, 0xbb, 0xc6, 0xb8, 0xc4, 0x8d, 0x5a, + ], + asset_base: [ + 0xf1, 0xfb, 0x77, 0xa6, 0xf4, 0x53, 0x77, 0x23, 0x9c, 0x47, 0x57, 0xff, 0xee, 0xe4, + 0xb2, 0x66, 0x42, 0x1b, 0xfc, 0x50, 0x00, 0xe3, 0x27, 0x68, 0x85, 0x5f, 0xa0, 0x6a, + 0x0f, 0x5d, 0xe2, 0x27, + ], + }, + TestVector { + key: [ + 0xbf, 0x39, 0x20, 0xce, 0x2e, 0x9e, 0x95, 0xb0, 0xee, 0xce, 0x13, 0x0a, 0x50, 0xba, + 0x7d, 0xcc, 0x6f, 0x26, 0x51, 0x2a, 0x9f, 0xc7, 0xb8, 0x04, 0xaf, 0xf0, 0x89, 0xf5, + 0x0c, 0xbc, 0xff, 0xf7, + ], + description: [ + 0x2d, 0xc4, 0x8b, 0xc5, 0xa1, 0xc2, 0xa3, 0xc6, 0x99, 0x41, 0xe2, 0xb1, 0xb6, 0x63, + 0x4a, 0xc5, 0xa5, 0xe2, 0xb1, 0xbe, 0xc2, 0xbe, 0xe1, 0x9b, 0x9a, 0xc7, 0xa1, 0xc3, + 0x85, 0xc7, 0xac, 0xc7, 0x99, 0xc3, 0x90, 0xc5, 0x98, 0xc7, 0x9d, 0xc6, 0x8d, 0xc8, + 0xad, 0xc8, 0xbe, 0x61, 0xc3, 0x9d, 0x55, 0x66, 0xc5, 0x89, 0xc6, 0x97, 0xc6, 0xb5, + 0xc3, 0xbe, 0xc4, 0x84, 0xc5, 0x96, 0xc3, 0x8c, 0xc7, 0xa5, 0xe1, 0x9b, 0x94, 0xc2, + 0xab, 0xc3, 0xbd, 0xc6, 0x95, 0x2b, 0xc8, 0x88, 0xc7, 0xa4, 0x68, 0xc8, 0xa5, 0xe1, + 0x9a, 0xbf, 0xc8, 0x84, 0xc4, 0x98, 0xc5, 0xa5, 0xe1, 0x9b, 0x8e, 0xe2, 0xb1, 0xba, + 0x28, 0xc6, 0xab, 0xc8, 0x93, 0xc7, 0xb5, 0xc2, 0xa1, 0xc5, 0x80, 0xc6, 0xb0, 0xc6, + 0x94, 0xc8, 0x84, 0xc2, 0xb7, 0xc5, 0x87, 0xe1, 0x9b, 0x9e, 0xc7, 0x93, 0x6c, 0xe1, + 0x9b, 0xa5, 0x41, 0x62, 0xcd, 0xb1, 0xc7, 0x94, 0xc8, 0xac, 0x3b, 0xc3, 0x95, 0xc4, + 0x83, 0xc6, 0xbb, 0xe2, 0xb1, 0xa2, 0xe1, 0x9a, 0xa6, 0xc9, 0x81, 0xe1, 0x9b, 0x85, + 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x8c, 0xc3, 0xac, 0xc3, 0xa5, 0xc3, 0x80, 0xc3, 0x9d, + 0xc3, 0x9f, 0xc3, 0x96, 0xc3, 0xbb, 0xe2, 0xb1, 0xb4, 0xc8, 0xb1, 0x3b, 0xc5, 0x82, + 0x49, 0xc4, 0x90, 0xc4, 0xbd, 0xc9, 0x81, 0x4e, 0xc5, 0x8e, 0xc4, 0x94, 0xc3, 0xa7, + 0xc9, 0x89, 0xc6, 0x90, 0xc5, 0x8e, 0x3e, 0xe1, 0x9b, 0x99, 0x63, 0xc8, 0xb5, 0xc6, + 0xab, 0x38, 0xc8, 0xaf, 0xc5, 0xad, 0xc8, 0x8e, 0xc5, 0xab, 0xcd, 0xb0, 0xc5, 0xa3, + 0xc3, 0xb7, 0xc7, 0x85, 0xc2, 0xa7, 0x6d, 0xc2, 0xb7, 0x2f, 0xc3, 0xbd, 0xc7, 0x83, + 0xc5, 0xbb, 0xc2, 0xbf, 0xe2, 0xb1, 0xb8, 0xc4, 0xbc, 0xe1, 0x9b, 0xa5, 0xc7, 0x8c, + 0x71, 0x3d, 0xc7, 0xa0, 0xc9, 0x89, 0xc5, 0xb1, 0xc5, 0xa8, 0xc4, 0xa1, 0x5a, 0xe1, + 0x9a, 0xa4, 0xc7, 0xa6, 0xc6, 0x95, 0xc4, 0x90, 0xc7, 0x90, 0xe1, 0x9b, 0x90, 0xc3, + 0x92, 0xe1, 0x9a, 0xbd, 0xc7, 0xb2, 0xc7, 0xa9, 0xc6, 0xbb, 0xc6, 0x83, 0x21, 0xc9, + 0x87, 0xc3, 0x94, 0xc4, 0xac, 0xc2, 0xbf, 0xc4, 0x88, 0xc2, 0xa4, 0xc4, 0xbe, 0xc4, + 0xb2, 0xcd, 0xb6, 0xe2, 0xb1, 0xaa, 0xc9, 0x85, 0xc3, 0x97, 0xc8, 0x80, 0x78, 0xc8, + 0x95, 0xc6, 0x9f, 0xe1, 0x9b, 0xab, 0xc5, 0x8a, 0xc9, 0x82, 0xc8, 0x9a, 0x59, 0xe2, + 0xb1, 0xa7, 0xe1, 0x9b, 0xa2, 0x67, 0xc6, 0xb4, 0xc9, 0x8f, 0xc8, 0xbf, 0xc8, 0x85, + 0xc8, 0xb6, 0xc5, 0x94, 0x68, 0xe1, 0x9a, 0xaf, 0xe2, 0xb1, 0xa6, 0xc8, 0xae, 0xc4, + 0x89, 0xe1, 0x9a, 0xa2, 0xc7, 0xb9, 0xc8, 0xa0, 0xc2, 0xaf, 0xc7, 0x90, 0xc4, 0xb0, + 0xc4, 0xa7, 0xc5, 0xba, 0xc9, 0x82, 0xc3, 0x91, 0xe1, 0x9a, 0xa3, 0xc4, 0x92, 0x54, + 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0xa7, 0xe1, 0x9a, 0xac, 0xc4, 0xb5, 0xe1, 0x9b, 0x9c, + 0xc5, 0x91, 0xce, 0x8c, 0xc5, 0xb1, 0x78, 0x66, 0xc5, 0x99, 0xcd, 0xbe, 0xc6, 0xa7, + 0xe1, 0x9b, 0x9e, 0xe2, 0xb1, 0xa4, 0xc3, 0x8e, 0x47, 0xc3, 0xae, 0xce, 0x86, 0x69, + 0xc6, 0x8a, 0xc3, 0x8e, 0xe1, 0x9b, 0xad, 0xc9, 0x88, 0xe1, 0x9b, 0x96, 0x7c, 0xe1, + 0x9b, 0x95, 0xc7, 0xba, 0xc8, 0xab, 0xe1, 0x9b, 0x85, 0xc7, 0x94, 0xc3, 0xa6, 0xe1, + 0x9b, 0xaa, 0x6d, 0xe1, 0x9a, 0xaf, 0xc4, 0x90, 0x79, 0xc3, 0xb5, 0xe2, 0xb1, 0xae, + 0x59, 0xc8, 0xab, 0xc8, 0xb2, 0xc8, 0xad, 0xe2, 0xb1, 0xb5, 0x50, 0xc5, 0xaf, 0x52, + 0xc6, 0xa6, 0xe1, 0x9b, 0x8b, 0xe1, 0x9a, 0xa5, 0x52, 0xcd, 0xbd, 0xc3, 0x86, 0x38, + 0xc4, 0xae, 0xc9, 0x81, 0xc5, 0x96, 0xc6, 0x94, + ], + asset_base: [ + 0x10, 0xc3, 0x37, 0x4c, 0xc5, 0xd2, 0x6d, 0x14, 0xda, 0x3d, 0x1d, 0x41, 0x7e, 0x60, + 0x2c, 0x75, 0x2e, 0xfe, 0x36, 0x4f, 0x6c, 0x2f, 0x9e, 0xf3, 0x93, 0x39, 0x1d, 0x1b, + 0x48, 0xd3, 0x35, 0x2c, + ], + }, + TestVector { + key: [ + 0x2a, 0x15, 0xb5, 0xe8, 0x6e, 0xe7, 0x0e, 0xe6, 0xab, 0xfb, 0xca, 0x6b, 0x2f, 0x15, + 0x6d, 0x43, 0xf1, 0x85, 0x7d, 0xb5, 0xcb, 0x5e, 0x6d, 0xd6, 0xb7, 0x23, 0x17, 0x20, + 0x05, 0xfc, 0x2f, 0x83, + ], + description: [ + 0x2c, 0xc3, 0x8b, 0x50, 0xe1, 0x9a, 0xb0, 0xc8, 0x96, 0xc7, 0xaf, 0x31, 0xc3, 0x9e, + 0xc3, 0x95, 0xc9, 0x87, 0xe1, 0x9b, 0x9f, 0x52, 0xe1, 0x9b, 0x8b, 0xc2, 0xb2, 0xc7, + 0x98, 0xe1, 0x9b, 0x84, 0xc2, 0xa6, 0xc2, 0xaa, 0xc7, 0xaa, 0xc3, 0x80, 0xc7, 0x95, + 0xc3, 0x8e, 0xe2, 0xb1, 0xba, 0x36, 0xc3, 0xa7, 0xc4, 0xa7, 0xe1, 0x9b, 0x8f, 0xe1, + 0x9b, 0x85, 0xc5, 0x87, 0xc7, 0xbb, 0xc5, 0x85, 0xc5, 0x93, 0xc5, 0x9c, 0xc8, 0x92, + 0x6b, 0xe1, 0x9b, 0x96, 0x78, 0xcd, 0xbe, 0xc4, 0x9a, 0xc7, 0x92, 0xc3, 0xb1, 0xc8, + 0xa8, 0xc3, 0x8b, 0x46, 0xc7, 0x94, 0xc5, 0x81, 0xc7, 0xa0, 0xc4, 0xb9, 0x78, 0x49, + 0xc5, 0xbb, 0xc5, 0xb5, 0xc5, 0x86, 0xc5, 0xb7, 0xc7, 0xb9, 0xc4, 0x86, 0xc5, 0xae, + 0xc7, 0xb4, 0x37, 0xc4, 0x89, 0x47, 0xe1, 0x9b, 0x88, 0xc6, 0x9d, 0xc4, 0xa8, 0xe2, + 0xb1, 0xa4, 0xc3, 0x9f, 0x3e, 0xc5, 0xa7, 0xc8, 0xbe, 0x41, 0xc9, 0x8a, 0xe1, 0x9a, + 0xad, 0xc2, 0xba, 0xc3, 0xba, 0xc4, 0x8b, 0xc5, 0x9b, 0xc5, 0xa7, 0x7a, 0xcd, 0xb6, + 0xc8, 0xb5, 0xc7, 0xa0, 0xc4, 0x81, 0xe1, 0x9b, 0x98, 0xc3, 0xb3, 0x72, 0xe1, 0x9a, + 0xad, 0xc6, 0x85, 0xcd, 0xb0, 0xce, 0x89, 0xc8, 0x86, 0xc3, 0x90, 0xc6, 0x83, 0x51, + 0xc7, 0x80, 0xc3, 0x8c, 0xe2, 0xb1, 0xa3, 0xc9, 0x8f, 0xc3, 0x8c, 0xc5, 0xad, 0xc3, + 0x86, 0xe1, 0x9b, 0xa7, 0x54, 0xc3, 0xb0, 0xce, 0x85, 0xc3, 0xbc, 0xe2, 0xb1, 0xa3, + 0xc4, 0x9f, 0x76, 0xc3, 0x91, 0xc5, 0xa0, 0xc4, 0x8f, 0xc5, 0x91, 0xc4, 0xa3, 0x33, + 0xc6, 0x9d, 0xe1, 0x9b, 0x8c, 0xc3, 0xa6, 0xc3, 0xb8, 0xe1, 0x9a, 0xa5, 0xe2, 0xb1, + 0xac, 0xc7, 0x9b, 0xc5, 0xaf, 0xc4, 0xb0, 0xe1, 0x9a, 0xb4, 0x4f, 0xe2, 0xb1, 0xa6, + 0x4e, 0x5f, 0xc8, 0xbf, 0xc3, 0xb3, 0xe1, 0x9b, 0x9a, 0xe1, 0x9a, 0xa4, 0xc7, 0x89, + 0xc6, 0x88, 0xcd, 0xbb, 0xc3, 0xa0, 0xc3, 0xb3, 0xcd, 0xb2, 0xc3, 0xbb, 0xc6, 0xa0, + 0xe1, 0x9b, 0xab, 0xc3, 0xa1, 0xc7, 0x97, 0x32, 0xe1, 0x9b, 0xa5, 0xc7, 0xac, 0xc5, + 0x9c, 0xc8, 0xbf, 0xc4, 0xbc, 0xc4, 0x8a, 0x3a, 0x60, 0xc6, 0x81, 0xe1, 0x9b, 0x80, + 0xc4, 0x82, 0xce, 0x89, 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x9f, 0xc7, 0x92, 0xe2, 0xb1, + 0xa7, 0xe1, 0x9b, 0x82, 0xc7, 0x82, 0xe1, 0x9b, 0x91, 0xc6, 0xb5, 0x5e, 0xc7, 0xb0, + 0x3a, 0xc3, 0xa7, 0xce, 0x89, 0xe1, 0x9a, 0xbf, 0xc4, 0xbe, 0xc5, 0x9e, 0xc5, 0xb0, + 0xe2, 0xb1, 0xb6, 0xc9, 0x8f, 0xc8, 0x94, 0xc3, 0xbd, 0x6b, 0x4c, 0xc3, 0xad, 0xc8, + 0xb3, 0xc4, 0x99, 0xc3, 0xa5, 0xe2, 0xb1, 0xaf, 0xc4, 0x9d, 0x24, 0xc3, 0x91, 0xc5, + 0xa6, 0xc2, 0xaa, 0xe1, 0x9a, 0xb9, 0xc5, 0x9d, 0xc3, 0xab, 0xc5, 0xa3, 0xc6, 0xb6, + 0xe1, 0x9a, 0xac, 0x73, 0x7d, 0x4f, 0xe2, 0xb1, 0xb9, 0xc3, 0x8d, 0xc2, 0xa9, 0x57, + 0x2f, 0xc4, 0x99, 0xc7, 0xa6, 0xc6, 0xbb, 0xe2, 0xb1, 0xa5, 0xc3, 0xb7, 0x70, 0xc6, + 0x8c, 0xc6, 0xa9, 0xc7, 0xbf, 0xc2, 0xa7, 0xc3, 0xa2, 0xc2, 0xb0, 0xc8, 0x81, 0xc3, + 0x81, 0xe1, 0x9a, 0xba, 0xc5, 0x9c, 0xc4, 0x90, 0xc4, 0xa7, 0x71, 0xc8, 0xa9, 0xe1, + 0x9b, 0x9c, 0xe2, 0xb1, 0xab, 0x3e, 0x78, 0xc2, 0xb1, 0xc5, 0x88, 0xc4, 0xb1, 0xc7, + 0x9e, 0x38, 0xc8, 0xac, 0x71, 0xcd, 0xba, 0xc8, 0xba, 0x69, 0xc3, 0x8a, 0xcd, 0xbd, + 0xe1, 0x9b, 0xb0, 0xc8, 0x99, 0xc7, 0xbb, 0xc8, 0xb2, 0xc9, 0x8e, 0xc8, 0xac, 0xc2, + 0xa9, 0xc3, 0xb1, 0x3e, 0xc5, 0xbf, 0xc8, 0x8a, 0xe2, 0xb1, 0xaf, 0xc7, 0xaf, 0xc7, + 0x88, 0x5b, 0x4b, 0xe1, 0x9b, 0x87, 0x5a, 0x5a, + ], + asset_base: [ + 0x66, 0x9e, 0x20, 0x80, 0x8b, 0xa2, 0xa4, 0xd1, 0x31, 0xed, 0xeb, 0x7a, 0x39, 0x11, + 0xb1, 0xe1, 0x24, 0xd3, 0x77, 0x56, 0xd5, 0xb1, 0x3c, 0x61, 0xc6, 0x47, 0x73, 0x41, + 0xd2, 0x47, 0x57, 0xb6, + ], + }, + TestVector { + key: [ + 0x48, 0xbe, 0xf1, 0xc3, 0x4e, 0x8a, 0x86, 0x4c, 0x7e, 0xaa, 0x0c, 0x85, 0x31, 0x63, + 0x83, 0xc3, 0xf1, 0xc9, 0xb1, 0x87, 0xd5, 0x01, 0x74, 0xb4, 0x9a, 0xfe, 0xbd, 0x99, + 0xc3, 0xa1, 0xaf, 0xf9, + ], + description: [ + 0x5d, 0xc7, 0x88, 0xc2, 0xb9, 0x61, 0xc8, 0xb0, 0xc3, 0x98, 0xe2, 0xb1, 0xab, 0xc6, + 0xa9, 0xc8, 0xa7, 0xe2, 0xb1, 0xa9, 0xc5, 0xbb, 0x3a, 0x68, 0xc7, 0x83, 0xc8, 0xa1, + 0xc8, 0xbd, 0xc4, 0x9e, 0x6c, 0xc3, 0xab, 0xe1, 0x9b, 0xaf, 0xe1, 0x9b, 0x83, 0xc6, + 0xb7, 0xc2, 0xa4, 0xc4, 0x81, 0xc7, 0x9c, 0xc5, 0xb2, 0xe1, 0x9a, 0xaf, 0xe1, 0x9a, + 0xab, 0xc5, 0x88, 0xe1, 0x9a, 0xb0, 0xc6, 0xac, 0x63, 0xe1, 0x9b, 0xb0, 0xc7, 0xbe, + 0xc6, 0x8a, 0x3c, 0xc5, 0xb2, 0xc3, 0x89, 0xc2, 0xb0, 0x3d, 0xc2, 0xba, 0xe1, 0x9b, + 0x84, 0xc5, 0x8b, 0xe2, 0xb1, 0xb9, 0xc5, 0x91, 0x39, 0xc6, 0xb6, 0xc7, 0x9e, 0xc8, + 0x81, 0x74, 0xc7, 0xa8, 0xc8, 0xb0, 0xc2, 0xb6, 0xc4, 0x88, 0xc3, 0x9d, 0xc7, 0x89, + 0xc9, 0x8c, 0xc4, 0x85, 0xc3, 0x93, 0xc7, 0xaa, 0xc5, 0xb6, 0xc7, 0x9a, 0xc3, 0xae, + 0xe1, 0x9b, 0x81, 0xc3, 0x96, 0xc5, 0x80, 0xc5, 0x92, 0xc2, 0xa1, 0xc6, 0xa3, 0xe1, + 0x9a, 0xb7, 0xc2, 0xbf, 0xc5, 0xbb, 0xc7, 0xa9, 0xc7, 0x85, 0xc8, 0xbd, 0xc3, 0x8b, + 0xc7, 0xa6, 0xc3, 0xa0, 0xc6, 0x90, 0xe1, 0x9a, 0xb7, 0xc8, 0x88, 0xc4, 0x91, 0xc8, + 0x94, 0xc8, 0x9b, 0x6d, 0xc3, 0xa3, 0xc3, 0xb8, 0xc6, 0x88, 0xc5, 0xb1, 0x6e, 0xc7, + 0x87, 0x40, 0xc6, 0x8f, 0x7a, 0xc8, 0xa8, 0xc3, 0xb4, 0x46, 0xc3, 0xac, 0xc6, 0xa7, + 0xc6, 0x9c, 0xc8, 0x95, 0xc6, 0x87, 0xc6, 0x84, 0xc6, 0xb5, 0xc8, 0x97, 0xc3, 0xb8, + 0x69, 0x48, 0xe1, 0x9a, 0xaf, 0x53, 0xc4, 0xb8, 0xc3, 0x9c, 0xc4, 0xa8, 0xc5, 0xa6, + 0xc2, 0xbd, 0xc4, 0x92, 0xc2, 0xaf, 0xc2, 0xaf, 0xc4, 0xbb, 0xc7, 0x8c, 0xc3, 0xb9, + 0xc6, 0xb5, 0xc8, 0xa2, 0xc5, 0xb1, 0xc3, 0x81, 0xc6, 0x86, 0xc9, 0x8a, 0x4d, 0xc4, + 0xb8, 0xc4, 0xb4, 0xe1, 0x9a, 0xbf, 0xc2, 0xa2, 0xc4, 0x8d, 0xce, 0x87, 0xe2, 0xb1, + 0xbb, 0xe2, 0xb1, 0xa1, 0xc3, 0x87, 0xe1, 0x9a, 0xae, 0xc6, 0xb2, 0xc6, 0xa7, 0xc9, + 0x8d, 0xe1, 0x9b, 0xa8, 0xc4, 0x9a, 0xcd, 0xb1, 0xc5, 0x98, 0xc4, 0xbb, 0xc5, 0x95, + 0xc9, 0x8b, 0x61, 0xe2, 0xb1, 0xbf, 0xc3, 0xa6, 0xc5, 0xbd, 0xc4, 0x9c, 0xce, 0x85, + 0xe2, 0xb1, 0xa0, 0xc5, 0xbf, 0xc5, 0xbf, 0x34, 0xc7, 0x82, 0xcd, 0xb6, 0xe1, 0x9b, + 0x95, 0xc5, 0xaf, 0xc5, 0x98, 0xc8, 0x9f, 0xc2, 0xb8, 0xc4, 0xa5, 0xc5, 0xb8, 0xc4, + 0xad, 0xc8, 0xaf, 0xc6, 0x81, 0x6b, 0xc4, 0x8b, 0x55, 0xc7, 0xbe, 0xc3, 0xb4, 0xc6, + 0xa2, 0x62, 0xc8, 0xa0, 0xc3, 0x8d, 0xc3, 0xa8, 0x75, 0xc5, 0x90, 0xcd, 0xb1, 0x4d, + 0xc7, 0x9a, 0xc5, 0x87, 0xc5, 0xb5, 0xc6, 0x88, 0x25, 0xe2, 0xb1, 0xac, 0xc7, 0xa3, + 0xc9, 0x8d, 0xc8, 0x98, 0x6b, 0xc4, 0x9b, 0xc7, 0x90, 0xc8, 0x8e, 0xc8, 0x86, 0x36, + 0xe1, 0x9a, 0xaa, 0xc4, 0xa8, 0xe1, 0x9a, 0xa9, 0xc2, 0xb9, 0xe1, 0x9a, 0xb6, 0xc2, + 0xa8, 0xc2, 0xa4, 0xc3, 0x9a, 0xc3, 0x86, 0xc4, 0xb4, 0xc7, 0xa1, 0x53, 0xe2, 0xb1, + 0xa5, 0xc5, 0xa1, 0xe1, 0x9b, 0xa2, 0xc5, 0xaa, 0xc8, 0xa1, 0x2d, 0xc8, 0x96, 0x75, + 0xc2, 0xa6, 0xe1, 0x9b, 0x9b, 0xc6, 0xbb, 0xc9, 0x86, 0xc4, 0xa3, 0xc5, 0xb1, 0xe1, + 0x9b, 0x92, 0x39, 0x79, 0x5b, 0xc4, 0xbd, 0xe1, 0x9b, 0xa2, 0xe1, 0x9a, 0xa3, 0xc5, + 0xb6, 0xc8, 0x99, 0xc2, 0xb3, 0xe1, 0x9b, 0x8d, 0xc3, 0xbd, 0xc3, 0x86, 0xc4, 0x89, + 0xe2, 0xb1, 0xb2, 0xe1, 0x9b, 0xb0, 0x73, 0xe1, 0x9b, 0x9a, 0x34, 0xc4, 0x8a, 0x56, + 0xc2, 0xb5, 0xc4, 0xba, 0xe2, 0xb1, 0xa7, 0xc7, 0xa4, 0xcd, 0xbe, 0xe2, 0xb1, 0xb6, + 0xc8, 0xbc, 0xc8, 0x81, 0xc7, 0xac, 0xc8, 0x8e, + ], + asset_base: [ + 0x31, 0x1a, 0x81, 0xd9, 0x40, 0x52, 0x81, 0x50, 0xe5, 0xb4, 0x70, 0x97, 0x96, 0xb6, + 0x03, 0x22, 0x7a, 0xd1, 0xde, 0x1c, 0x15, 0x00, 0xef, 0x44, 0x5c, 0x40, 0xa4, 0xb2, + 0xaa, 0x21, 0xa1, 0x06, + ], + }, + TestVector { + key: [ + 0xff, 0x08, 0xec, 0x66, 0x3e, 0x18, 0x56, 0x51, 0x3f, 0xf6, 0x90, 0x80, 0x0c, 0x56, + 0x49, 0x91, 0xb2, 0x51, 0x67, 0xc2, 0xdd, 0x14, 0x07, 0x98, 0x13, 0x73, 0xc6, 0xd5, + 0x30, 0x65, 0xe3, 0x67, + ], + description: [ + 0xe1, 0x9b, 0x9e, 0xe1, 0x9a, 0xba, 0xc5, 0x9e, 0xe1, 0x9b, 0xa0, 0xc5, 0xbd, 0xe2, + 0xb1, 0xb8, 0xc8, 0x99, 0xc6, 0xb6, 0xc5, 0x9b, 0xc3, 0x83, 0xc2, 0xbd, 0xe1, 0x9a, + 0xbb, 0xe1, 0x9b, 0xa3, 0xc7, 0x8b, 0xc5, 0xb1, 0xc4, 0x9e, 0xe1, 0x9b, 0xa5, 0xe2, + 0xb1, 0xa5, 0xc8, 0xac, 0x58, 0xcd, 0xb2, 0xc6, 0x88, 0xc6, 0x85, 0xc7, 0x90, 0xc6, + 0x81, 0xe2, 0xb1, 0xb7, 0xc3, 0xb7, 0xc8, 0xb8, 0x7b, 0xe1, 0x9a, 0xb8, 0x64, 0xc4, + 0x85, 0x5f, 0xcd, 0xb3, 0xc8, 0xb1, 0xc9, 0x87, 0xc4, 0xbf, 0xc5, 0xbe, 0x2f, 0xe1, + 0x9b, 0x8c, 0xc7, 0xbc, 0xc5, 0xab, 0xe1, 0x9a, 0xb6, 0xe2, 0xb1, 0xa9, 0xc6, 0xb7, + 0xc4, 0x89, 0x63, 0xc3, 0xa5, 0xc2, 0xbf, 0xc6, 0x9b, 0x5c, 0xc5, 0x93, 0xc6, 0xb0, + 0xc4, 0xaa, 0xc8, 0xb3, 0xc8, 0x89, 0xc7, 0xbc, 0xc2, 0xa7, 0xc7, 0xa9, 0xc8, 0xb2, + 0xc7, 0xbd, 0xe1, 0x9b, 0xa5, 0xc5, 0xb5, 0xc4, 0x8e, 0xc9, 0x82, 0xc5, 0x84, 0xc6, + 0x86, 0xc3, 0x8f, 0xc4, 0x85, 0xc6, 0xa0, 0xc8, 0xa3, 0xc6, 0xa6, 0xe1, 0x9a, 0xa9, + 0xc5, 0x99, 0xc2, 0xa8, 0xc7, 0xbc, 0xe2, 0xb1, 0xbb, 0xc4, 0xa4, 0xc6, 0xb9, 0xc7, + 0x90, 0xc9, 0x8c, 0xc3, 0x80, 0xc7, 0x8f, 0xc5, 0x94, 0xc8, 0x88, 0xc9, 0x86, 0xc3, + 0xbd, 0xe2, 0xb1, 0xb1, 0xe2, 0xb1, 0xbe, 0x3c, 0xc6, 0x87, 0x7c, 0x6f, 0xc3, 0xbd, + 0xc6, 0x94, 0xc2, 0xa1, 0x7d, 0xc3, 0x87, 0xc2, 0xac, 0xcd, 0xb3, 0xc8, 0xa3, 0xc2, + 0xbb, 0x61, 0xc4, 0x97, 0xc9, 0x8d, 0x6c, 0xe2, 0xb1, 0xad, 0xc5, 0x8c, 0xc5, 0xa3, + 0xc2, 0xb2, 0xe2, 0xb1, 0xbf, 0xc5, 0xa2, 0xe1, 0x9b, 0x85, 0xc6, 0xb0, 0x78, 0xe1, + 0x9b, 0x80, 0xcd, 0xb6, 0xc5, 0x80, 0xc8, 0x99, 0xc2, 0xba, 0xc3, 0x96, 0xc6, 0x8c, + 0xc7, 0xaf, 0xc4, 0x97, 0xc3, 0x8b, 0xc4, 0xa4, 0xc6, 0xb0, 0xc7, 0x98, 0xc4, 0x8d, + 0x62, 0xc8, 0x8b, 0xc6, 0xaf, 0x4d, 0xc8, 0xb7, 0xc8, 0x8c, 0x5e, 0xc2, 0xab, 0xc4, + 0x86, 0xc5, 0xb1, 0x2c, 0xe2, 0xb1, 0xad, 0xe1, 0x9b, 0xa7, 0xc9, 0x8a, 0xc3, 0xb1, + 0xc3, 0xae, 0xc4, 0x98, 0xc7, 0xbe, 0xc5, 0x94, 0xc3, 0x8a, 0xce, 0x89, 0xcd, 0xbb, + 0xc6, 0xbc, 0xcd, 0xb1, 0xc4, 0x8a, 0xc5, 0x90, 0xc6, 0xa9, 0xe1, 0x9b, 0x85, 0xc9, + 0x8c, 0x63, 0xe1, 0x9a, 0xab, 0x57, 0xc3, 0xb7, 0xc6, 0xb9, 0xce, 0x86, 0xc4, 0xa7, + 0xc3, 0x80, 0xc8, 0xb6, 0xe1, 0x9b, 0x9c, 0xcd, 0xb6, 0xc3, 0xa3, 0xc4, 0x9c, 0xe2, + 0xb1, 0xa7, 0xc7, 0x88, 0xc4, 0xb6, 0xc8, 0x80, 0xe1, 0x9b, 0x95, 0x33, 0xc2, 0xb6, + 0xc6, 0x86, 0xc6, 0xae, 0xc6, 0x97, 0xc7, 0x9b, 0xc7, 0xbf, 0xc6, 0x95, 0xe1, 0x9b, + 0xab, 0xc5, 0x8b, 0x58, 0xc7, 0x9a, 0xc8, 0x81, 0xc2, 0xb2, 0xc3, 0x8a, 0xc9, 0x81, + 0xc6, 0x84, 0xc6, 0xb5, 0xc5, 0xa6, 0xc5, 0xaf, 0xc9, 0x8e, 0xc2, 0xbc, 0xc7, 0xb5, + 0xe1, 0x9b, 0x8b, 0xc8, 0x8c, 0xc9, 0x89, 0xe1, 0x9b, 0x91, 0xe1, 0x9a, 0xb8, 0x3b, + 0xc5, 0x88, 0xc2, 0xa5, 0xc8, 0xa0, 0xc4, 0x97, 0xe1, 0x9b, 0x8d, 0xc2, 0xa4, 0xc3, + 0x83, 0xc3, 0x9a, 0x4c, 0xe1, 0x9b, 0x80, 0xc4, 0xa5, 0xc3, 0xa9, 0xc9, 0x80, 0xc7, + 0xb3, 0xc7, 0xb4, 0xe1, 0x9b, 0x80, 0xe1, 0x9b, 0x8e, 0xc5, 0xb9, 0xc2, 0xb9, 0xc6, + 0xb7, 0xc8, 0xbc, 0xc5, 0xa6, 0xc4, 0x83, 0xe1, 0x9b, 0x80, 0xc8, 0x92, 0xc4, 0x94, + 0xe1, 0x9b, 0x8c, 0xc8, 0xbc, 0xc4, 0x8e, 0xe2, 0xb1, 0xb3, 0x38, 0xc8, 0x8d, 0xc9, + 0x8c, 0xc6, 0xbd, 0xc3, 0x90, 0xc6, 0xa9, 0xc3, 0xb6, 0x66, 0x38, 0xc8, 0x97, 0xe1, + 0x9a, 0xa1, 0xc8, 0xb2, 0xc5, 0xab, 0xc7, 0x99, + ], + asset_base: [ + 0x4f, 0x95, 0x9d, 0x88, 0x63, 0xb8, 0x36, 0x0b, 0x43, 0x30, 0x2b, 0xef, 0x35, 0x13, + 0x1f, 0x69, 0xd4, 0xf4, 0x26, 0xb1, 0x38, 0x3e, 0x54, 0xae, 0x38, 0x96, 0x40, 0x31, + 0xa8, 0xe5, 0xf9, 0x21, + ], + }, + TestVector { + key: [ + 0x39, 0xc4, 0x51, 0xf4, 0xd8, 0xdd, 0xcf, 0x69, 0x05, 0xed, 0xd8, 0x82, 0x5a, 0xd9, + 0x81, 0xb9, 0xe7, 0x3c, 0xa6, 0x83, 0x1c, 0xa2, 0xb3, 0xd7, 0xe8, 0xce, 0xf3, 0xd0, + 0xba, 0xaa, 0x31, 0x1b, + ], + description: [ + 0xc7, 0x94, 0xc5, 0xac, 0xc4, 0x97, 0xc6, 0xba, 0xe1, 0x9b, 0x97, 0xc7, 0x84, 0xc8, + 0xb6, 0xe1, 0x9b, 0x9d, 0xc8, 0x9c, 0xcd, 0xb5, 0xc3, 0x93, 0x7d, 0xc8, 0xa7, 0xc4, + 0x86, 0xc6, 0xab, 0xc4, 0x88, 0xe2, 0xb1, 0xb1, 0x6b, 0xe1, 0x9a, 0xa6, 0x68, 0xc6, + 0x9c, 0xc2, 0xb0, 0xc6, 0xba, 0xc7, 0xa6, 0xc5, 0x8c, 0xc9, 0x89, 0xc8, 0xbe, 0xc3, + 0xbc, 0xc5, 0xb7, 0xc7, 0x95, 0x5c, 0xc3, 0x96, 0xc4, 0x89, 0xc6, 0x84, 0xc3, 0xb2, + 0xc9, 0x87, 0x38, 0x45, 0xc3, 0xa1, 0xe2, 0xb1, 0xb1, 0x41, 0xc5, 0xac, 0xc6, 0xa1, + 0xc2, 0xa4, 0x34, 0xc4, 0xb0, 0xc2, 0xb5, 0xc5, 0xa2, 0xe1, 0x9a, 0xa9, 0xc4, 0xb6, + 0xc5, 0xbd, 0xc2, 0xbd, 0xc4, 0xa2, 0xc6, 0x8c, 0xc2, 0xb4, 0xc8, 0xb1, 0xc3, 0x95, + 0xc2, 0xbf, 0xc7, 0x99, 0xe1, 0x9b, 0x99, 0xc6, 0x8a, 0xc8, 0xaf, 0xc6, 0x9f, 0xc4, + 0x93, 0x38, 0xc7, 0x94, 0xc8, 0xa2, 0xc8, 0x84, 0xc6, 0x8f, 0x3a, 0xc5, 0xbd, 0xe1, + 0x9b, 0x97, 0xc5, 0x88, 0xcd, 0xb6, 0xc5, 0xa1, 0xc6, 0x96, 0xc4, 0x9f, 0xc3, 0x94, + 0xc5, 0xa6, 0xc4, 0xa4, 0xcd, 0xb2, 0xc7, 0xbc, 0xc8, 0x8d, 0x78, 0xc9, 0x86, 0xe2, + 0xb1, 0xab, 0xce, 0x84, 0xcd, 0xbd, 0xc4, 0x95, 0x65, 0xc7, 0x88, 0xc4, 0x84, 0xce, + 0x8c, 0xc3, 0xb1, 0xc2, 0xaf, 0xc6, 0xbf, 0xc4, 0x92, 0x25, 0xc7, 0xbc, 0xe2, 0xb1, + 0xb0, 0xc5, 0x93, 0xc7, 0x8a, 0xc5, 0x92, 0x75, 0xc4, 0xb7, 0xc6, 0x86, 0xc3, 0xbf, + 0xc7, 0xb7, 0xc6, 0xae, 0x67, 0xc2, 0xa9, 0xc6, 0x9e, 0xc5, 0x97, 0xcd, 0xb0, 0xc3, + 0x92, 0xc3, 0xac, 0xc5, 0xbb, 0xc3, 0x9a, 0xc3, 0xa1, 0xc6, 0x87, 0xc3, 0x8e, 0xc3, + 0xb8, 0xc9, 0x80, 0xe1, 0x9a, 0xa7, 0xc7, 0xac, 0x65, 0x24, 0xc6, 0x9c, 0xc3, 0xb2, + 0xc4, 0x82, 0x64, 0xc7, 0x8e, 0xc5, 0x8b, 0xe1, 0x9b, 0x8a, 0xe1, 0x9b, 0x89, 0xc9, + 0x82, 0xc3, 0x97, 0xc2, 0xac, 0xc4, 0x80, 0xc6, 0x83, 0xc4, 0xa6, 0xc4, 0xb6, 0xce, + 0x89, 0x52, 0x59, 0xce, 0x85, 0xc9, 0x85, 0xc6, 0xa9, 0xc4, 0x80, 0xc9, 0x8b, 0xe1, + 0x9a, 0xbe, 0xc9, 0x8e, 0xc2, 0xae, 0xc8, 0x96, 0xc6, 0x95, 0xc8, 0xaa, 0xe1, 0x9b, + 0x9b, 0xe1, 0x9a, 0xac, 0xc2, 0xb1, 0xc2, 0xaf, 0xc8, 0x8e, 0xe1, 0x9a, 0xae, 0xe1, + 0x9a, 0xa7, 0xc4, 0xb7, 0xc8, 0x82, 0xc3, 0xb2, 0xc4, 0xab, 0xc4, 0xbf, 0xc7, 0x91, + 0xe1, 0x9b, 0x9b, 0xc8, 0x90, 0xc7, 0x93, 0xe1, 0x9b, 0xa3, 0xc7, 0xb5, 0xc5, 0xa0, + 0xc8, 0xa2, 0xc8, 0x86, 0xc9, 0x86, 0xc2, 0xaa, 0x3d, 0xc4, 0xbf, 0xc5, 0xbc, 0xc4, + 0x96, 0xc3, 0xa5, 0xc3, 0x90, 0xc5, 0xb9, 0xc3, 0xa8, 0xc7, 0x80, 0xc5, 0x84, 0xce, + 0x89, 0xcd, 0xb7, 0xc3, 0x9b, 0xc2, 0xa1, 0xc7, 0x87, 0xcd, 0xb3, 0xe2, 0xb1, 0xb0, + 0xc8, 0x8b, 0xe1, 0x9a, 0xb1, 0xe1, 0x9a, 0xaf, 0x35, 0xc3, 0xa9, 0xc7, 0x85, 0xc4, + 0x85, 0xcd, 0xb1, 0xc4, 0xa7, 0xc3, 0x83, 0xe1, 0x9b, 0x94, 0xe2, 0xb1, 0xbf, 0xc4, + 0x80, 0x29, 0x2a, 0xc3, 0xa2, 0xe1, 0x9b, 0x88, 0xc3, 0x87, 0xe1, 0x9a, 0xb0, 0xc2, + 0xb8, 0xc7, 0x85, 0xc8, 0xb3, 0xc5, 0x84, 0x63, 0xc5, 0x8d, 0x3b, 0xc8, 0x9f, 0x5e, + 0xe2, 0xb1, 0xa5, 0x5c, 0xc4, 0x9f, 0xc8, 0xb4, 0xe2, 0xb1, 0xa0, 0xc7, 0xa5, 0x37, + 0xc6, 0xa2, 0xc8, 0xad, 0xe1, 0x9b, 0xa3, 0xc8, 0x96, 0xc6, 0xb6, 0xe2, 0xb1, 0xa4, + 0xc2, 0xb7, 0xc3, 0x86, 0xc4, 0xb1, 0xc6, 0x9f, 0xc8, 0x8c, 0xc8, 0xb3, 0xe1, 0x9a, + 0xa6, 0xc7, 0xa2, 0xc3, 0xbd, 0xe1, 0x9b, 0x8e, 0xc3, 0x9d, 0x21, 0xe1, 0x9b, 0xa5, + 0xe1, 0x9b, 0x8a, 0xc8, 0xb2, 0x24, 0xc8, 0x91, + ], + asset_base: [ + 0x2c, 0x25, 0xd3, 0x35, 0xaf, 0xa2, 0xd5, 0x69, 0x72, 0x42, 0xf6, 0x18, 0x5c, 0x00, + 0x69, 0xd7, 0x9b, 0x33, 0xc8, 0x4a, 0x3f, 0x7f, 0x5c, 0x3c, 0x26, 0x5d, 0x3e, 0x88, + 0x45, 0xac, 0xcd, 0x0e, + ], + }, + TestVector { + key: [ + 0xa2, 0x8d, 0x36, 0xc0, 0xa0, 0xe1, 0xd6, 0x54, 0x57, 0x44, 0x64, 0xec, 0x5e, 0x0c, + 0x8d, 0x87, 0x85, 0x6e, 0xb9, 0xdf, 0xd2, 0x1d, 0x4d, 0xa2, 0xb9, 0xea, 0x34, 0xfd, + 0xe7, 0x3b, 0x19, 0x42, + ], + description: [ + 0xc8, 0x96, 0xcd, 0xba, 0xc7, 0x94, 0x32, 0xc5, 0xbf, 0xc7, 0x9c, 0xc3, 0x94, 0xc5, + 0x97, 0xc7, 0x84, 0xc2, 0xb1, 0xc3, 0xa9, 0x25, 0xc2, 0xb6, 0xc7, 0x84, 0xce, 0x84, + 0xc7, 0x8d, 0xc8, 0xb3, 0xe1, 0x9a, 0xa3, 0xc3, 0xb1, 0xe1, 0x9a, 0xa4, 0xc7, 0xa6, + 0xc2, 0xa6, 0xe1, 0x9a, 0xb5, 0xc8, 0x97, 0x3f, 0xc7, 0x90, 0x55, 0xc3, 0x97, 0xc5, + 0xb6, 0xc5, 0xa3, 0xc7, 0x98, 0xc7, 0xba, 0xc7, 0xa7, 0xc8, 0x89, 0xc3, 0x80, 0xe2, + 0xb1, 0xb8, 0xc7, 0x8c, 0xc6, 0xa2, 0xc5, 0xb2, 0xc6, 0x90, 0xc4, 0x8f, 0xc4, 0x84, + 0xc7, 0xa3, 0xc2, 0xbd, 0x48, 0xc3, 0x97, 0xc7, 0x8b, 0xc7, 0x85, 0xc5, 0x83, 0xc7, + 0xb9, 0xe1, 0x9b, 0x96, 0xc8, 0x90, 0xc3, 0xbd, 0xe1, 0x9b, 0x99, 0xc8, 0x9b, 0xcd, + 0xb5, 0x28, 0xe1, 0x9b, 0xaa, 0xc5, 0x9a, 0xc6, 0xb7, 0x39, 0x75, 0x25, 0xc7, 0xb8, + 0xc5, 0xaa, 0xc8, 0xa5, 0xc5, 0xb3, 0xc7, 0x96, 0xc3, 0x8c, 0xc5, 0x87, 0x72, 0xe1, + 0x9a, 0xab, 0x72, 0xc9, 0x8b, 0xc3, 0xb0, 0xc8, 0x96, 0xc3, 0xb2, 0xc3, 0x82, 0x52, + 0x78, 0x68, 0x4d, 0xc5, 0x9e, 0xc5, 0x80, 0xe1, 0x9b, 0x84, 0xe2, 0xb1, 0xa6, 0xc6, + 0x8d, 0x51, 0xc8, 0xbe, 0xe1, 0x9b, 0x8d, 0xc2, 0xbc, 0xc6, 0xa8, 0xc7, 0x93, 0xc8, + 0x90, 0xc5, 0x99, 0x28, 0x6e, 0xc8, 0x95, 0x78, 0xe1, 0x9b, 0x83, 0xc4, 0xbe, 0xc8, + 0xb5, 0xc5, 0x80, 0x67, 0xc3, 0x9b, 0xe1, 0x9b, 0x89, 0xc5, 0x8c, 0x75, 0xc4, 0xb7, + 0xe1, 0x9b, 0x87, 0x47, 0xc3, 0xa9, 0xc5, 0x95, 0xc4, 0x93, 0xc3, 0x9d, 0xe1, 0x9b, + 0x82, 0xc7, 0x95, 0xc5, 0x84, 0xc5, 0x91, 0xe1, 0x9a, 0xa2, 0xc3, 0x95, 0xcd, 0xb6, + 0xe2, 0xb1, 0xbd, 0xc5, 0x91, 0xc4, 0xbb, 0xc7, 0x8a, 0xc7, 0xaa, 0xc8, 0xb3, 0xe1, + 0x9b, 0xa6, 0x5d, 0xcd, 0xb2, 0xc5, 0xab, 0xc4, 0xa0, 0x5b, 0xc2, 0xbe, 0x37, 0x60, + 0xc5, 0x8a, 0xe1, 0x9a, 0xbb, 0xc9, 0x82, 0xc5, 0xbd, 0xe1, 0x9b, 0xa0, 0xc3, 0x80, + 0xc7, 0xb0, 0xc7, 0xa7, 0xe1, 0x9b, 0xaf, 0x70, 0xc5, 0x98, 0xc4, 0x80, 0x5b, 0xc2, + 0xb1, 0xe2, 0xb1, 0xab, 0xc3, 0x8b, 0xc4, 0xa3, 0x2f, 0xc6, 0x9a, 0xc5, 0x84, 0x63, + 0xc3, 0xaf, 0xc3, 0x87, 0xe1, 0x9b, 0xa0, 0xc3, 0x82, 0x73, 0xc4, 0x98, 0xe1, 0x9b, + 0x91, 0xe1, 0x9a, 0xac, 0x76, 0xc9, 0x87, 0xc7, 0xa8, 0xc4, 0x90, 0xc2, 0xb1, 0x2e, + 0x4b, 0xc8, 0x8b, 0x58, 0xc8, 0xb1, 0xe1, 0x9a, 0xbf, 0xc8, 0xa2, 0xc6, 0x9f, 0xc4, + 0xab, 0xc4, 0xbf, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0xa8, 0xce, 0x8c, 0xc5, 0xab, 0xc3, + 0x85, 0x75, 0xc3, 0xa7, 0xc7, 0xbc, 0xc7, 0xa5, 0xe2, 0xb1, 0xba, 0xc5, 0xad, 0x6b, + 0xc8, 0xbc, 0xc6, 0xb0, 0xc5, 0xa0, 0xc4, 0x8f, 0xc7, 0xbd, 0xe1, 0x9a, 0xa2, 0xc5, + 0x90, 0xc6, 0xa2, 0xc9, 0x84, 0xc6, 0xab, 0xc7, 0xb2, 0x7c, 0xc5, 0x86, 0x40, 0x3b, + 0xc3, 0x8f, 0xe1, 0x9a, 0xb4, 0xe2, 0xb1, 0xae, 0xc2, 0xb0, 0xc5, 0x90, 0xe2, 0xb1, + 0xad, 0xc3, 0x85, 0xcd, 0xba, 0xc3, 0x9d, 0xe1, 0x9b, 0xab, 0xe1, 0x9a, 0xbd, 0xc6, + 0xb8, 0xc6, 0xab, 0xc3, 0xb0, 0xc9, 0x87, 0xc5, 0xb0, 0xc2, 0xaa, 0xc8, 0x99, 0xc6, + 0x80, 0xc9, 0x84, 0xc4, 0xb6, 0xe1, 0x9b, 0x82, 0xc6, 0xa9, 0xc5, 0xac, 0x76, 0xce, + 0x85, 0xc6, 0xa9, 0xe1, 0x9b, 0xa5, 0xc3, 0xac, 0xc4, 0xa0, 0xe1, 0x9a, 0xa7, 0xc2, + 0xae, 0xc3, 0xb2, 0xc3, 0x83, 0xc6, 0xaa, 0xc5, 0x88, 0xe1, 0x9a, 0xab, 0xc4, 0x81, + 0xc4, 0x98, 0xc4, 0xa3, 0x62, 0x7d, 0xc6, 0x84, 0xc8, 0x85, 0xc5, 0x96, 0xc4, 0xad, + 0xe2, 0xb1, 0xbd, 0x34, 0xc6, 0x9c, 0x5a, 0x5a, + ], + asset_base: [ + 0x19, 0x8f, 0x36, 0xf8, 0x2b, 0xca, 0x02, 0x8c, 0x9f, 0x8d, 0x8d, 0x20, 0x9f, 0x4c, + 0x4a, 0xf6, 0xd1, 0x44, 0x90, 0x5e, 0xbb, 0x17, 0xda, 0xf4, 0x15, 0xd3, 0x1d, 0x4a, + 0xf3, 0x7c, 0x46, 0x2e, + ], + }, + TestVector { + key: [ + 0x28, 0x37, 0xcd, 0x45, 0x6e, 0x33, 0x19, 0x9f, 0x05, 0xb5, 0xd9, 0x0a, 0x42, 0xa7, + 0xb3, 0xd7, 0x13, 0xac, 0xd4, 0xec, 0xe6, 0xfe, 0x32, 0xdf, 0x77, 0xcb, 0x17, 0x00, + 0x43, 0xa2, 0xfa, 0xc6, + ], + description: [ + 0xc2, 0xb0, 0x5d, 0x32, 0xc3, 0x9a, 0xc3, 0x98, 0xc4, 0x88, 0xc5, 0x8f, 0xc4, 0xa4, + 0xc3, 0x81, 0xc7, 0x91, 0xe1, 0x9b, 0x9e, 0xc8, 0x9e, 0xc4, 0x86, 0xe1, 0x9b, 0xa6, + 0xc8, 0x89, 0xc8, 0x84, 0xce, 0x8c, 0xc9, 0x83, 0xe2, 0xb1, 0xac, 0xcd, 0xb2, 0xc3, + 0xb8, 0xc8, 0x81, 0x65, 0xc3, 0x82, 0xc3, 0x93, 0xc4, 0x81, 0x7e, 0xe1, 0x9a, 0xb0, + 0xc5, 0x82, 0xc9, 0x8f, 0xc4, 0xb9, 0xc3, 0xbe, 0xc8, 0x8d, 0xc7, 0xab, 0xce, 0x8c, + 0xe1, 0x9a, 0xb5, 0xc7, 0x8d, 0xc7, 0x87, 0xc7, 0xba, 0xc6, 0xa2, 0xc4, 0xa3, 0xc7, + 0x93, 0xc8, 0xa8, 0xc3, 0x90, 0xc2, 0xaa, 0x5f, 0xc7, 0xbb, 0xc3, 0xad, 0xe1, 0x9a, + 0xa1, 0xc8, 0xa7, 0xc3, 0xaa, 0x7e, 0xc3, 0xaa, 0xe2, 0xb1, 0xa0, 0xcd, 0xb1, 0xc4, + 0xa9, 0xc5, 0x98, 0x75, 0xc8, 0xa3, 0x5b, 0x2c, 0x44, 0xe2, 0xb1, 0xb4, 0xc6, 0x92, + 0xc3, 0x95, 0xc5, 0x8e, 0xc8, 0xa6, 0xc8, 0xb8, 0xc9, 0x82, 0xc7, 0x87, 0xc5, 0xa7, + 0xc8, 0x9f, 0x50, 0xc5, 0x9b, 0xc4, 0x9e, 0x56, 0x7c, 0xc5, 0xba, 0xc3, 0x85, 0xe1, + 0x9b, 0x8d, 0xe1, 0x9a, 0xbf, 0xc7, 0xaf, 0xc4, 0x89, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, + 0x95, 0xc8, 0xa8, 0xc6, 0xad, 0xe1, 0x9b, 0x80, 0xc7, 0x8d, 0x31, 0xc5, 0x83, 0xcd, + 0xb7, 0xc4, 0x9f, 0xc3, 0xa8, 0xc6, 0xa0, 0xe1, 0x9a, 0xa9, 0xc6, 0x8a, 0xc4, 0x9f, + 0x57, 0xc8, 0xaf, 0xc7, 0xa7, 0xe1, 0x9b, 0x9f, 0xc6, 0x88, 0xc8, 0xa4, 0xe2, 0xb1, + 0xbd, 0x3d, 0xc4, 0x83, 0xe1, 0x9b, 0xa1, 0x59, 0xe1, 0x9b, 0x94, 0x7c, 0x2b, 0xe1, + 0x9b, 0x86, 0xe1, 0x9a, 0xbb, 0xc7, 0xb7, 0xc9, 0x86, 0xc7, 0x9e, 0xc5, 0x82, 0xe2, + 0xb1, 0xb7, 0xc3, 0x98, 0xc5, 0xb9, 0xc3, 0xbe, 0xe1, 0x9b, 0x93, 0xc9, 0x87, 0xc7, + 0x92, 0xc9, 0x83, 0xc8, 0x8e, 0x30, 0xe1, 0x9b, 0x98, 0xc5, 0xba, 0xc6, 0x8a, 0x39, + 0x59, 0xc5, 0x96, 0xc4, 0x9f, 0xc7, 0x82, 0xe1, 0x9a, 0xb4, 0xc9, 0x8b, 0xc5, 0xbc, + 0xc3, 0xa6, 0xc8, 0x95, 0xc6, 0xa1, 0xc4, 0xba, 0xc6, 0xb0, 0xc5, 0xba, 0x7b, 0xc4, + 0x85, 0xc5, 0xb7, 0xc4, 0x85, 0xc7, 0x93, 0xc3, 0x8d, 0xc5, 0x85, 0xc7, 0xad, 0xc5, + 0x9e, 0xc4, 0xbc, 0xc2, 0xa4, 0xe1, 0x9b, 0x87, 0xc2, 0xab, 0xc8, 0xb1, 0xc6, 0x87, + 0x77, 0xc6, 0xb8, 0xc5, 0x85, 0xc4, 0x8c, 0xc7, 0xa3, 0xc3, 0x85, 0xc2, 0xb8, 0x42, + 0xc7, 0xa7, 0xce, 0x88, 0xe1, 0x9a, 0xaa, 0xe2, 0xb1, 0xa3, 0xe1, 0x9b, 0x9d, 0xe1, + 0x9b, 0xa6, 0xc6, 0xa4, 0xc7, 0x87, 0xc6, 0x81, 0xc4, 0x84, 0xc4, 0xae, 0xc9, 0x86, + 0xe2, 0xb1, 0xa8, 0xc2, 0xbc, 0xc4, 0x93, 0xe1, 0x9b, 0x88, 0xc7, 0x81, 0xc2, 0xa3, + 0xc4, 0xbf, 0xc7, 0x9d, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0xa1, 0xe1, 0x9a, 0xb1, 0xc8, + 0xb3, 0xc2, 0xb9, 0xe1, 0x9b, 0x9c, 0x37, 0x64, 0xc3, 0xbf, 0xe2, 0xb1, 0xb0, 0x42, + 0xc8, 0xae, 0x7e, 0xc7, 0x92, 0xc4, 0xbd, 0xc6, 0x98, 0xc3, 0xab, 0xc3, 0x9d, 0xc4, + 0xa4, 0xc5, 0x99, 0xc5, 0x84, 0xc3, 0xba, 0xc7, 0xa0, 0xc6, 0x92, 0xc8, 0xad, 0xc5, + 0xb8, 0xc4, 0xb6, 0xc7, 0x90, 0xc6, 0xa3, 0xc3, 0xab, 0xc3, 0x95, 0xc4, 0x91, 0xce, + 0x84, 0x30, 0xc4, 0xb5, 0xc7, 0x9a, 0xc6, 0x92, 0xc2, 0xba, 0xc3, 0x9e, 0xc7, 0x99, + 0xc4, 0x8d, 0xc3, 0x85, 0xc6, 0x87, 0xc7, 0x86, 0xc6, 0x82, 0xc6, 0x8a, 0x26, 0xc4, + 0x8b, 0xc4, 0xbe, 0x7c, 0x58, 0xc8, 0xa6, 0xc4, 0xab, 0xc4, 0xbe, 0xce, 0x8a, 0xc4, + 0xb7, 0xc3, 0xb9, 0xc5, 0x94, 0xe1, 0x9b, 0x9a, 0xc8, 0xbf, 0xc7, 0xa6, 0xc5, 0xbd, + 0xc4, 0xa8, 0xc5, 0x8f, 0xc5, 0xa3, 0xcd, 0xb4, + ], + asset_base: [ + 0x9a, 0xcc, 0xb2, 0xc5, 0xad, 0xae, 0x30, 0xab, 0xdb, 0x76, 0x58, 0x9d, 0xec, 0xdd, + 0x71, 0xe4, 0x65, 0x75, 0x53, 0x8d, 0x80, 0x3c, 0x28, 0xd7, 0xe4, 0xb8, 0x89, 0x6a, + 0xd7, 0xfd, 0xc6, 0x87, + ], + }, + TestVector { + key: [ + 0x0a, 0xbb, 0x5f, 0xa5, 0xab, 0x94, 0x0d, 0x29, 0x57, 0x4b, 0x95, 0x15, 0x9c, 0x40, + 0xbd, 0x79, 0x43, 0x44, 0xea, 0x07, 0xa8, 0x7e, 0x0f, 0x0f, 0x5f, 0xac, 0xa5, 0xb4, + 0x31, 0x81, 0x6d, 0xe2, + ], + description: [ + 0xcd, 0xbd, 0xe1, 0x9a, 0xb4, 0xc8, 0x9c, 0xc8, 0x96, 0xc6, 0xaa, 0xce, 0x88, 0xe1, + 0x9a, 0xb4, 0x2d, 0xc6, 0x81, 0xc7, 0x86, 0xc7, 0x9d, 0xc5, 0x86, 0xc4, 0x84, 0xe1, + 0x9b, 0x9e, 0xc6, 0x91, 0xe1, 0x9b, 0x89, 0x2d, 0xc4, 0x81, 0xc6, 0x88, 0x4c, 0xc2, + 0xbf, 0xc2, 0xaa, 0xc3, 0xb4, 0xc8, 0xae, 0xc7, 0x91, 0xc2, 0xb0, 0xc5, 0xa5, 0xc6, + 0xa3, 0xc4, 0x94, 0x38, 0xe1, 0x9a, 0xa9, 0xc4, 0xbe, 0xc3, 0x81, 0xe2, 0xb1, 0xba, + 0xc5, 0xa7, 0x44, 0xc3, 0xbb, 0xc8, 0x97, 0x5b, 0xc6, 0xbd, 0xc5, 0x9b, 0xe2, 0xb1, + 0xa0, 0xe1, 0x9a, 0xbd, 0xc2, 0xbf, 0xc3, 0x94, 0xc2, 0xb0, 0xc4, 0x9c, 0xc6, 0xa1, + 0xc3, 0xb6, 0xc2, 0xac, 0xe1, 0x9a, 0xa9, 0xc6, 0x90, 0x5c, 0xe2, 0xb1, 0xb2, 0x7c, + 0xc3, 0x86, 0x57, 0xe1, 0x9a, 0xa4, 0x71, 0xc7, 0x91, 0xe2, 0xb1, 0xbc, 0xc7, 0xab, + 0xc4, 0x86, 0xc5, 0xa1, 0xc5, 0x92, 0xc6, 0xa9, 0x78, 0x7a, 0xcd, 0xbd, 0xc4, 0xb2, + 0x75, 0xc8, 0xa4, 0x29, 0xc6, 0x9e, 0xc7, 0xa0, 0xc7, 0xa8, 0xc3, 0xa5, 0xc4, 0xb6, + 0xe1, 0x9b, 0x9d, 0x45, 0xc3, 0xa1, 0xc9, 0x8b, 0xc3, 0xbb, 0xc8, 0x86, 0xc7, 0x83, + 0xe1, 0x9b, 0x93, 0xc8, 0x9c, 0xc5, 0xba, 0xc7, 0xa8, 0xc7, 0x8d, 0xe1, 0x9a, 0xbf, + 0xcd, 0xb7, 0xc5, 0x91, 0xc4, 0x8f, 0x65, 0xc3, 0xa4, 0xc2, 0xb4, 0xe2, 0xb1, 0xb0, + 0xc8, 0xa9, 0xc8, 0xb1, 0xe1, 0x9b, 0x86, 0xc8, 0x85, 0xc4, 0x8d, 0xe1, 0x9a, 0xaf, + 0xe1, 0x9b, 0x81, 0xc3, 0xae, 0xc4, 0x90, 0xc8, 0xbb, 0x2a, 0xe1, 0x9a, 0xae, 0xc6, + 0xa3, 0xc4, 0xae, 0xc4, 0x93, 0x7b, 0xc7, 0x8e, 0xc8, 0x9c, 0xc3, 0xa3, 0xc5, 0xac, + 0xcd, 0xb7, 0x41, 0xc5, 0xb5, 0xc4, 0x95, 0xc3, 0x92, 0xc6, 0xaa, 0xe1, 0x9b, 0x83, + 0xe2, 0xb1, 0xb2, 0xe1, 0x9a, 0xbc, 0xc7, 0x87, 0xc7, 0xb7, 0xc5, 0x97, 0xc2, 0xb9, + 0x55, 0xe1, 0x9b, 0x91, 0x45, 0xc8, 0x8b, 0xe1, 0x9a, 0xa9, 0xe1, 0x9a, 0xad, 0xc6, + 0xab, 0xcd, 0xbd, 0xc8, 0xa2, 0xc3, 0x8c, 0x23, 0xe2, 0xb1, 0xa9, 0xe1, 0x9b, 0x8c, + 0xe1, 0x9a, 0xb7, 0xc6, 0x84, 0xc3, 0xa6, 0xc8, 0xb2, 0xc5, 0xbe, 0xc7, 0xbe, 0xe1, + 0x9a, 0xaa, 0xc3, 0xb1, 0xc6, 0xb3, 0xe1, 0x9a, 0xbe, 0xc4, 0xa0, 0xc2, 0xb9, 0x37, + 0xc5, 0x82, 0xc5, 0xbf, 0xc8, 0xa9, 0x44, 0xe1, 0x9b, 0x8d, 0xe1, 0x9b, 0x9c, 0xe1, + 0x9b, 0xa6, 0xe1, 0x9b, 0x87, 0xe2, 0xb1, 0xaa, 0xc7, 0xab, 0xc7, 0xaf, 0xc7, 0x91, + 0xe2, 0xb1, 0xbf, 0xe1, 0x9a, 0xb9, 0xe1, 0x9b, 0x87, 0xc6, 0xb6, 0xc5, 0xa3, 0xc7, + 0x98, 0xc5, 0x90, 0xc8, 0x9b, 0xcd, 0xb2, 0xc4, 0x97, 0x7b, 0xe1, 0x9b, 0x96, 0xc3, + 0xa2, 0x6e, 0xc8, 0x90, 0x6f, 0xc6, 0x9e, 0xc9, 0x87, 0x6e, 0xc8, 0x82, 0xc4, 0x97, + 0xc3, 0xb0, 0xc4, 0x8d, 0xe2, 0xb1, 0xb6, 0xc7, 0x9b, 0xc3, 0x9a, 0xc8, 0xb5, 0xc6, + 0x95, 0xc3, 0xb6, 0x44, 0xc3, 0xac, 0xc5, 0x90, 0xe1, 0x9b, 0xa0, 0xc8, 0x92, 0x5d, + 0xc5, 0xad, 0xe1, 0x9b, 0xab, 0x7b, 0xc4, 0x97, 0xc7, 0xac, 0xe1, 0x9a, 0xb2, 0x2e, + 0xc3, 0xa8, 0xc6, 0xbc, 0x40, 0x23, 0xc6, 0xbf, 0x55, 0xc6, 0x82, 0xc7, 0x8a, 0x65, + 0xe1, 0x9b, 0x9b, 0xc3, 0xbc, 0xe2, 0xb1, 0xbd, 0x4b, 0xe2, 0xb1, 0xa7, 0xc6, 0x8d, + 0xc7, 0xae, 0xc3, 0x83, 0xc7, 0xb9, 0x64, 0xc6, 0xa6, 0xc8, 0x82, 0xc8, 0x9d, 0xc8, + 0x9f, 0xc8, 0xb2, 0xc6, 0x8c, 0xe2, 0xb1, 0xb8, 0xe1, 0x9b, 0xab, 0xc7, 0x9d, 0xc8, + 0xb5, 0xc5, 0xab, 0xcd, 0xba, 0x45, 0xe1, 0x9a, 0xab, 0xc3, 0x93, 0x37, 0xc2, 0xb8, + 0xc9, 0x8d, 0xc9, 0x88, 0xe1, 0x9b, 0x93, 0x5a, + ], + asset_base: [ + 0x1a, 0x28, 0x12, 0x59, 0x8b, 0xa7, 0x5c, 0x9a, 0x69, 0x2e, 0x69, 0x19, 0x65, 0x7f, + 0x68, 0x3e, 0xa4, 0x52, 0xe1, 0xae, 0x66, 0x33, 0xba, 0xcf, 0xe1, 0xf4, 0x54, 0x55, + 0x04, 0xc2, 0x95, 0xb4, + ], + }, + TestVector { + key: [ + 0x07, 0x82, 0x6a, 0x86, 0xb1, 0x72, 0xc5, 0x5a, 0x66, 0x40, 0x1e, 0x37, 0xfc, 0x69, + 0xf9, 0x2e, 0x6d, 0x62, 0xa0, 0x14, 0x6c, 0x67, 0x06, 0x29, 0xa2, 0xd6, 0x51, 0x34, + 0xdf, 0x3b, 0x22, 0xf6, + ], + description: [ + 0xc6, 0xbe, 0xc3, 0x90, 0xc3, 0x92, 0xc4, 0x97, 0x7e, 0xc6, 0x81, 0x34, 0xe1, 0x9b, + 0x86, 0xc8, 0x8e, 0x7e, 0xcd, 0xb4, 0xc6, 0x90, 0x7b, 0xc4, 0xae, 0xc7, 0x8a, 0xcd, + 0xbd, 0xc5, 0x98, 0xc5, 0xa2, 0xc2, 0xb7, 0x6a, 0xc5, 0x82, 0xc5, 0xac, 0xc2, 0xbf, + 0xc7, 0x83, 0x33, 0xe1, 0x9b, 0x87, 0xc5, 0xb8, 0xc8, 0xb7, 0xc5, 0xaa, 0xc5, 0xb1, + 0xc8, 0xbd, 0x47, 0x58, 0xc5, 0x90, 0xc6, 0x91, 0xc5, 0x89, 0x24, 0xc4, 0xbf, 0xc4, + 0x80, 0xc3, 0xa7, 0xc8, 0xaa, 0x69, 0x6e, 0xe1, 0x9b, 0xa0, 0xc2, 0xa1, 0x42, 0xc6, + 0x96, 0xc3, 0x9b, 0x76, 0x24, 0xcd, 0xbb, 0xc6, 0xaf, 0x52, 0x24, 0xc4, 0xa0, 0xe1, + 0x9b, 0x82, 0xc5, 0x82, 0xe1, 0x9b, 0x90, 0xc8, 0x92, 0xc5, 0xb1, 0xe2, 0xb1, 0xbd, + 0xc2, 0xb7, 0xc4, 0xa6, 0xce, 0x88, 0xe1, 0x9b, 0x91, 0x3e, 0x3b, 0xc8, 0x88, 0xc6, + 0xae, 0xe2, 0xb1, 0xa4, 0xc3, 0xa1, 0xc4, 0x84, 0xe1, 0x9a, 0xbd, 0xc3, 0x9c, 0xc8, + 0xa4, 0xe1, 0x9a, 0xba, 0xc7, 0xb1, 0xc2, 0xac, 0x6f, 0xc4, 0x87, 0xc8, 0xb9, 0xe1, + 0x9a, 0xae, 0xc2, 0xab, 0xc3, 0xad, 0xc3, 0xae, 0xc5, 0x8b, 0xc8, 0x9f, 0xce, 0x8c, + 0x4f, 0xc7, 0xbe, 0xc7, 0x8a, 0xc5, 0xbe, 0xc7, 0x92, 0xe1, 0x9b, 0x9d, 0xc5, 0x95, + 0xe1, 0x9a, 0xab, 0x57, 0xe1, 0x9a, 0xb0, 0xc4, 0x9e, 0x55, 0xc6, 0x96, 0xc4, 0xb2, + 0x29, 0xc9, 0x81, 0xc4, 0xa6, 0xc7, 0xa3, 0xc4, 0x91, 0xc6, 0x96, 0xc7, 0x80, 0xc7, + 0xb6, 0xe1, 0x9b, 0x8c, 0xc3, 0x9f, 0xc5, 0x92, 0xc8, 0x90, 0x72, 0xc6, 0x99, 0xe1, + 0x9a, 0xa3, 0x7e, 0xc3, 0xa6, 0x58, 0xc8, 0xb6, 0x6c, 0xc8, 0xb0, 0xc3, 0xbb, 0xe1, + 0x9a, 0xa4, 0xc2, 0xa5, 0xc3, 0x94, 0xcd, 0xb4, 0xc3, 0xb7, 0xc6, 0xa7, 0xc2, 0xaf, + 0xc4, 0xae, 0xc3, 0xa5, 0xe2, 0xb1, 0xb7, 0xe1, 0x9b, 0x86, 0x5d, 0xc5, 0x80, 0x3f, + 0xc6, 0x92, 0xc8, 0x8e, 0xc6, 0xb4, 0xc7, 0xac, 0xc6, 0xb4, 0xc3, 0xab, 0xc9, 0x8b, + 0xc4, 0x90, 0xe2, 0xb1, 0xa7, 0xc4, 0x96, 0xc4, 0x9a, 0xc8, 0xbd, 0xce, 0x87, 0xc6, + 0xaf, 0xc7, 0x83, 0x3c, 0xe1, 0x9b, 0xa2, 0xc2, 0xb4, 0xc4, 0x9d, 0x4d, 0xc3, 0x8a, + 0xc3, 0xa8, 0xc6, 0x93, 0x28, 0xc7, 0xbc, 0xc6, 0x9f, 0xe1, 0x9a, 0xa4, 0xc7, 0x8a, + 0xc7, 0xbd, 0xc3, 0x87, 0xe2, 0xb1, 0xb7, 0xc6, 0xac, 0xe1, 0x9b, 0x92, 0xc4, 0xa6, + 0xc5, 0x84, 0x3a, 0xc9, 0x8c, 0xc9, 0x8a, 0xc2, 0xa2, 0xc4, 0xae, 0xe1, 0x9a, 0xa8, + 0xc8, 0xa6, 0xc2, 0xbb, 0xe2, 0xb1, 0xa0, 0xc8, 0xab, 0xc7, 0x8a, 0xc7, 0x8a, 0xe1, + 0x9b, 0x97, 0xc4, 0x89, 0xc8, 0x9a, 0xe1, 0x9b, 0x91, 0xe1, 0x9b, 0x8b, 0x5c, 0xe1, + 0x9b, 0xa6, 0xc8, 0xa9, 0xc9, 0x80, 0x71, 0xc5, 0x95, 0xc8, 0xbd, 0xc5, 0x8f, 0xc5, + 0xa4, 0xc3, 0xb7, 0xc6, 0x85, 0xe1, 0x9a, 0xa9, 0xc6, 0xa2, 0xc8, 0xaa, 0xc7, 0x8c, + 0xc6, 0x9a, 0xc7, 0x81, 0xc3, 0xa0, 0xc4, 0xab, 0xc8, 0xa2, 0xc5, 0x9b, 0xc5, 0xbb, + 0xc7, 0x8e, 0xc6, 0x95, 0xc8, 0x9c, 0x6c, 0xc8, 0xbc, 0xe2, 0xb1, 0xaa, 0xc5, 0x85, + 0xc6, 0x83, 0xc4, 0xa1, 0xc4, 0x81, 0x4d, 0xe1, 0x9a, 0xa3, 0x5d, 0xc3, 0xb7, 0xc5, + 0xa4, 0xc6, 0xae, 0xe1, 0x9a, 0xad, 0xc4, 0xa4, 0xc3, 0xb8, 0xc3, 0xa7, 0x44, 0xc6, + 0xaa, 0xc7, 0xa5, 0xc4, 0xa4, 0xc5, 0xba, 0xc9, 0x85, 0xc3, 0xa6, 0xc3, 0x9d, 0xc4, + 0xa3, 0xc5, 0x97, 0xe1, 0x9a, 0xa1, 0x2d, 0x77, 0xc2, 0xa2, 0x3e, 0xc8, 0x8d, 0xc5, + 0xb1, 0xe1, 0x9a, 0xa9, 0xc6, 0xa2, 0xc5, 0xbf, 0xc7, 0xa4, 0xe1, 0x9a, 0xa9, 0xc6, + 0x82, 0xc3, 0xbb, 0xc3, 0xb9, 0xc6, 0x8a, 0x5a, + ], + asset_base: [ + 0x9f, 0x0a, 0x47, 0x16, 0x90, 0xe2, 0x1a, 0x74, 0x79, 0x7a, 0x71, 0x12, 0x36, 0xfa, + 0x58, 0x85, 0x5e, 0x6e, 0xd1, 0xaa, 0xd5, 0x4c, 0x6c, 0xaf, 0xa8, 0xa3, 0x7f, 0xdb, + 0xd1, 0x9e, 0x75, 0x00, + ], + }, + TestVector { + key: [ + 0xe5, 0x21, 0x62, 0x0d, 0x68, 0x53, 0x7c, 0xa3, 0x0b, 0xf3, 0x2f, 0x4e, 0xd2, 0xc3, + 0x3c, 0x0c, 0xf8, 0x25, 0x2a, 0x79, 0xa8, 0xa7, 0x39, 0x7b, 0xf1, 0x1b, 0x67, 0x87, + 0x30, 0x52, 0x44, 0xee, + ], + description: [ + 0xcd, 0xb4, 0xc6, 0x92, 0xc4, 0xa7, 0xc3, 0xb9, 0xc6, 0xb8, 0xcd, 0xba, 0xc4, 0xa4, + 0xc8, 0x9a, 0xc8, 0xb7, 0xe1, 0x9b, 0x92, 0xc5, 0xb2, 0xc7, 0xba, 0xc6, 0x86, 0xc8, + 0x87, 0xc5, 0x88, 0xc5, 0x87, 0xc7, 0xa0, 0xc8, 0x97, 0xc6, 0xad, 0x4e, 0xc4, 0xa4, + 0xc5, 0x9c, 0xc8, 0x89, 0xc5, 0xba, 0xc3, 0xa1, 0xc8, 0xa2, 0xc3, 0x9c, 0xc8, 0x88, + 0xe1, 0x9a, 0xa1, 0xc8, 0x9d, 0xc7, 0x8b, 0xc6, 0xb5, 0xc3, 0x87, 0xc3, 0x93, 0xc4, + 0xa3, 0xe2, 0xb1, 0xa2, 0x7b, 0xc9, 0x85, 0xc3, 0xb9, 0x3a, 0xc6, 0x86, 0xc3, 0x99, + 0xc7, 0xa2, 0xc7, 0x83, 0xce, 0x8a, 0xc7, 0xbd, 0xe1, 0x9b, 0xa7, 0xc8, 0xa9, 0xe2, + 0xb1, 0xb1, 0xc6, 0x9d, 0xc5, 0xbb, 0xc7, 0x98, 0xc6, 0x8a, 0xc6, 0x8d, 0xc5, 0xa2, + 0xc9, 0x89, 0xc3, 0xa3, 0x57, 0xc8, 0xa8, 0x66, 0xc7, 0x95, 0xc6, 0x86, 0xc4, 0xa2, + 0x79, 0xc8, 0x98, 0xc7, 0xa8, 0xc7, 0x86, 0xc6, 0xb4, 0xcd, 0xb6, 0xe1, 0x9a, 0xb2, + 0xc3, 0x9e, 0xc2, 0xb1, 0xc7, 0xbb, 0xc6, 0xa2, 0xc7, 0xb2, 0xc5, 0xa6, 0x48, 0xc2, + 0xbf, 0xc3, 0xac, 0x53, 0xc4, 0x80, 0xc2, 0xba, 0xc2, 0xbc, 0xc7, 0xad, 0xc7, 0xa7, + 0xc6, 0xb3, 0xe1, 0x9a, 0xad, 0xc8, 0x90, 0xe2, 0xb1, 0xaa, 0x31, 0xc5, 0xb9, 0xc5, + 0xbe, 0xe1, 0x9a, 0xb9, 0xc2, 0xb7, 0xc6, 0x91, 0xc3, 0xad, 0x7c, 0xc3, 0xa6, 0xc3, + 0x95, 0xc5, 0x8c, 0xc3, 0xb9, 0xc6, 0xa7, 0xc4, 0x9e, 0x7d, 0xce, 0x8c, 0x2e, 0xc7, + 0x97, 0xc6, 0x9b, 0x26, 0xc6, 0xa8, 0x7c, 0xc7, 0xa2, 0x4d, 0xc8, 0x9d, 0xc5, 0x8c, + 0xe2, 0xb1, 0xa5, 0xc7, 0xae, 0xc4, 0xbe, 0xe1, 0x9b, 0xa6, 0xc2, 0xae, 0xe2, 0xb1, + 0xaf, 0xc5, 0xb9, 0xc7, 0x87, 0x66, 0x5c, 0x53, 0xe2, 0xb1, 0xb1, 0xc8, 0xbf, 0xc5, + 0x8a, 0xc3, 0xa8, 0x21, 0xc3, 0x8c, 0xc4, 0x99, 0xc3, 0xba, 0xcd, 0xbe, 0xc8, 0xa6, + 0xc3, 0xbe, 0xc8, 0x90, 0xc4, 0x9d, 0xc4, 0x94, 0xc3, 0xbf, 0xc3, 0x9a, 0xe1, 0x9b, + 0x83, 0xc4, 0xb9, 0xc2, 0xa6, 0xc8, 0x8d, 0xc6, 0x82, 0xe1, 0x9a, 0xb0, 0xc6, 0x9b, + 0x31, 0xe1, 0x9b, 0x97, 0xc6, 0x91, 0xc3, 0x83, 0xc6, 0x9c, 0x4d, 0xc3, 0xb7, 0xc7, + 0x99, 0xe1, 0x9a, 0xac, 0xc2, 0xa3, 0xc6, 0xad, 0xc4, 0xb4, 0xc3, 0xa6, 0xe2, 0xb1, + 0xb2, 0x26, 0xc4, 0x84, 0xc7, 0x92, 0xc8, 0x8d, 0xc5, 0x93, 0x30, 0xc4, 0x94, 0xc5, + 0x88, 0xc5, 0xa1, 0xc2, 0xa1, 0xc7, 0x9f, 0xc4, 0xbb, 0xc7, 0x99, 0xc6, 0xac, 0xc6, + 0xa7, 0xc9, 0x87, 0x2b, 0xc6, 0x99, 0xce, 0x85, 0xe1, 0x9b, 0x9d, 0xc3, 0x90, 0xe1, + 0x9a, 0xad, 0xe1, 0x9b, 0x94, 0xc3, 0x97, 0xc4, 0x84, 0xc4, 0x9c, 0xc7, 0x84, 0xc3, + 0x8f, 0x79, 0xc5, 0xa1, 0xc8, 0x98, 0xc5, 0xa9, 0x64, 0xc3, 0xa9, 0x4d, 0xc4, 0x9c, + 0xc6, 0xba, 0xe2, 0xb1, 0xb8, 0xc5, 0xbe, 0xe2, 0xb1, 0xbf, 0xc3, 0x88, 0xc5, 0x81, + 0xc3, 0xbc, 0xc9, 0x84, 0xc6, 0xbb, 0xc6, 0xa3, 0xe1, 0x9b, 0x8c, 0x34, 0xc3, 0x85, + 0x78, 0xc8, 0xb8, 0xc2, 0xa4, 0xc5, 0xb2, 0xc6, 0x82, 0x40, 0xc6, 0xa3, 0xc3, 0xb0, + 0xc6, 0xb3, 0x72, 0xc2, 0xa1, 0xc6, 0x92, 0xc7, 0xa2, 0xe2, 0xb1, 0xa5, 0xc9, 0x8a, + 0xe2, 0xb1, 0xbb, 0xc2, 0xb5, 0xe2, 0xb1, 0xb0, 0xc4, 0x88, 0xc3, 0x95, 0xc6, 0xb2, + 0xc7, 0x9d, 0xc7, 0x96, 0xe2, 0xb1, 0xaa, 0x67, 0xc3, 0xa3, 0xc4, 0xbf, 0xc9, 0x8b, + 0xc4, 0xb9, 0xc4, 0xa8, 0xe2, 0xb1, 0xad, 0x41, 0xc3, 0xb4, 0xce, 0x86, 0xc4, 0xbe, + 0xc6, 0xa8, 0xe2, 0xb1, 0xa4, 0xc5, 0xbc, 0xc8, 0x94, 0xe1, 0x9b, 0x8b, 0xc5, 0x81, + 0xe1, 0x9b, 0x94, 0xc4, 0xae, 0xc5, 0x91, 0x5a, + ], + asset_base: [ + 0x6e, 0xa8, 0x83, 0xd2, 0x4d, 0x3d, 0xbc, 0xf6, 0xc7, 0xad, 0x2b, 0xf7, 0xed, 0x87, + 0xc7, 0xb5, 0xaa, 0xd2, 0x13, 0xf0, 0xcf, 0x11, 0x2b, 0xff, 0xa0, 0xc8, 0x84, 0xb1, + 0xd0, 0xe0, 0x56, 0x9a, + ], + }, + TestVector { + key: [ + 0x5e, 0x09, 0x49, 0x46, 0x12, 0x04, 0x4d, 0x6e, 0xf5, 0xb0, 0xbd, 0x0d, 0xc9, 0xb4, + 0xa0, 0xdc, 0x09, 0x47, 0x76, 0x00, 0x9e, 0x1e, 0x94, 0xce, 0x39, 0x1c, 0x27, 0xb8, + 0xb7, 0x51, 0x8f, 0xe0, + ], + description: [ + 0xc7, 0x9b, 0xc7, 0xa3, 0xc3, 0xa4, 0xc4, 0xa7, 0xe1, 0x9a, 0xa4, 0x29, 0xc9, 0x88, + 0xc3, 0xa8, 0xe1, 0x9b, 0x9c, 0x71, 0xc5, 0xaa, 0xe2, 0xb1, 0xba, 0xc8, 0xac, 0xc7, + 0xa5, 0xc8, 0x8b, 0xcd, 0xbc, 0xe1, 0x9b, 0x83, 0xc9, 0x86, 0xe1, 0x9a, 0xad, 0xc6, + 0x87, 0xc8, 0xbc, 0xc8, 0xa0, 0xc3, 0x94, 0xe1, 0x9b, 0xa5, 0xc8, 0x94, 0xc3, 0xac, + 0xc3, 0x88, 0xe1, 0x9a, 0xa8, 0xc7, 0xb9, 0x5b, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0x9f, + 0x63, 0xc6, 0x95, 0xcd, 0xb3, 0xc3, 0x8d, 0xc6, 0x88, 0xc2, 0xaf, 0xc4, 0x93, 0x64, + 0xc6, 0x89, 0xc8, 0xa0, 0x5b, 0xc8, 0x8b, 0xc6, 0xb7, 0xe1, 0x9b, 0xa0, 0x4c, 0x31, + 0x31, 0xc3, 0x82, 0xc7, 0xa5, 0xc9, 0x8e, 0xc9, 0x8f, 0xe1, 0x9b, 0x93, 0xc7, 0x80, + 0xc4, 0x80, 0xc3, 0xb2, 0xc3, 0x88, 0xe2, 0xb1, 0xb9, 0xc8, 0xab, 0xcd, 0xbb, 0xc3, + 0x8c, 0xc9, 0x87, 0xe1, 0x9a, 0xaf, 0xc8, 0xa9, 0xc9, 0x84, 0xc4, 0x8b, 0xe1, 0x9b, + 0x90, 0xc7, 0xb2, 0xc5, 0xaa, 0xc6, 0x9d, 0xc8, 0xb3, 0xe1, 0x9b, 0x9f, 0xc2, 0xa6, + 0xc5, 0xba, 0xe1, 0x9b, 0xa4, 0xc4, 0x8a, 0x4f, 0xc3, 0x85, 0xc5, 0x9d, 0x5f, 0xc8, + 0xbf, 0x6d, 0x41, 0xc7, 0x8b, 0xe1, 0x9a, 0xb3, 0xc7, 0xb3, 0xc4, 0x89, 0xc6, 0xaf, + 0xc6, 0xb7, 0xc3, 0x8f, 0xc5, 0x9d, 0xc8, 0x82, 0xc8, 0x82, 0xc6, 0xb6, 0xc3, 0xbf, + 0xc8, 0xa4, 0xc6, 0xab, 0x5e, 0xc3, 0x9a, 0xc5, 0xa0, 0xe2, 0xb1, 0xb0, 0xc3, 0x90, + 0xc8, 0x99, 0xc5, 0xac, 0xe1, 0x9a, 0xa6, 0xc3, 0x95, 0xcd, 0xb4, 0xcd, 0xb3, 0xc6, + 0x9f, 0xc7, 0x80, 0xc8, 0xaa, 0xe1, 0x9a, 0xb7, 0xc7, 0xa6, 0x2c, 0xc5, 0x83, 0xc8, + 0xbe, 0xc8, 0x93, 0xc4, 0xa0, 0xc3, 0x9f, 0xc5, 0xa1, 0xc5, 0x8d, 0xe1, 0x9b, 0xa5, + 0xc6, 0x99, 0x4b, 0xc4, 0xbe, 0xc8, 0x87, 0xc8, 0x92, 0xe1, 0x9b, 0xae, 0xc8, 0x86, + 0xc7, 0x90, 0xc5, 0x85, 0xc2, 0xb6, 0xc5, 0x84, 0xe1, 0x9a, 0xa5, 0xc8, 0x86, 0xc4, + 0x8d, 0xc6, 0xb9, 0xc8, 0x90, 0x25, 0xc4, 0xa9, 0xc4, 0xbb, 0xc5, 0xb0, 0xe2, 0xb1, + 0xa9, 0xe1, 0x9b, 0xad, 0x60, 0xc4, 0x9b, 0xc8, 0xab, 0xc3, 0xad, 0xc6, 0xa2, 0xc7, + 0x9d, 0xe1, 0x9b, 0x89, 0xe1, 0x9b, 0x97, 0xe1, 0x9b, 0xa6, 0x32, 0xc6, 0x99, 0xc3, + 0x9e, 0xc9, 0x8e, 0x4c, 0xe1, 0x9b, 0x93, 0xc6, 0xa4, 0xc6, 0x8c, 0xe2, 0xb1, 0xb8, + 0xc7, 0x9f, 0x2a, 0xc5, 0xa1, 0xe1, 0x9b, 0x9f, 0xcd, 0xbb, 0xc3, 0x8f, 0xc7, 0x89, + 0xc7, 0xaf, 0x5e, 0xc7, 0x8b, 0xc8, 0xa4, 0xc6, 0x81, 0xcd, 0xb3, 0xc2, 0xa9, 0xc7, + 0xae, 0xc8, 0x83, 0xc6, 0xae, 0xe1, 0x9b, 0xa3, 0xc6, 0xa3, 0xc6, 0xa0, 0xe1, 0x9a, + 0xab, 0xc8, 0xab, 0xc5, 0x9c, 0xc8, 0x94, 0xc5, 0xa8, 0xe2, 0xb1, 0xb6, 0xc4, 0xae, + 0xc6, 0xbe, 0xc7, 0xa4, 0xc7, 0x87, 0xc8, 0x9d, 0xe1, 0x9a, 0xbf, 0xc4, 0xa7, 0xc3, + 0xb3, 0xc5, 0x9e, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x9e, 0xc7, 0xad, 0x7e, 0xe1, 0x9b, + 0x93, 0xc6, 0xa8, 0xc4, 0xb5, 0xc6, 0xb1, 0xe1, 0x9b, 0xa0, 0xc4, 0xac, 0xc4, 0x91, + 0xc4, 0xbe, 0xc8, 0x89, 0x4f, 0xc6, 0xa2, 0xc5, 0xbb, 0xe1, 0x9b, 0x91, 0xc7, 0x9f, + 0xe1, 0x9b, 0xa4, 0xe1, 0x9b, 0x9a, 0xc7, 0xa9, 0xc4, 0xa6, 0xe1, 0x9b, 0x85, 0xc7, + 0xae, 0xc5, 0x91, 0xc6, 0x94, 0x42, 0x6c, 0xc4, 0xab, 0xc5, 0xa0, 0xc8, 0x89, 0xe1, + 0x9a, 0xb9, 0xc6, 0xac, 0xc6, 0xae, 0xc5, 0xa1, 0xcd, 0xb1, 0xc8, 0xb0, 0xc3, 0x84, + 0xc8, 0xbc, 0xc3, 0x9b, 0xc7, 0xbc, 0xc6, 0xbc, 0xc8, 0x82, 0xc4, 0xbf, 0xe1, 0x9b, + 0xaa, 0xc8, 0xae, 0xce, 0x85, 0xc6, 0x86, 0x4c, + ], + asset_base: [ + 0x86, 0x78, 0x20, 0x68, 0xdc, 0x11, 0xd4, 0x4f, 0xff, 0xfe, 0x8d, 0x44, 0x03, 0xad, + 0x6e, 0xf1, 0xe7, 0x7d, 0x20, 0xd2, 0x10, 0x83, 0x2e, 0x2d, 0xbf, 0x84, 0xdf, 0x09, + 0x7c, 0x87, 0x21, 0x24, + ], + }, + ] +} diff --git a/src/test_vectors/asset_id.rs b/src/test_vectors/asset_id.rs deleted file mode 100644 index 2f4f08385..000000000 --- a/src/test_vectors/asset_id.rs +++ /dev/null @@ -1,1032 +0,0 @@ -// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_asset_id) - -pub(crate) struct TestVector { - pub(crate) key: [u8; 32], - pub(crate) description: [u8; 512], - pub(crate) asset_base: [u8; 32], -} - -pub(crate) fn test_vectors() -> Vec { - vec![ - TestVector { - key: [ - 0x85, 0xc8, 0xb5, 0xcd, 0x1a, 0xc3, 0xec, 0x3a, 0xd7, 0x09, 0x21, 0x32, 0xf9, 0x7f, - 0x01, 0x78, 0xb0, 0x75, 0xc8, 0x1a, 0x13, 0x9f, 0xd4, 0x60, 0xbb, 0xe0, 0xdf, 0xcd, - 0x75, 0x51, 0x47, 0x24, - ], - description: [ - 0xe1, 0x9b, 0x91, 0xc8, 0xa3, 0xe1, 0x9b, 0x8b, 0xc7, 0xac, 0xc8, 0xa0, 0xe1, 0x9b, - 0x89, 0xc3, 0x9b, 0xe1, 0x9b, 0xaa, 0xc6, 0xa7, 0xc9, 0x8e, 0xc2, 0xa2, 0xc2, 0xb2, - 0xe1, 0x9a, 0xbb, 0xc5, 0x9f, 0xc6, 0xaa, 0xc6, 0xbf, 0x69, 0xe1, 0x9b, 0xa9, 0xe1, - 0x9a, 0xae, 0xc4, 0xab, 0xe1, 0x9b, 0xa1, 0xc9, 0x8b, 0x23, 0xe1, 0x9b, 0x8a, 0xc7, - 0xa0, 0xe1, 0x9b, 0x88, 0xc4, 0xa6, 0xe1, 0x9b, 0xad, 0xc4, 0x9a, 0xe2, 0xb1, 0xb5, - 0xc7, 0xa7, 0x51, 0x78, 0x3f, 0xc3, 0xb0, 0xc8, 0x8a, 0x45, 0xc4, 0xa5, 0xc7, 0xb4, - 0xe1, 0x9a, 0xba, 0xe2, 0xb1, 0xbe, 0x38, 0xc2, 0xaa, 0xc8, 0xbb, 0xc8, 0xb2, 0xc6, - 0x86, 0xc6, 0xaa, 0xe1, 0x9b, 0xa2, 0xc8, 0xa7, 0xc5, 0x94, 0xc4, 0xad, 0x78, 0xc5, - 0x96, 0xe1, 0x9b, 0x81, 0xc9, 0x80, 0xc3, 0x93, 0xc6, 0xbe, 0xe1, 0x9a, 0xb0, 0x6d, - 0xc5, 0x90, 0xc4, 0x8a, 0x75, 0xc7, 0xa8, 0xc4, 0xac, 0xc4, 0x92, 0xc7, 0xa4, 0xc5, - 0x99, 0x25, 0xc6, 0xa1, 0xc5, 0x87, 0xc7, 0xa3, 0xce, 0x88, 0xc7, 0x8e, 0xc5, 0x85, - 0xe1, 0x9a, 0xb5, 0xe2, 0xb1, 0xad, 0xc4, 0x82, 0xc2, 0xb7, 0xc6, 0xac, 0xe1, 0x9b, - 0x82, 0x57, 0x30, 0xc3, 0xb0, 0xc7, 0xab, 0x69, 0xe1, 0x9b, 0x82, 0xc8, 0xb6, 0xc3, - 0xae, 0xe2, 0xb1, 0xab, 0x4f, 0xe1, 0x9a, 0xb5, 0xcd, 0xb5, 0xce, 0x88, 0xc4, 0x9f, - 0xc3, 0xb7, 0xc5, 0xb9, 0xc8, 0x88, 0x2f, 0xcd, 0xb7, 0xc8, 0x8f, 0xc8, 0xa4, 0xc5, - 0x95, 0xc3, 0xbc, 0x37, 0xe2, 0xb1, 0xb3, 0xc7, 0xa1, 0xc7, 0x89, 0xc4, 0x8d, 0xc5, - 0x87, 0x5f, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x80, 0x76, 0xc7, 0xa6, 0xe2, 0xb1, 0xa2, - 0xe2, 0xb1, 0xb3, 0xc9, 0x83, 0xc3, 0xbd, 0x55, 0xe1, 0x9b, 0x84, 0xc7, 0xb6, 0xc9, - 0x8f, 0xc4, 0xa2, 0xc3, 0xbd, 0xe1, 0x9b, 0xa2, 0xc5, 0xb3, 0xc3, 0x90, 0x3d, 0xc6, - 0x8f, 0xc8, 0xbe, 0xc7, 0x99, 0xc5, 0xb4, 0xe2, 0xb1, 0xbd, 0xe2, 0xb1, 0xb4, 0xc8, - 0x9b, 0xc3, 0x81, 0xc6, 0xb0, 0x7d, 0xe2, 0xb1, 0xae, 0xc6, 0x85, 0xc5, 0x98, 0xc5, - 0x96, 0xc7, 0xb7, 0xc5, 0xa0, 0xcd, 0xbc, 0xc5, 0xa6, 0xe1, 0x9a, 0xb4, 0xc2, 0xa5, - 0xe1, 0x9b, 0xae, 0xc7, 0xbd, 0xc6, 0x9f, 0xc7, 0x81, 0xc6, 0x8e, 0x53, 0xc5, 0xb7, - 0xc2, 0xb0, 0xc7, 0xb6, 0xe1, 0x9b, 0xa6, 0xc7, 0x94, 0xe1, 0x9a, 0xa8, 0xc5, 0xa5, - 0xc8, 0xa6, 0x56, 0xc7, 0xae, 0xc6, 0x88, 0xe1, 0x9b, 0x8b, 0xc2, 0xb5, 0xe1, 0x9a, - 0xb5, 0xe1, 0x9a, 0xba, 0xe1, 0x9a, 0xa8, 0x32, 0xc2, 0xaf, 0xc6, 0xae, 0xce, 0x8a, - 0xc7, 0x92, 0xc2, 0xbf, 0xe1, 0x9b, 0x91, 0xc7, 0xb9, 0xc5, 0xa5, 0xc8, 0x95, 0xe2, - 0xb1, 0xb2, 0xc2, 0xa4, 0xc4, 0x9e, 0xc6, 0xa5, 0xc7, 0xb3, 0xc2, 0xa3, 0xe2, 0xb1, - 0xac, 0xe1, 0x9a, 0xa0, 0xc7, 0xa3, 0xcd, 0xb5, 0xc3, 0x9a, 0xc7, 0xaf, 0xc5, 0x87, - 0xe1, 0x9b, 0xa8, 0xc5, 0xaf, 0xc2, 0xbb, 0xc3, 0xae, 0xc6, 0xb9, 0xc6, 0x99, 0xc4, - 0xa7, 0xc3, 0x89, 0xe1, 0x9a, 0xbc, 0xc8, 0x95, 0xc5, 0x9e, 0xe1, 0x9a, 0xa6, 0xc4, - 0xab, 0xc8, 0x9b, 0xc5, 0xaf, 0xc3, 0x99, 0xc6, 0xaf, 0xe1, 0x9b, 0x90, 0xc8, 0xa7, - 0xc3, 0x97, 0x51, 0xc8, 0xab, 0xe2, 0xb1, 0xa2, 0x7d, 0x2c, 0x72, 0x36, 0x2b, 0xc3, - 0xb0, 0xc8, 0x8d, 0x46, 0xc5, 0x9d, 0xc4, 0xba, 0xc4, 0xa9, 0xc2, 0xa2, 0xc6, 0x9b, - 0xc3, 0xaf, 0x2f, 0xc8, 0x99, 0xe1, 0x9a, 0xb4, 0xc3, 0xba, 0xe1, 0x9b, 0x9b, 0xc2, - 0xa7, 0xc8, 0xb1, 0xe1, 0x9b, 0xae, 0xc7, 0xad, 0xe1, 0x9a, 0xaf, 0xc4, 0xbd, 0xc3, - 0x82, 0xc4, 0xaf, 0xc4, 0xb1, 0xe1, 0x9a, 0xaa, - ], - asset_base: [ - 0x64, 0x0c, 0x81, 0x73, 0x79, 0x71, 0x4a, 0xe4, 0x8a, 0xf0, 0xbb, 0x83, 0x32, 0xf2, - 0x0d, 0x57, 0x7c, 0xb2, 0x42, 0x7e, 0x8f, 0x04, 0x49, 0x18, 0xee, 0xe5, 0x76, 0x45, - 0x05, 0x09, 0x6c, 0x97, - ], - }, - TestVector { - key: [ - 0x43, 0x10, 0x6d, 0xe9, 0xa7, 0xec, 0x54, 0xdd, 0x36, 0xdf, 0xa7, 0x0b, 0xdb, 0xd9, - 0x07, 0x2d, 0xbd, 0xda, 0xb5, 0xe0, 0x66, 0xaa, 0xef, 0xfc, 0xf9, 0xbb, 0xa3, 0x20, - 0xd4, 0xff, 0xf7, 0x12, - ], - description: [ - 0xc6, 0x89, 0xc8, 0x9f, 0xc4, 0xa2, 0xe1, 0x9a, 0xb6, 0xc7, 0xa7, 0xe2, 0xb1, 0xa8, - 0xc2, 0xbc, 0xe2, 0xb1, 0xa2, 0xc3, 0x8d, 0x73, 0xc3, 0xa1, 0xc7, 0xbf, 0xc7, 0xa5, - 0xc7, 0xb3, 0xc6, 0x83, 0x7d, 0xc5, 0x85, 0x3c, 0xc8, 0x9d, 0x6a, 0x51, 0xc8, 0xac, - 0xe1, 0x9a, 0xb6, 0xce, 0x85, 0xc5, 0xbf, 0xc7, 0xb5, 0xe1, 0x9a, 0xb3, 0xc4, 0xa4, - 0xc2, 0xb9, 0x50, 0xe2, 0xb1, 0xa7, 0xc2, 0xb7, 0xc7, 0x91, 0xe1, 0x9b, 0xb0, 0xc4, - 0x8b, 0xe2, 0xb1, 0xae, 0xc3, 0x8a, 0xc4, 0x93, 0xc5, 0xac, 0xc2, 0xa2, 0xe2, 0xb1, - 0xad, 0xc3, 0x8e, 0xe1, 0x9b, 0x84, 0xc9, 0x88, 0xc5, 0xb1, 0xc4, 0xbb, 0xc4, 0x80, - 0xcd, 0xb5, 0xc5, 0xba, 0x45, 0xe1, 0x9a, 0xbe, 0xe2, 0xb1, 0xbd, 0xc9, 0x82, 0xc4, - 0xa2, 0x62, 0xc7, 0x91, 0x2e, 0xc7, 0x82, 0xc8, 0x92, 0xc8, 0x9e, 0xc7, 0x8f, 0xe1, - 0x9b, 0x9a, 0xc8, 0xa9, 0xc4, 0x9b, 0xc3, 0x9a, 0xc4, 0x9a, 0xc3, 0x8d, 0xc8, 0x88, - 0xc4, 0x8d, 0xc2, 0xa9, 0xcd, 0xbc, 0x5e, 0xc8, 0xb7, 0xcd, 0xbe, 0xc2, 0xb0, 0xe2, - 0xb1, 0xb0, 0xc3, 0xb4, 0xe1, 0x9b, 0x83, 0xc5, 0x84, 0xc7, 0x82, 0xc7, 0xb9, 0xc8, - 0xb6, 0xc9, 0x87, 0xc5, 0xbb, 0xc2, 0xb1, 0xc4, 0xaf, 0x73, 0xcd, 0xb4, 0x54, 0xc5, - 0xb6, 0xc7, 0x97, 0xc3, 0x87, 0xce, 0x87, 0xc6, 0xb3, 0x69, 0xc4, 0x84, 0xe1, 0x9b, - 0x9a, 0xc5, 0x91, 0xc7, 0x89, 0xc2, 0xa2, 0x2e, 0xc6, 0x85, 0xc5, 0x94, 0xc4, 0xbf, - 0xc3, 0xa8, 0xc6, 0xbc, 0xc7, 0x9c, 0xe2, 0xb1, 0xa5, 0x6e, 0xc6, 0xb4, 0xc8, 0xa1, - 0xc6, 0x91, 0xc6, 0x91, 0xc6, 0xa9, 0xe1, 0x9b, 0x88, 0xc7, 0x90, 0xc4, 0xb3, 0xe1, - 0x9a, 0xb9, 0xc4, 0x87, 0xc5, 0xbc, 0xe2, 0xb1, 0xae, 0xc3, 0x83, 0xe1, 0x9b, 0x9e, - 0xc5, 0x89, 0xc8, 0x9d, 0x66, 0xe2, 0xb1, 0xae, 0xc5, 0x98, 0xc4, 0xb5, 0xc8, 0x9f, - 0xc8, 0xaa, 0xc9, 0x86, 0xe1, 0x9a, 0xa3, 0xc5, 0x94, 0xc7, 0x8d, 0xc6, 0x90, 0xc7, - 0xb2, 0xc7, 0x9b, 0xc7, 0xb2, 0xc4, 0xa4, 0xc7, 0x88, 0xc8, 0xa5, 0xc6, 0x9a, 0xc4, - 0x8b, 0x39, 0xc7, 0xb8, 0x3c, 0xc8, 0xa8, 0xc6, 0x89, 0xc7, 0xb2, 0xc7, 0x98, 0xc3, - 0xb0, 0xc3, 0xb2, 0xc6, 0xa0, 0xc5, 0xa5, 0xc8, 0x90, 0x47, 0xc5, 0x9f, 0xc8, 0x8f, - 0xc7, 0x98, 0xc3, 0xb6, 0xe1, 0x9a, 0xa5, 0x2f, 0xc9, 0x89, 0xc8, 0xb0, 0xc7, 0x9f, - 0xc4, 0x80, 0xe2, 0xb1, 0xa2, 0x74, 0xe1, 0x9b, 0x82, 0xc3, 0x90, 0xc7, 0xb6, 0xc8, - 0xa4, 0xe2, 0xb1, 0xa7, 0xc6, 0xb4, 0xc7, 0xbe, 0x71, 0xc5, 0x8d, 0xe2, 0xb1, 0xbd, - 0xc6, 0x97, 0xc6, 0x95, 0x72, 0xc4, 0xa9, 0xe1, 0x9b, 0xaf, 0xc5, 0xa8, 0xc6, 0x89, - 0xc6, 0xad, 0xe2, 0xb1, 0xae, 0xc7, 0xb1, 0x6c, 0xc5, 0xab, 0xe2, 0xb1, 0xbe, 0xe1, - 0x9b, 0x8e, 0xc3, 0x96, 0xe1, 0x9b, 0xa7, 0x65, 0xc6, 0xab, 0xe1, 0x9b, 0x97, 0xc6, - 0x90, 0xe1, 0x9b, 0xa9, 0xe1, 0x9a, 0xa4, 0xc7, 0x8a, 0x5b, 0xe2, 0xb1, 0xa6, 0xc5, - 0xbf, 0xc9, 0x86, 0xc8, 0x8b, 0xc6, 0xbd, 0xc5, 0xab, 0xc3, 0x90, 0xc2, 0xbb, 0xc8, - 0xb4, 0xc5, 0x84, 0xc3, 0xa0, 0xc6, 0x91, 0xc9, 0x8e, 0xc4, 0x87, 0xe2, 0xb1, 0xa5, - 0x71, 0xe1, 0x9a, 0xbb, 0xc7, 0x90, 0xc8, 0x85, 0xc6, 0x84, 0xce, 0x8a, 0xe2, 0xb1, - 0xbf, 0xc3, 0x9d, 0xc4, 0xbe, 0xc5, 0xac, 0x53, 0xc4, 0x8b, 0xc7, 0x97, 0xc6, 0x8d, - 0xe2, 0xb1, 0xb0, 0xc6, 0x87, 0xe1, 0x9b, 0x9a, 0xc7, 0x8c, 0xe1, 0x9b, 0x90, 0xc3, - 0xa4, 0xc4, 0xa7, 0xc7, 0xb9, 0x7a, 0xe1, 0x9b, 0x98, 0x2a, 0x46, 0x65, 0xc8, 0x88, - 0x78, 0xc7, 0x83, 0xe1, 0x9b, 0xa7, 0xc3, 0xbf, - ], - asset_base: [ - 0xd6, 0x9d, 0x7b, 0xa8, 0xcd, 0x66, 0x3c, 0xf9, 0x52, 0x8f, 0x01, 0x0a, 0x2d, 0xee, - 0x7b, 0x42, 0x9f, 0xe5, 0x62, 0x65, 0x50, 0x09, 0x30, 0x52, 0x90, 0x5a, 0xa9, 0x09, - 0x88, 0x38, 0x8d, 0x06, - ], - }, - TestVector { - key: [ - 0x6b, 0xfb, 0xe5, 0xc2, 0x42, 0x23, 0x94, 0xdc, 0x23, 0x76, 0xad, 0x10, 0x69, 0x3a, - 0xbc, 0x1b, 0xf4, 0xa1, 0x6e, 0x18, 0x56, 0x5e, 0xbe, 0x79, 0x84, 0x1b, 0x95, 0x13, - 0x45, 0x02, 0x53, 0x01, - ], - description: [ - 0xe1, 0x9a, 0xa0, 0xc7, 0xbb, 0xe1, 0x9b, 0xa1, 0xce, 0x8a, 0xc8, 0xb3, 0x31, 0xc8, - 0xba, 0xc8, 0x95, 0xc7, 0xae, 0xcd, 0xb5, 0xc4, 0xac, 0xc3, 0x87, 0x6b, 0xc3, 0xbd, - 0xc3, 0x9a, 0xc8, 0x83, 0xc7, 0x92, 0x48, 0xe1, 0x9b, 0x90, 0xe2, 0xb1, 0xb2, 0xc6, - 0x89, 0xe1, 0x9a, 0xa7, 0xc6, 0x81, 0xc2, 0xa9, 0xe1, 0x9b, 0x9c, 0xe1, 0x9b, 0xac, - 0xc3, 0xa8, 0xc5, 0xae, 0xc8, 0x8f, 0xc4, 0x96, 0xc3, 0x8e, 0xcd, 0xbb, 0xe1, 0x9b, - 0xaf, 0xc3, 0xa2, 0xc4, 0x92, 0xc5, 0xb2, 0xc6, 0x9f, 0xc3, 0xbb, 0xc5, 0xb5, 0xe2, - 0xb1, 0xb4, 0xc4, 0x95, 0xc7, 0x9f, 0xe1, 0x9a, 0xaf, 0xc9, 0x82, 0xc7, 0x8d, 0xc5, - 0x8c, 0xc3, 0x90, 0xe1, 0x9b, 0xa5, 0xe1, 0x9b, 0x94, 0xc9, 0x89, 0xe2, 0xb1, 0xa9, - 0xc4, 0x90, 0xc7, 0xa2, 0xc4, 0x8c, 0xc7, 0xbf, 0xc3, 0x80, 0xc6, 0x83, 0xc6, 0x95, - 0x24, 0x23, 0xe1, 0x9b, 0x90, 0xe1, 0x9a, 0xa3, 0xc3, 0x96, 0xc9, 0x8a, 0xc5, 0xb6, - 0x48, 0xc7, 0x9b, 0xc2, 0xaf, 0xc8, 0x86, 0xc5, 0xb9, 0xc8, 0x9b, 0x52, 0xc5, 0xa4, - 0x56, 0xe1, 0x9b, 0x9d, 0xe1, 0x9b, 0x95, 0xe1, 0x9a, 0xba, 0xc4, 0xa7, 0xc5, 0xaa, - 0xe2, 0xb1, 0xa6, 0xc8, 0xb5, 0x62, 0x4c, 0xe1, 0x9b, 0xaf, 0xc7, 0xab, 0xc5, 0x86, - 0xc5, 0x9d, 0x39, 0xc6, 0x9d, 0x3d, 0xc6, 0x82, 0xc8, 0x91, 0xe2, 0xb1, 0xaa, 0xc6, - 0xb8, 0xc5, 0x96, 0xc3, 0x90, 0xc3, 0xa5, 0x31, 0xc8, 0x94, 0x7d, 0xc7, 0xae, 0x56, - 0xc8, 0xaa, 0x66, 0xc7, 0x8d, 0x79, 0xc4, 0x9b, 0xc7, 0xb9, 0xc2, 0xbb, 0xc4, 0x84, - 0xce, 0x85, 0xc3, 0x9c, 0xc9, 0x83, 0xc8, 0xbc, 0xc8, 0x83, 0xc7, 0x96, 0xc6, 0xbf, - 0x28, 0xe1, 0x9a, 0xa1, 0xc6, 0xb3, 0xe2, 0xb1, 0xb5, 0xc4, 0x92, 0xc4, 0x92, 0xc2, - 0xa9, 0xc2, 0xb2, 0xc3, 0xad, 0xe2, 0xb1, 0xbe, 0xc6, 0xb3, 0xc8, 0x89, 0xc9, 0x8b, - 0xc4, 0x94, 0xc6, 0xa5, 0x2a, 0xc6, 0x8b, 0xe1, 0x9b, 0xa3, 0xe1, 0x9a, 0xa4, 0xc7, - 0x85, 0xc7, 0x8f, 0xc6, 0x90, 0xc7, 0xa3, 0xc7, 0xbe, 0xc3, 0x9e, 0xc2, 0xbd, 0x25, - 0xc8, 0xaf, 0xc6, 0x92, 0xe1, 0x9b, 0xab, 0xc8, 0xb9, 0x59, 0xc5, 0x93, 0xc7, 0xbf, - 0xc3, 0x96, 0xc6, 0xbf, 0xc3, 0xb0, 0xc6, 0x9e, 0xc9, 0x83, 0x35, 0xe2, 0xb1, 0xa1, - 0xc5, 0xaf, 0xc8, 0x9b, 0xc4, 0x9f, 0xc2, 0xa2, 0xcd, 0xb7, 0xc5, 0x83, 0xc6, 0x9b, - 0xc8, 0x92, 0xcd, 0xb7, 0xc8, 0xba, 0xc2, 0xa8, 0x44, 0xc4, 0xa6, 0xe1, 0x9a, 0xb8, - 0xc7, 0xa1, 0xc8, 0xa4, 0xc4, 0xbe, 0x6b, 0xc6, 0xa1, 0xc7, 0xa5, 0x4f, 0xc2, 0xa1, - 0xc8, 0x9b, 0xc4, 0xb8, 0x6e, 0xc3, 0x8f, 0xc6, 0xb5, 0xc4, 0x9c, 0xe1, 0x9b, 0x87, - 0xc5, 0x8a, 0xe2, 0xb1, 0xa7, 0xc3, 0x8d, 0xc4, 0x9b, 0xc7, 0xb0, 0x7a, 0xc7, 0x88, - 0xc5, 0xa7, 0x2e, 0xc2, 0xbb, 0xc3, 0x95, 0x6c, 0xe2, 0xb1, 0xa6, 0xe1, 0x9a, 0xad, - 0xc7, 0x85, 0xc9, 0x80, 0xc8, 0xa2, 0xc8, 0xaa, 0xe1, 0x9b, 0x9e, 0xc7, 0x9e, 0xc3, - 0x8b, 0xc6, 0xb4, 0xc8, 0x8c, 0xc9, 0x85, 0xc5, 0xab, 0xc5, 0x8a, 0x26, 0xc5, 0xa5, - 0xc3, 0x98, 0x30, 0xe1, 0x9b, 0x8b, 0xc5, 0xb3, 0xe2, 0xb1, 0xa9, 0x51, 0x33, 0xc6, - 0x85, 0x75, 0xc9, 0x82, 0xe1, 0x9a, 0xaa, 0xc6, 0x89, 0xe1, 0x9a, 0xb7, 0xc7, 0x81, - 0xc4, 0xa4, 0xc8, 0x86, 0xc3, 0xaf, 0xe1, 0x9b, 0x80, 0xe2, 0xb1, 0xab, 0xc7, 0x96, - 0x68, 0xc4, 0x93, 0x3f, 0xc3, 0x99, 0xc2, 0xb7, 0xc8, 0x8b, 0xc7, 0xb3, 0xc5, 0xa5, - 0xe1, 0x9b, 0xa9, 0xc5, 0x84, 0xc4, 0xa7, 0xc5, 0x99, 0xc4, 0xae, 0xc9, 0x87, 0xe1, - 0x9a, 0xba, 0xc4, 0x8a, 0xc4, 0xb2, 0x6d, 0x5a, - ], - asset_base: [ - 0x8e, 0x9c, 0x21, 0x17, 0xed, 0x4f, 0x4e, 0xe8, 0x9a, 0xb8, 0xb3, 0x53, 0xf5, 0xfd, - 0xd0, 0xcb, 0xde, 0xb7, 0xf2, 0xc9, 0x55, 0xfa, 0xdc, 0x7b, 0x1a, 0xda, 0x09, 0x97, - 0x56, 0x11, 0x72, 0x85, - ], - }, - TestVector { - key: [ - 0xab, 0x90, 0x15, 0x62, 0x52, 0x72, 0xe1, 0xe7, 0xba, 0x69, 0x0a, 0xe0, 0x09, 0xa9, - 0x92, 0xe4, 0x9d, 0xe1, 0x9f, 0x33, 0xfc, 0xde, 0xb9, 0xf1, 0x71, 0xab, 0x1a, 0xaf, - 0x28, 0x88, 0xc6, 0x0e, - ], - description: [ - 0xc6, 0xb9, 0xe2, 0xb1, 0xae, 0xe2, 0xb1, 0xbc, 0xc7, 0x97, 0xe1, 0x9b, 0x9f, 0xc6, - 0x98, 0xc8, 0x82, 0xc3, 0xa2, 0xc4, 0xba, 0xc7, 0xbc, 0xc4, 0xbc, 0xc4, 0xa6, 0xc6, - 0xad, 0xc8, 0xb7, 0x70, 0xc3, 0x94, 0xe1, 0x9b, 0x81, 0xc5, 0x86, 0xe2, 0xb1, 0xa9, - 0xc8, 0x99, 0xce, 0x8c, 0xc3, 0x99, 0xc7, 0x91, 0xc3, 0xbd, 0x30, 0xc7, 0xb9, 0xc4, - 0xb0, 0xc8, 0xae, 0xe1, 0x9b, 0xa5, 0xc6, 0xbe, 0xc5, 0xad, 0xc5, 0xb6, 0xc2, 0xaf, - 0xc4, 0xbf, 0xce, 0x8c, 0xc8, 0xb8, 0x4a, 0xe2, 0xb1, 0xaa, 0xc3, 0xb1, 0xc5, 0x9a, - 0xe1, 0x9a, 0xb8, 0xc5, 0x9a, 0x33, 0xc4, 0x91, 0xc3, 0x9f, 0xc4, 0x86, 0x39, 0xc8, - 0x89, 0xc7, 0xa9, 0xc3, 0x9b, 0xc7, 0x92, 0xce, 0x89, 0x63, 0xc6, 0x93, 0xc6, 0x90, - 0xc2, 0xb6, 0xc5, 0x8f, 0xc8, 0x91, 0xc2, 0xab, 0xe1, 0x9a, 0xbc, 0xe2, 0xb1, 0xa4, - 0xc3, 0xb1, 0xc5, 0xaf, 0xe1, 0x9b, 0x84, 0xc5, 0xb5, 0xc5, 0x80, 0xe2, 0xb1, 0xa0, - 0x68, 0xc5, 0xa2, 0x26, 0xe1, 0x9a, 0xa1, 0xc4, 0x87, 0xc4, 0x9d, 0xc4, 0x9f, 0xc5, - 0x8b, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0x8d, 0xe1, 0x9a, 0xbd, 0xce, 0x88, 0xc9, 0x81, - 0xc7, 0x92, 0xe1, 0x9b, 0x9b, 0xc3, 0xb8, 0xc2, 0xab, 0x39, 0xe1, 0x9b, 0x9f, 0xc5, - 0xb4, 0xc5, 0xb3, 0xce, 0x86, 0xc8, 0x8d, 0xe1, 0x9b, 0x9b, 0xc5, 0xba, 0x38, 0xc6, - 0x84, 0xc8, 0xbf, 0xc6, 0xa2, 0xc8, 0x96, 0xc7, 0x8b, 0xc7, 0xbe, 0xc4, 0x97, 0xc8, - 0xb9, 0xc6, 0xb3, 0xc3, 0xbb, 0xc4, 0x8f, 0xc9, 0x86, 0xc5, 0x85, 0xc7, 0x9b, 0x7c, - 0xe2, 0xb1, 0xa0, 0xc7, 0xb2, 0xc8, 0x9c, 0xc5, 0xa8, 0xc2, 0xa8, 0xe1, 0x9a, 0xb6, - 0xc4, 0xaf, 0xc3, 0x8e, 0xc8, 0xbf, 0xc4, 0xa9, 0xc3, 0x95, 0xe1, 0x9b, 0x80, 0xc4, - 0xb7, 0xc8, 0x88, 0xc8, 0x80, 0xc5, 0xaf, 0xe1, 0x9a, 0xa4, 0xc7, 0x96, 0xc3, 0xb0, - 0xc4, 0xa2, 0x7c, 0xcd, 0xb6, 0xc7, 0x95, 0x4e, 0xc9, 0x86, 0xc2, 0xb0, 0xc3, 0xbb, - 0xc7, 0x8b, 0xc4, 0xb3, 0xe2, 0xb1, 0xaa, 0xe1, 0x9b, 0x8f, 0xc7, 0x84, 0xe1, 0x9a, - 0xaf, 0xc4, 0x92, 0xc7, 0x97, 0x34, 0xc2, 0xbe, 0xe1, 0x9b, 0x96, 0xc4, 0x9d, 0xc6, - 0xab, 0xe1, 0x9b, 0xa8, 0x4b, 0xc3, 0x86, 0xc7, 0x97, 0xc4, 0xa7, 0xc3, 0xbb, 0xc8, - 0x90, 0x48, 0xe1, 0x9b, 0x9a, 0xc6, 0x9d, 0xe1, 0x9b, 0x9b, 0xc4, 0xbb, 0xc3, 0x8f, - 0xc7, 0xb8, 0xc8, 0x9d, 0xc6, 0xac, 0xc6, 0xa5, 0xc6, 0x9e, 0xc7, 0x83, 0xc3, 0x97, - 0xc8, 0xae, 0xc3, 0xaf, 0xc3, 0xb4, 0xc5, 0xab, 0xc4, 0x81, 0xe1, 0x9b, 0xa0, 0xc3, - 0x85, 0xc4, 0x84, 0x7c, 0x21, 0xc2, 0xb4, 0xc9, 0x8b, 0xc9, 0x8b, 0xc8, 0x9c, 0xc7, - 0x8f, 0xe2, 0xb1, 0xab, 0xe1, 0x9a, 0xbc, 0xc7, 0x8b, 0xc6, 0xa0, 0xc6, 0xb2, 0xc9, - 0x82, 0xc5, 0x8c, 0xe2, 0xb1, 0xb7, 0xc7, 0x8d, 0xc5, 0xa9, 0xc4, 0xbd, 0xc6, 0x8f, - 0xc4, 0x83, 0xc6, 0x80, 0xe1, 0x9b, 0xa7, 0xc8, 0x94, 0xc5, 0x8e, 0xc6, 0x9e, 0x4a, - 0x62, 0x70, 0xe1, 0x9a, 0xa5, 0xe2, 0xb1, 0xba, 0xc3, 0x8f, 0xc3, 0x85, 0xc4, 0x82, - 0xc7, 0xbc, 0xce, 0x85, 0x77, 0xc2, 0xb2, 0xc8, 0x89, 0xe1, 0x9a, 0xa2, 0xc5, 0xac, - 0xc5, 0x9e, 0xcd, 0xb5, 0xc6, 0x83, 0xc6, 0x93, 0xc8, 0x9d, 0xe1, 0x9a, 0xa2, 0xe1, - 0x9b, 0xa8, 0xc2, 0xa2, 0xe1, 0x9a, 0xa5, 0xcd, 0xb3, 0xc4, 0xb8, 0x3c, 0xc6, 0xb5, - 0xc3, 0x8c, 0xc3, 0x90, 0xc3, 0xa4, 0xc7, 0x83, 0xc4, 0xb4, 0xc7, 0x93, 0xc5, 0xa3, - 0xc6, 0xa6, 0x25, 0xc5, 0xbf, 0x7d, 0xc6, 0xa3, 0x46, 0xc3, 0xa6, 0xc6, 0x9b, 0xc7, - 0xbc, 0xc6, 0x81, 0xc2, 0xba, 0xc7, 0xa7, 0x60, - ], - asset_base: [ - 0xd4, 0x7d, 0x06, 0xf8, 0x2f, 0x2d, 0x15, 0x8a, 0xee, 0xf7, 0x02, 0x8a, 0x1d, 0xb5, - 0xf3, 0xa1, 0xd1, 0x25, 0x0e, 0x2c, 0xfa, 0x28, 0x94, 0x44, 0x1d, 0x86, 0xee, 0xc4, - 0x7a, 0xbf, 0xbd, 0xb5, - ], - }, - TestVector { - key: [ - 0x06, 0xd4, 0x75, 0x14, 0x97, 0x0d, 0x02, 0xd3, 0xf8, 0x43, 0xfb, 0x9b, 0x96, 0x51, - 0x08, 0x75, 0xa7, 0xa6, 0xc0, 0x15, 0x68, 0x1d, 0x06, 0xe0, 0xb1, 0x5b, 0x8a, 0x92, - 0x1f, 0xbd, 0x81, 0x30, - ], - description: [ - 0xc5, 0x99, 0xc2, 0xa5, 0xc6, 0xb8, 0x6d, 0xc5, 0xa7, 0xc7, 0xbd, 0xc4, 0xa0, 0xe1, - 0x9b, 0xa7, 0xc8, 0xba, 0xc9, 0x81, 0x7d, 0x36, 0xc5, 0x80, 0x52, 0xcd, 0xb5, 0xc5, - 0xba, 0xc2, 0xbb, 0x6d, 0xe2, 0xb1, 0xb1, 0xc5, 0xa8, 0xc5, 0x8c, 0x38, 0x47, 0xc9, - 0x87, 0x7c, 0x43, 0xc3, 0x96, 0xc6, 0x87, 0xc7, 0xbf, 0xc4, 0x9b, 0xe1, 0x9b, 0x98, - 0xc7, 0x94, 0xe1, 0x9b, 0x9b, 0xe1, 0x9b, 0x9d, 0xe1, 0x9a, 0xbf, 0x35, 0xc7, 0xba, - 0xc8, 0x82, 0xc4, 0x80, 0xc6, 0xbf, 0xc7, 0xba, 0xc4, 0xbd, 0xc4, 0x81, 0xe2, 0xb1, - 0xbc, 0xe1, 0x9a, 0xad, 0xe1, 0x9a, 0xab, 0xc5, 0xab, 0xc5, 0xba, 0xc6, 0xa8, 0x3b, - 0xc6, 0x98, 0xc7, 0x8c, 0xc8, 0x9e, 0xc2, 0xbe, 0xc6, 0x8b, 0xc7, 0x9c, 0xc8, 0xb4, - 0x3f, 0xc5, 0xb8, 0xc4, 0xb7, 0xc8, 0xb2, 0xc6, 0x86, 0xc3, 0xa1, 0xc7, 0x9b, 0x5c, - 0xe1, 0x9a, 0xa6, 0xe1, 0x9b, 0xac, 0xc7, 0x8c, 0xc6, 0xa7, 0x53, 0xc6, 0xa5, 0xc7, - 0x90, 0xe1, 0x9b, 0x85, 0xc8, 0x94, 0xcd, 0xb1, 0xc6, 0x99, 0xc4, 0xa8, 0xc7, 0xb3, - 0xe1, 0x9a, 0xb1, 0x7b, 0xc2, 0xb1, 0xe1, 0x9b, 0x94, 0x36, 0xc9, 0x8d, 0xc2, 0xa2, - 0x73, 0xc5, 0x80, 0xc5, 0x8d, 0xc8, 0x84, 0xc7, 0xa6, 0xc9, 0x85, 0xc4, 0xbd, 0xc7, - 0xb8, 0xc8, 0xb0, 0xc4, 0x83, 0xc3, 0xb8, 0xcd, 0xb1, 0x77, 0xc3, 0xa6, 0xc6, 0x80, - 0xc4, 0x83, 0xc8, 0x8e, 0xc9, 0x87, 0xc7, 0xb4, 0xc5, 0xb8, 0xc5, 0x99, 0xe2, 0xb1, - 0xaa, 0xc6, 0xb6, 0xc4, 0xa3, 0xc6, 0xb4, 0xc6, 0x8d, 0xe2, 0xb1, 0xa3, 0xe1, 0x9a, - 0xaa, 0xe1, 0x9a, 0xb8, 0xc3, 0x92, 0x63, 0xcd, 0xb4, 0xc7, 0x91, 0xc8, 0x83, 0xc3, - 0xaf, 0xcd, 0xb2, 0xc7, 0x9b, 0x5a, 0xe1, 0x9b, 0x82, 0xc6, 0x87, 0xc8, 0x91, 0xc5, - 0x83, 0xc5, 0xa8, 0xc4, 0x85, 0xe1, 0x9b, 0xab, 0xe1, 0x9b, 0x9f, 0x39, 0xc6, 0xbc, - 0x64, 0xc5, 0x98, 0xe1, 0x9b, 0x9f, 0xc8, 0xab, 0xe1, 0x9a, 0xb4, 0xc4, 0x83, 0xe2, - 0xb1, 0xb2, 0xe2, 0xb1, 0xa8, 0x5e, 0xc8, 0x93, 0xc4, 0xb3, 0xe1, 0x9b, 0xa6, 0xc5, - 0x93, 0xe1, 0x9b, 0x86, 0xc3, 0x98, 0xc2, 0xbd, 0xc7, 0x9a, 0xe1, 0x9a, 0xb2, 0xc7, - 0x8a, 0x73, 0xc7, 0x96, 0xe2, 0xb1, 0xb0, 0xcd, 0xbc, 0xc7, 0xb8, 0xc7, 0x95, 0xc4, - 0xa7, 0xe2, 0xb1, 0xb4, 0xc5, 0xa6, 0xc4, 0xa6, 0xe1, 0x9a, 0xa1, 0xc4, 0xbd, 0xc2, - 0xa2, 0xc5, 0x96, 0xe1, 0x9b, 0x89, 0xe1, 0x9b, 0x8e, 0xe2, 0xb1, 0xab, 0xc8, 0x8e, - 0x24, 0xcd, 0xb7, 0xc5, 0xab, 0xc8, 0x97, 0xce, 0x86, 0xc3, 0xac, 0x63, 0xc7, 0x97, - 0xc5, 0x81, 0xc6, 0x8b, 0xc4, 0xb7, 0xe2, 0xb1, 0xad, 0xc4, 0x8e, 0xc8, 0x98, 0xcd, - 0xbc, 0xe1, 0x9a, 0xbb, 0xc5, 0xb8, 0xc4, 0x9d, 0x28, 0xc6, 0x87, 0xe1, 0x9b, 0x9d, - 0xe1, 0x9b, 0x93, 0xc3, 0xbb, 0xc7, 0x8f, 0x74, 0xc8, 0x9e, 0xce, 0x88, 0xc7, 0x9c, - 0xc8, 0x9d, 0xc9, 0x80, 0xc4, 0xbf, 0xc7, 0xad, 0xc3, 0x97, 0xe2, 0xb1, 0xad, 0x2e, - 0xc6, 0xb7, 0x40, 0xc3, 0xb7, 0xc3, 0xaf, 0xe1, 0x9a, 0xbe, 0xc7, 0x88, 0xc4, 0x8a, - 0xc3, 0x81, 0xc5, 0x97, 0xc8, 0x93, 0xc8, 0xb8, 0xe1, 0x9a, 0xa8, 0xc3, 0x9e, 0xc8, - 0xb1, 0xc8, 0xaa, 0x5c, 0xc6, 0xa4, 0xe1, 0x9b, 0x9d, 0xc2, 0xb6, 0xc8, 0x85, 0xc7, - 0x98, 0xc4, 0xb8, 0xc4, 0xa1, 0xc9, 0x81, 0xc5, 0x94, 0xc4, 0xa4, 0xc2, 0xa8, 0xc7, - 0xa7, 0xc5, 0xba, 0x5a, 0xcd, 0xb3, 0xe1, 0x9b, 0xa0, 0xc4, 0x83, 0xc6, 0x83, 0xc9, - 0x85, 0x45, 0xc3, 0xb5, 0xc7, 0x9f, 0xc5, 0x93, 0xc3, 0x90, 0xc7, 0x95, 0xc8, 0xb1, - 0xc7, 0x87, 0xc3, 0xb2, 0xc7, 0xb9, 0xc3, 0xa8, - ], - asset_base: [ - 0xa9, 0xa8, 0xef, 0x9a, 0x58, 0xbd, 0xab, 0xa1, 0x51, 0xcf, 0xc2, 0x58, 0x66, 0xca, - 0x40, 0x54, 0xd7, 0xac, 0xae, 0xbd, 0xde, 0x1a, 0xf7, 0xe9, 0xe4, 0x89, 0x6b, 0x43, - 0xc7, 0x18, 0xef, 0x9d, - ], - }, - TestVector { - key: [ - 0x3d, 0x8b, 0xb6, 0x41, 0x5a, 0x53, 0x0b, 0xb2, 0x0f, 0x0d, 0x70, 0x2e, 0x8c, 0xb8, - 0x0b, 0xc1, 0xd5, 0xae, 0x41, 0x66, 0x5c, 0x53, 0x14, 0x4c, 0xfb, 0x60, 0x6e, 0x58, - 0x6a, 0xbc, 0x03, 0x33, - ], - description: [ - 0x62, 0xc8, 0xbb, 0xc6, 0xb1, 0xc5, 0xa9, 0xc9, 0x8c, 0xc9, 0x8e, 0xc6, 0xb6, 0xc3, - 0x85, 0xc4, 0xb0, 0x70, 0xc2, 0xb9, 0x49, 0xc8, 0x9b, 0xe1, 0x9b, 0x91, 0x69, 0xc8, - 0xaf, 0xc6, 0x94, 0xc5, 0xa2, 0x24, 0xe1, 0x9a, 0xb3, 0xcd, 0xb3, 0xe1, 0x9a, 0xa1, - 0x62, 0x67, 0xc3, 0x9a, 0xc7, 0x84, 0xe1, 0x9b, 0xa2, 0xc9, 0x86, 0xc6, 0xab, 0xc5, - 0xad, 0xc8, 0xad, 0xc6, 0xbe, 0xc3, 0x84, 0xc4, 0xad, 0xc3, 0xbf, 0xe2, 0xb1, 0xb9, - 0xc8, 0x8c, 0xc5, 0xb7, 0xe1, 0x9b, 0xad, 0xc6, 0x87, 0xc3, 0xa8, 0xce, 0x88, 0xc2, - 0xa5, 0xc3, 0xa7, 0xc5, 0xb6, 0xc4, 0x82, 0xe1, 0x9a, 0xbf, 0xc5, 0xad, 0xc8, 0xb9, - 0xc8, 0xab, 0xc3, 0xb8, 0xc5, 0x85, 0xc3, 0xb4, 0xc3, 0xa4, 0xc4, 0xb0, 0xc9, 0x8b, - 0xc6, 0x9c, 0xc8, 0x94, 0xe1, 0x9b, 0xab, 0xc8, 0xaa, 0xe1, 0x9a, 0xab, 0xc4, 0xa2, - 0xc3, 0xbc, 0x68, 0xc5, 0x84, 0xc9, 0x8c, 0xc8, 0xa8, 0x39, 0xc7, 0xab, 0xe1, 0x9b, - 0x8d, 0x47, 0xe1, 0x9a, 0xa1, 0x26, 0xc4, 0x82, 0xe1, 0x9a, 0xb0, 0xc8, 0xb4, 0x50, - 0xc8, 0xab, 0xc7, 0x81, 0xe1, 0x9a, 0xb3, 0xc5, 0x81, 0xe1, 0x9b, 0x94, 0x3e, 0xc3, - 0xa1, 0x4e, 0xc4, 0xb7, 0xc5, 0xbf, 0xc4, 0xa2, 0x26, 0xc2, 0xb1, 0xc6, 0xb3, 0xc5, - 0xa6, 0xc4, 0xb2, 0xc5, 0x90, 0xc8, 0x92, 0xc5, 0xbe, 0xc5, 0xbb, 0xc8, 0xac, 0x3c, - 0xc4, 0x91, 0xc4, 0xac, 0xc6, 0x87, 0xc4, 0x94, 0xe1, 0x9a, 0xa7, 0xc9, 0x85, 0xe2, - 0xb1, 0xa3, 0xe1, 0x9b, 0xb0, 0xc6, 0xaf, 0x79, 0xe1, 0x9a, 0xad, 0xc9, 0x8e, 0xe1, - 0x9a, 0xa2, 0x23, 0xe2, 0xb1, 0xb7, 0xc4, 0xba, 0x45, 0xe1, 0x9a, 0xbe, 0xc7, 0xb7, - 0xc3, 0xa6, 0x5a, 0xce, 0x88, 0xc5, 0xa9, 0x46, 0x6a, 0xc3, 0xb5, 0xe1, 0x9b, 0xab, - 0xc2, 0xbe, 0xe2, 0xb1, 0xbf, 0xc6, 0x82, 0x66, 0x42, 0xc5, 0xb4, 0xc8, 0x85, 0xc4, - 0x97, 0xc2, 0xab, 0xc2, 0xa9, 0xc7, 0x8f, 0xc7, 0xb9, 0xe1, 0x9b, 0x8f, 0xc8, 0xb1, - 0xc7, 0xaf, 0xc9, 0x82, 0xc7, 0x8a, 0x38, 0xc2, 0xa3, 0xc4, 0xaf, 0xc4, 0xac, 0xc3, - 0x9b, 0xc7, 0xb9, 0x6d, 0xc7, 0xbf, 0xe1, 0x9a, 0xa1, 0xe1, 0x9b, 0xa4, 0xc6, 0xbe, - 0xc6, 0xa7, 0xc3, 0x8f, 0xe1, 0x9b, 0xa9, 0xc6, 0xb1, 0xce, 0x89, 0xc2, 0xb3, 0xc5, - 0x8f, 0xc6, 0x95, 0x52, 0xc8, 0x83, 0xc2, 0xb1, 0xc6, 0xb3, 0xc3, 0x87, 0xe1, 0x9b, - 0x84, 0xc6, 0xae, 0x32, 0xe1, 0x9b, 0x99, 0xcd, 0xb6, 0xc5, 0xbb, 0xc6, 0xa7, 0xc5, - 0xbd, 0xc6, 0x9f, 0xc8, 0x87, 0xc2, 0xbb, 0xc2, 0xbe, 0x5c, 0xc5, 0xb8, 0xc8, 0x8c, - 0xc8, 0x9c, 0xc2, 0xab, 0xe2, 0xb1, 0xac, 0x3e, 0xc6, 0xbc, 0x6b, 0xc2, 0xb2, 0xc7, - 0x95, 0xc6, 0xa0, 0xc3, 0xa6, 0xe2, 0xb1, 0xaf, 0xe1, 0x9b, 0xa8, 0xc6, 0xb1, 0xc5, - 0x81, 0xc5, 0x96, 0xc3, 0x99, 0xc8, 0x9b, 0x2c, 0xc4, 0x93, 0xe2, 0xb1, 0xbb, 0xc2, - 0xab, 0xc8, 0x92, 0xc2, 0xb9, 0xc4, 0xb5, 0xc7, 0x94, 0xc3, 0x94, 0xe1, 0x9a, 0xb0, - 0xc4, 0xae, 0xe1, 0x9b, 0x84, 0x30, 0xc7, 0x91, 0xc2, 0xa4, 0xc5, 0x9a, 0xc5, 0x92, - 0xc9, 0x8f, 0xe1, 0x9a, 0xb6, 0xe1, 0x9a, 0xaa, 0xc8, 0xb2, 0xc6, 0x9e, 0x30, 0xc4, - 0xae, 0x6f, 0x73, 0xc2, 0xa3, 0xc7, 0x8c, 0xe2, 0xb1, 0xb8, 0x57, 0xc9, 0x89, 0xe1, - 0x9b, 0x8c, 0x60, 0xc4, 0x88, 0xce, 0x87, 0x4c, 0xc4, 0xaa, 0xc4, 0xab, 0xc2, 0xae, - 0xc7, 0x8a, 0xc7, 0xad, 0xc4, 0x87, 0xc5, 0xb3, 0x5b, 0x68, 0xc4, 0x9a, 0xc4, 0x9c, - 0x3a, 0xc4, 0x8b, 0xe1, 0x9a, 0xb2, 0x2e, 0xc5, 0x9a, 0xc2, 0xb9, 0xe1, 0x9a, 0xa3, - 0xe1, 0x9b, 0x8b, 0xc8, 0xa9, 0xc6, 0x9d, 0x34, - ], - asset_base: [ - 0x3e, 0x9f, 0x51, 0x16, 0x2c, 0xbf, 0x73, 0x86, 0x1a, 0xe5, 0xd7, 0xc5, 0x82, 0x4e, - 0x0e, 0x54, 0xac, 0x96, 0xe9, 0xd7, 0xa2, 0xcf, 0x5a, 0x76, 0x0b, 0xf2, 0x61, 0x21, - 0x93, 0xe5, 0x7a, 0x15, - ], - }, - TestVector { - key: [ - 0x95, 0xa6, 0xa5, 0x7f, 0x8e, 0x85, 0x43, 0x72, 0xf9, 0xce, 0x7d, 0xb1, 0x34, 0xfd, - 0x9e, 0x87, 0x43, 0xbd, 0x39, 0x17, 0xe6, 0x50, 0x52, 0x93, 0x4c, 0xbd, 0xef, 0xa7, - 0x67, 0xb7, 0xc7, 0x18, - ], - description: [ - 0xc5, 0x94, 0xc5, 0xb4, 0xc2, 0xbd, 0xc6, 0xa4, 0xc6, 0x8e, 0xe1, 0x9b, 0x80, 0xc5, - 0x9c, 0xc4, 0xb5, 0xc3, 0x9f, 0xc7, 0x9b, 0xc6, 0xb2, 0xc2, 0xa8, 0xc8, 0xa2, 0xc3, - 0xad, 0x52, 0xc5, 0xa9, 0xc4, 0x87, 0xc3, 0xbf, 0x2e, 0xc4, 0x8c, 0xc5, 0x8c, 0xc4, - 0x88, 0xc2, 0xbf, 0xc7, 0xb0, 0xc9, 0x85, 0xc4, 0xa6, 0xc7, 0x99, 0xe1, 0x9b, 0x81, - 0x42, 0xc3, 0x8f, 0xc7, 0x8c, 0xe1, 0x9a, 0xa8, 0x2b, 0xc3, 0x9d, 0xc9, 0x87, 0xc4, - 0x89, 0xc6, 0x87, 0xc8, 0x8c, 0xc4, 0xbe, 0x51, 0xc5, 0xac, 0xc9, 0x81, 0xc3, 0xb7, - 0xc5, 0xb2, 0xe1, 0x9b, 0x87, 0xc6, 0xad, 0xc8, 0xa6, 0xc6, 0xad, 0xc6, 0x93, 0xc9, - 0x84, 0xc8, 0x85, 0x6f, 0x41, 0xc7, 0xb5, 0xe1, 0x9b, 0xa8, 0xc5, 0x89, 0xe2, 0xb1, - 0xa7, 0xc3, 0x9f, 0x64, 0xc7, 0x9e, 0x62, 0xc3, 0x95, 0xc7, 0xa1, 0xc6, 0x80, 0xc4, - 0xbb, 0xc2, 0xb1, 0x53, 0xc7, 0xb4, 0x63, 0xe1, 0x9b, 0x95, 0x21, 0xc5, 0xa2, 0xc4, - 0xa3, 0xc3, 0x9a, 0xc6, 0xbe, 0xc4, 0x93, 0xc5, 0xa5, 0xe1, 0x9b, 0x88, 0xc3, 0x85, - 0xc7, 0x9e, 0xc3, 0xbf, 0x48, 0xc5, 0x8a, 0xc3, 0xaf, 0x51, 0xc5, 0x9b, 0xe1, 0x9b, - 0xa3, 0xc4, 0xbf, 0xc5, 0x96, 0xe1, 0x9b, 0x97, 0xc7, 0x8c, 0xc7, 0xb0, 0x7b, 0xc6, - 0x94, 0x23, 0xe1, 0x9b, 0x86, 0xce, 0x86, 0xc4, 0x85, 0xc5, 0x94, 0xc5, 0x9f, 0xc7, - 0x84, 0xc3, 0xb1, 0xc6, 0x8a, 0xc8, 0x97, 0xc3, 0x81, 0xe2, 0xb1, 0xaf, 0xc7, 0xbf, - 0xc2, 0xa6, 0xc6, 0xbf, 0xc4, 0xbe, 0xcd, 0xb6, 0xc3, 0xb6, 0xc9, 0x8c, 0xc7, 0x86, - 0xc5, 0x9a, 0xc3, 0x9d, 0xc3, 0x91, 0xc8, 0xb9, 0xc4, 0x9c, 0xc4, 0x89, 0xc3, 0x99, - 0x70, 0xe1, 0x9b, 0x83, 0xc8, 0x97, 0xc8, 0xaf, 0xc3, 0xa3, 0xe2, 0xb1, 0xbd, 0xe2, - 0xb1, 0xb8, 0xc7, 0x8c, 0xc7, 0xa5, 0x5c, 0xc6, 0xb2, 0xc2, 0xa9, 0xc7, 0xb9, 0xe1, - 0x9b, 0x88, 0xc5, 0xbc, 0xc5, 0x83, 0xc7, 0x90, 0xc6, 0x91, 0xc7, 0xa3, 0x30, 0xe1, - 0x9a, 0xb9, 0xe2, 0xb1, 0xbe, 0xe1, 0x9b, 0xa0, 0x4c, 0xe1, 0x9b, 0x93, 0xc5, 0x93, - 0xc8, 0xb8, 0xc6, 0x98, 0xc3, 0xb2, 0xc6, 0xbf, 0xe1, 0x9b, 0xa6, 0xc5, 0x84, 0xe1, - 0x9b, 0x91, 0xc6, 0xb2, 0xc5, 0x94, 0xc4, 0x93, 0xe1, 0x9b, 0x98, 0xcd, 0xb6, 0xc6, - 0xae, 0x60, 0xc5, 0xa4, 0xc6, 0x81, 0x46, 0xc6, 0x86, 0xc4, 0xa1, 0x33, 0xc6, 0xb2, - 0x71, 0xc6, 0xae, 0xe2, 0xb1, 0xb9, 0x3d, 0x35, 0xe1, 0x9b, 0x9e, 0x62, 0xc8, 0x93, - 0x61, 0xc4, 0x90, 0xe1, 0x9b, 0x8c, 0xe1, 0x9b, 0x9d, 0x35, 0xe1, 0x9b, 0xae, 0xc9, - 0x83, 0xc7, 0x8d, 0xe1, 0x9a, 0xa6, 0xe1, 0x9a, 0xb9, 0xc3, 0x86, 0xc8, 0x9e, 0xc8, - 0xa8, 0xc9, 0x8f, 0xcd, 0xbe, 0xc8, 0xbe, 0xc5, 0x94, 0x63, 0x67, 0xc2, 0xa7, 0xc8, - 0xbf, 0xe2, 0xb1, 0xb2, 0xc3, 0x80, 0x32, 0xc6, 0xac, 0xe1, 0x9a, 0xbc, 0xc3, 0xa6, - 0xc3, 0x96, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb2, 0x4c, 0xe1, 0x9b, 0xac, 0xc8, 0xac, - 0xc3, 0xb7, 0xc3, 0x8d, 0x79, 0xc3, 0x9b, 0xc9, 0x8c, 0xcd, 0xbc, 0xc5, 0x9c, 0xe1, - 0x9b, 0xb0, 0xe1, 0x9b, 0x9a, 0x7c, 0xc7, 0xb6, 0xc6, 0xbc, 0xc4, 0x88, 0xe1, 0x9a, - 0xb0, 0xc7, 0x83, 0xc4, 0x9c, 0xe1, 0x9b, 0x82, 0xc5, 0xad, 0xc8, 0xac, 0xe1, 0x9b, - 0xa7, 0x7c, 0xc8, 0x8e, 0xc2, 0xbc, 0xc6, 0x91, 0xc7, 0xbb, 0xc6, 0x83, 0xc5, 0x92, - 0xc5, 0x8e, 0x73, 0xcd, 0xb3, 0xe1, 0x9a, 0xbc, 0x40, 0x61, 0xc6, 0x98, 0xe2, 0xb1, - 0xa9, 0xce, 0x8a, 0xc7, 0xb2, 0x60, 0xc4, 0xb7, 0xc8, 0x83, 0xc6, 0xaa, 0xc7, 0xb5, - 0xc6, 0xbf, 0x41, 0xc7, 0xaf, 0xc6, 0x89, 0x5a, - ], - asset_base: [ - 0xf1, 0x2e, 0x1e, 0x6c, 0xdd, 0x2a, 0xdb, 0x59, 0x2a, 0x2b, 0xe1, 0x2c, 0x09, 0x18, - 0x31, 0x10, 0xc7, 0x39, 0x0b, 0x80, 0xf3, 0x7b, 0xba, 0x6c, 0x6f, 0x6f, 0xe2, 0x06, - 0xf6, 0xf6, 0x67, 0xac, - ], - }, - TestVector { - key: [ - 0xa3, 0x6d, 0xf3, 0x6a, 0xc7, 0xa2, 0xe2, 0xba, 0xab, 0xfd, 0x1e, 0x8d, 0xbf, 0x39, - 0x3b, 0xd8, 0x25, 0x32, 0xec, 0x3d, 0x52, 0x3b, 0xbe, 0x85, 0x7f, 0x71, 0x58, 0x0c, - 0xcd, 0x22, 0xdf, 0x08, - ], - description: [ - 0xc4, 0x81, 0xc7, 0x88, 0xc8, 0xa0, 0xc8, 0xa8, 0xc7, 0xa1, 0xc7, 0x86, 0x29, 0xc6, - 0x99, 0xe2, 0xb1, 0xbe, 0xc4, 0xb0, 0xe1, 0x9a, 0xaf, 0xc5, 0xa7, 0xc8, 0xbd, 0xe1, - 0x9b, 0x93, 0xe2, 0xb1, 0xa7, 0xe1, 0x9a, 0xb6, 0xc6, 0xb3, 0xe1, 0x9b, 0x89, 0xce, - 0x86, 0xc5, 0xa4, 0xc2, 0xa8, 0xc8, 0xa1, 0xe2, 0xb1, 0xa7, 0xc4, 0x98, 0xe1, 0x9b, - 0xa0, 0xc2, 0xb3, 0xe1, 0x9b, 0xa3, 0xe1, 0x9b, 0x9e, 0x3c, 0xe2, 0xb1, 0xa8, 0xc8, - 0xba, 0xc2, 0xb9, 0xc5, 0x9d, 0xc5, 0xa0, 0xe1, 0x9a, 0xb8, 0xc8, 0x85, 0xc6, 0x88, - 0xe2, 0xb1, 0xbd, 0xe1, 0x9b, 0x8b, 0xc6, 0xbb, 0xc2, 0xa5, 0xc5, 0x8e, 0xcd, 0xb7, - 0x74, 0xc4, 0xba, 0xc4, 0x9a, 0xc6, 0xb9, 0xc5, 0xbc, 0xc5, 0x86, 0xc8, 0x9d, 0xe2, - 0xb1, 0xb9, 0xe2, 0xb1, 0xa2, 0xe2, 0xb1, 0xa6, 0xc3, 0xba, 0xc4, 0xb8, 0xcd, 0xb4, - 0xc8, 0xa8, 0x3f, 0xc4, 0xa1, 0xc7, 0x9c, 0x41, 0xc7, 0x81, 0xc8, 0xb8, 0xc6, 0xb8, - 0xc7, 0xaa, 0xcd, 0xb1, 0xc4, 0xb1, 0xce, 0x8c, 0xe1, 0x9b, 0x86, 0x2d, 0xc8, 0x88, - 0xc5, 0xaa, 0xc8, 0xab, 0xc3, 0xb6, 0xc9, 0x8a, 0x75, 0xc8, 0xa1, 0xc4, 0xa7, 0xc4, - 0x85, 0x48, 0xc6, 0x88, 0x3c, 0xe2, 0xb1, 0xb6, 0xc4, 0x8b, 0xe1, 0x9b, 0xa3, 0xc6, - 0x9b, 0xc8, 0x9d, 0xe1, 0x9b, 0xac, 0xe2, 0xb1, 0xaf, 0x2d, 0xc8, 0x93, 0xc4, 0x88, - 0xc3, 0x83, 0xc7, 0x95, 0xe1, 0x9a, 0xb5, 0xc4, 0xa2, 0x68, 0xc3, 0xbf, 0xc4, 0x96, - 0xc8, 0x9d, 0x43, 0xcd, 0xb4, 0x3d, 0xc6, 0xb1, 0xc4, 0x9c, 0xe1, 0x9b, 0xad, 0xc6, - 0xa3, 0xc3, 0xbe, 0xc4, 0xbf, 0xc7, 0xb8, 0xc2, 0xaa, 0xc8, 0xac, 0xc4, 0x91, 0x6f, - 0xc7, 0xbf, 0xc5, 0x84, 0xc8, 0x94, 0xc7, 0x8b, 0x69, 0xc7, 0xb5, 0x3f, 0xc4, 0xb9, - 0xc3, 0xa7, 0xc2, 0xa7, 0xcd, 0xb3, 0xc3, 0xa2, 0xc2, 0xb9, 0xc5, 0xbb, 0xc4, 0x8b, - 0xce, 0x88, 0x74, 0xc4, 0x94, 0xc2, 0xa2, 0xc6, 0x81, 0xc8, 0xb9, 0xc3, 0xb8, 0xc4, - 0xae, 0xc7, 0xb1, 0xc6, 0xb1, 0xc8, 0xa5, 0xc6, 0x9b, 0xc2, 0xaa, 0xe1, 0x9b, 0xa6, - 0xe2, 0xb1, 0xb4, 0xc3, 0xb5, 0xc3, 0xaf, 0xc4, 0xb7, 0xc2, 0xa3, 0xc8, 0xb7, 0x55, - 0xc4, 0xb0, 0xe1, 0x9a, 0xad, 0xc5, 0x8f, 0xc8, 0x9e, 0xc6, 0xa0, 0xc8, 0x9c, 0xc7, - 0xad, 0xe1, 0x9b, 0x8b, 0xc7, 0xbb, 0x62, 0xe2, 0xb1, 0xba, 0xc6, 0xb1, 0xc6, 0x94, - 0xc8, 0x84, 0xe1, 0x9b, 0x9b, 0xc7, 0xa8, 0xc3, 0x8d, 0xc7, 0x8c, 0xce, 0x87, 0xc7, - 0xa1, 0xc4, 0x89, 0xc7, 0xb8, 0x4e, 0xc2, 0xb0, 0xc6, 0x8a, 0xe2, 0xb1, 0xb0, 0xc9, - 0x8e, 0x2e, 0xe2, 0xb1, 0xb3, 0xc8, 0x9d, 0xc5, 0x90, 0xe1, 0x9b, 0xa8, 0xc5, 0xac, - 0xc3, 0x98, 0x72, 0xc4, 0xb1, 0xc4, 0x9f, 0x69, 0xe1, 0x9b, 0x8f, 0x7e, 0xc3, 0xaf, - 0xc7, 0x97, 0xc8, 0x96, 0xc3, 0x8a, 0xe1, 0x9b, 0xa2, 0xc6, 0xb8, 0xc7, 0x80, 0xc8, - 0xbc, 0x7d, 0xce, 0x87, 0x47, 0xc4, 0xad, 0xc4, 0xb8, 0xc8, 0xa4, 0xe1, 0x9b, 0xad, - 0xc7, 0x8a, 0xc3, 0x9c, 0xc2, 0xba, 0xe1, 0x9b, 0x9f, 0xe1, 0x9b, 0x86, 0xc2, 0xaa, - 0xc4, 0xaf, 0xc8, 0x84, 0x28, 0x6c, 0xc2, 0xb9, 0xe1, 0x9b, 0xa6, 0xe1, 0x9b, 0xac, - 0xc3, 0xa5, 0x53, 0xc2, 0xa6, 0xc2, 0xa2, 0xe1, 0x9b, 0xa3, 0x57, 0xc9, 0x84, 0xc4, - 0xa5, 0xc5, 0x8a, 0x7d, 0xc2, 0xb1, 0x66, 0xc8, 0x86, 0xc8, 0xb3, 0xc8, 0x8d, 0xe1, - 0x9b, 0xae, 0xe2, 0xb1, 0xad, 0xc5, 0xb1, 0x55, 0xc8, 0x89, 0xc8, 0x8f, 0xc6, 0xa7, - 0xc4, 0xbd, 0xe2, 0xb1, 0xb4, 0xc4, 0xb6, 0x34, 0xc7, 0xb8, 0xc3, 0x86, 0xc7, 0xad, - 0xc4, 0x88, 0xc8, 0xa9, 0xc8, 0x8f, 0xc8, 0x80, - ], - asset_base: [ - 0xd6, 0x96, 0x5d, 0xaf, 0xad, 0x0f, 0xc5, 0xb1, 0x1a, 0x16, 0xc3, 0xc4, 0x0b, 0x27, - 0xc2, 0x10, 0x4c, 0xf9, 0x99, 0x7a, 0x43, 0x56, 0xa3, 0x82, 0xbb, 0xd7, 0xd4, 0xd2, - 0xcc, 0x84, 0x84, 0x9c, - ], - }, - TestVector { - key: [ - 0x68, 0x89, 0x11, 0x8f, 0xa9, 0xe7, 0xda, 0xf2, 0x76, 0xfd, 0x62, 0xcb, 0x66, 0x5a, - 0xbf, 0x50, 0x72, 0x20, 0x15, 0xc2, 0xa0, 0x8b, 0x13, 0xf7, 0x7d, 0x20, 0x24, 0x75, - 0x96, 0x26, 0xc5, 0x03, - ], - description: [ - 0x2b, 0xc2, 0xbe, 0xe1, 0x9b, 0x94, 0xe2, 0xb1, 0xad, 0xc2, 0xa8, 0xc4, 0x9a, 0xc3, - 0x8c, 0xe2, 0xb1, 0xaa, 0xc7, 0x83, 0x6a, 0xc8, 0xbf, 0xc6, 0xbd, 0xc4, 0xa6, 0xc2, - 0xa2, 0xc5, 0x8e, 0xc8, 0x9e, 0xce, 0x89, 0xc5, 0xa1, 0xc6, 0xb8, 0xc8, 0x89, 0xe1, - 0x9a, 0xaf, 0xc8, 0xa1, 0xc9, 0x8e, 0xc3, 0xbf, 0xc7, 0xbc, 0x64, 0x72, 0xc4, 0xbb, - 0xc6, 0x9a, 0xc6, 0x97, 0x2a, 0xc3, 0xb4, 0x4f, 0x4b, 0xc4, 0xa2, 0xc3, 0x93, 0xe2, - 0xb1, 0xba, 0xe2, 0xb1, 0xb5, 0x37, 0xe1, 0x9b, 0x9a, 0xc2, 0xbb, 0xc5, 0x94, 0xc7, - 0xb8, 0xc5, 0x93, 0xc6, 0xa2, 0xc8, 0xa9, 0xc6, 0xa2, 0x5f, 0xc5, 0xb7, 0xc3, 0xae, - 0xc3, 0x98, 0xc6, 0x89, 0xc8, 0xa1, 0xc8, 0x87, 0xc4, 0x9c, 0xe2, 0xb1, 0xb5, 0xc7, - 0xb3, 0xc3, 0x9e, 0xc7, 0x8c, 0xc8, 0xa4, 0xe1, 0x9a, 0xa4, 0xe1, 0x9b, 0x9f, 0xe1, - 0x9b, 0x9a, 0xc8, 0x9c, 0xc7, 0xa4, 0xc3, 0xac, 0x47, 0x56, 0xe1, 0x9a, 0xae, 0x7e, - 0xc7, 0x8b, 0xc8, 0x9e, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, 0x84, 0x73, 0xc7, 0x93, 0xc5, - 0xba, 0x6f, 0xe2, 0xb1, 0xb0, 0xc4, 0xa0, 0xe1, 0x9b, 0x89, 0xe1, 0x9a, 0xb6, 0xc3, - 0x82, 0xe1, 0x9a, 0xbd, 0xc9, 0x8b, 0xc7, 0xb8, 0xe2, 0xb1, 0xaf, 0xc5, 0xba, 0x21, - 0xc3, 0x9c, 0x3c, 0xe1, 0x9b, 0x96, 0xc8, 0xac, 0x6e, 0xc5, 0x8d, 0xe1, 0x9b, 0x80, - 0xc3, 0xab, 0xc5, 0x85, 0xc4, 0xab, 0x6b, 0xc5, 0x90, 0xc8, 0x99, 0xe1, 0x9b, 0x99, - 0xc8, 0x84, 0xc3, 0xbb, 0xc8, 0x82, 0xc8, 0xa1, 0xc3, 0x92, 0xc7, 0x9d, 0xc4, 0xaf, - 0xc6, 0xaa, 0x61, 0xc5, 0x82, 0xc7, 0xb9, 0xc7, 0xa1, 0xce, 0x89, 0xc8, 0xb2, 0xe1, - 0x9b, 0xa8, 0xc7, 0x8d, 0xcd, 0xbe, 0x67, 0xc9, 0x87, 0xc4, 0xba, 0x43, 0xc7, 0xa2, - 0xc6, 0xb1, 0xe1, 0x9a, 0xad, 0xc5, 0x83, 0xc3, 0xb0, 0xc5, 0xb2, 0xc6, 0x9a, 0x3e, - 0xc4, 0xb8, 0xc2, 0xb9, 0xc8, 0xa1, 0xc6, 0x93, 0xc7, 0xa5, 0x6a, 0xc5, 0xa9, 0xc4, - 0xa7, 0xc8, 0xb6, 0xc3, 0xa6, 0xc4, 0xb2, 0xc8, 0x8d, 0xcd, 0xb1, 0x41, 0xc6, 0x85, - 0xc7, 0x84, 0xc4, 0x83, 0xe1, 0x9b, 0xa9, 0xc2, 0xb5, 0x52, 0xc5, 0x80, 0xe1, 0x9b, - 0x83, 0xc6, 0xbb, 0xc5, 0x8e, 0xe1, 0x9a, 0xa4, 0xc2, 0xa6, 0xe1, 0x9b, 0xa3, 0xe1, - 0x9a, 0xbd, 0xe1, 0x9b, 0xaf, 0xc4, 0xba, 0xe2, 0xb1, 0xa6, 0xc3, 0x89, 0x5a, 0xc4, - 0xa9, 0xe1, 0x9a, 0xba, 0x5d, 0xc6, 0x9f, 0xc4, 0xa8, 0xc4, 0xa3, 0xc5, 0x9f, 0xc6, - 0x8e, 0xe2, 0xb1, 0xb8, 0xc8, 0x9b, 0xe2, 0xb1, 0xa5, 0xc6, 0x9d, 0xe1, 0x9a, 0xaa, - 0xe1, 0x9b, 0x98, 0xc2, 0xa1, 0xc2, 0xb4, 0xc6, 0x87, 0xc7, 0x93, 0xc6, 0x88, 0xe1, - 0x9a, 0xb3, 0xc4, 0x98, 0xc2, 0xb1, 0xc8, 0x91, 0xc3, 0xb5, 0x62, 0xc7, 0xb8, 0xe1, - 0x9b, 0x94, 0xc3, 0x87, 0xc4, 0xa7, 0xc8, 0x8a, 0xc5, 0x95, 0xe1, 0x9b, 0xb0, 0xc4, - 0x98, 0xe2, 0xb1, 0xb3, 0xc5, 0xac, 0xcd, 0xb3, 0xc6, 0xbb, 0xc7, 0xbf, 0xc4, 0xbe, - 0xc3, 0x98, 0xcd, 0xba, 0x5d, 0xc3, 0x9e, 0x5a, 0xc4, 0x8c, 0x3e, 0x3f, 0x76, 0xc7, - 0x8a, 0xe1, 0x9a, 0xbf, 0xc6, 0xa6, 0xe1, 0x9b, 0x95, 0x77, 0xc7, 0xb2, 0xe1, 0x9b, - 0x91, 0xc8, 0x84, 0xe2, 0xb1, 0xa3, 0xc7, 0x82, 0xc4, 0x87, 0x70, 0xe1, 0x9a, 0xb1, - 0xc6, 0x91, 0xe1, 0x9a, 0xba, 0xc5, 0xa4, 0xc8, 0x8c, 0x59, 0xc4, 0xaa, 0xc6, 0x9a, - 0xc7, 0xb0, 0xc3, 0x87, 0xc7, 0xb6, 0xc6, 0x80, 0x3c, 0xcd, 0xb4, 0xc4, 0x8d, 0x71, - 0xe1, 0x9b, 0x9b, 0xe2, 0xb1, 0xb6, 0xc6, 0xb9, 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xba, - 0xc7, 0xb2, 0xc8, 0xa4, 0xe1, 0x9a, 0xa2, 0x5a, - ], - asset_base: [ - 0x98, 0x06, 0x94, 0xc0, 0xcc, 0x2c, 0x02, 0x1c, 0xa3, 0x57, 0xa6, 0x06, 0x25, 0x2e, - 0x7e, 0x66, 0x90, 0xed, 0xa5, 0xea, 0x56, 0xc4, 0xfb, 0x57, 0x32, 0xdd, 0x0b, 0x8b, - 0xbf, 0xf0, 0x3b, 0x9d, - ], - }, - TestVector { - key: [ - 0x7a, 0xb9, 0xe5, 0xa6, 0x04, 0x28, 0x8a, 0x55, 0x0b, 0x9e, 0x08, 0x7a, 0x00, 0x4b, - 0xb8, 0x8b, 0xe4, 0xb2, 0xb4, 0x8d, 0xb3, 0x3f, 0xb0, 0x80, 0x97, 0xf8, 0xbc, 0x64, - 0x60, 0x3e, 0xf8, 0x1f, - ], - description: [ - 0xc2, 0xb3, 0xe2, 0xb1, 0xb3, 0xc4, 0xab, 0xe1, 0x9b, 0x81, 0xe1, 0x9a, 0xbc, 0xc7, - 0x82, 0xc3, 0xa6, 0xc7, 0x94, 0xc4, 0x8a, 0xc7, 0x8f, 0xc6, 0xaf, 0xc7, 0xaf, 0xc3, - 0xbe, 0xe1, 0x9a, 0xa7, 0xc6, 0x88, 0xc6, 0xb2, 0xc6, 0xab, 0xc4, 0x98, 0xc6, 0xb4, - 0xc7, 0x9b, 0xc7, 0xbb, 0xe1, 0x9b, 0xa1, 0xc5, 0xba, 0xc4, 0xb3, 0xc8, 0xb5, 0xe1, - 0x9b, 0x97, 0xc5, 0xb7, 0xc8, 0x89, 0x35, 0x66, 0xcd, 0xba, 0xc6, 0xb2, 0xc6, 0xac, - 0x29, 0xe2, 0xb1, 0xa9, 0xc8, 0xb4, 0xc3, 0xa5, 0x7d, 0xc8, 0xa0, 0xc3, 0x9a, 0xc8, - 0xaf, 0xc8, 0x82, 0xc3, 0xa4, 0xc4, 0xb5, 0x37, 0xe1, 0x9b, 0xa0, 0xc4, 0x8e, 0x32, - 0xc5, 0xb2, 0xc4, 0x90, 0xc5, 0xbb, 0xe1, 0x9b, 0x8d, 0xc7, 0x8a, 0xe1, 0x9a, 0xb2, - 0xc6, 0xbb, 0xc7, 0xa5, 0xc2, 0xbe, 0xe1, 0x9b, 0x96, 0xc3, 0x91, 0xc6, 0x86, 0xe1, - 0x9b, 0xa7, 0xc5, 0x93, 0xc3, 0xb5, 0x59, 0xc6, 0x9a, 0xc7, 0x9c, 0xe1, 0x9a, 0xb8, - 0xc6, 0x83, 0xe2, 0xb1, 0xb9, 0x59, 0xc9, 0x8b, 0xc4, 0x90, 0xc6, 0x92, 0xc2, 0xbf, - 0xc7, 0xbf, 0xc6, 0x97, 0x61, 0x37, 0xc8, 0xbc, 0xc2, 0xbd, 0xc5, 0xb7, 0xc5, 0xa3, - 0xc4, 0xa4, 0xc7, 0x96, 0xc6, 0x84, 0xc6, 0xb6, 0xc4, 0x83, 0x42, 0xc8, 0xba, 0xc7, - 0x94, 0xe1, 0x9b, 0xa2, 0xc3, 0xbf, 0xc6, 0xb5, 0xc6, 0x94, 0x7c, 0xc2, 0xbc, 0x5e, - 0xc3, 0xa6, 0xe1, 0x9a, 0xb6, 0xc9, 0x8b, 0xc4, 0x83, 0xc8, 0x9b, 0xc8, 0x9d, 0xc3, - 0xb3, 0xc8, 0xb6, 0xe1, 0x9b, 0xa8, 0xc2, 0xbd, 0xe1, 0x9b, 0xa3, 0xc8, 0x8f, 0x26, - 0xe1, 0x9b, 0x8d, 0xc8, 0x88, 0xc6, 0xbd, 0x6a, 0xc3, 0x8b, 0xc5, 0x91, 0xc4, 0xb1, - 0xce, 0x89, 0x4b, 0xc5, 0xb1, 0xe1, 0x9b, 0x8c, 0xc3, 0x9f, 0xc4, 0xb8, 0xc3, 0x98, - 0xe1, 0x9b, 0x91, 0xc7, 0xa9, 0xc8, 0x9c, 0xc5, 0x93, 0xc6, 0xb0, 0xe1, 0x9b, 0x89, - 0x6c, 0xe1, 0x9b, 0xa4, 0x4a, 0xc6, 0xad, 0xc7, 0x92, 0xc3, 0x88, 0x71, 0xc6, 0xa0, - 0xc6, 0x9f, 0xe1, 0x9b, 0x94, 0xc4, 0xbe, 0xc5, 0x84, 0xc4, 0x9e, 0xc2, 0xb6, 0xcd, - 0xb7, 0xc4, 0xa6, 0xc7, 0xbb, 0xc3, 0x97, 0xc7, 0x87, 0xc4, 0x94, 0x75, 0x43, 0xc6, - 0xbd, 0xc3, 0xb1, 0xc8, 0x92, 0xc3, 0x93, 0xc7, 0x8d, 0x65, 0xc8, 0x8a, 0xe1, 0x9a, - 0xbf, 0xc8, 0xb5, 0xe2, 0xb1, 0xb0, 0xc7, 0x8d, 0x2f, 0x3f, 0xc3, 0xa9, 0xc8, 0xa1, - 0xc5, 0xa0, 0xc4, 0xa1, 0xc7, 0x87, 0xc2, 0xa6, 0x52, 0xc5, 0x89, 0xe1, 0x9b, 0xaf, - 0xc8, 0x84, 0xc5, 0xa3, 0xc7, 0x95, 0xc8, 0xa5, 0xc5, 0xb5, 0xc4, 0xa1, 0x79, 0xe1, - 0x9a, 0xba, 0xc8, 0x97, 0xc3, 0x94, 0xc5, 0x80, 0xe1, 0x9b, 0x88, 0x4b, 0x68, 0xc7, - 0x89, 0xc5, 0x98, 0x4e, 0xc4, 0xb9, 0xe1, 0x9b, 0xab, 0xc4, 0x95, 0xc6, 0xa0, 0xe1, - 0x9b, 0xa5, 0x24, 0xc6, 0x85, 0xc3, 0x93, 0xc6, 0x98, 0x6c, 0xc8, 0x94, 0xc5, 0xaa, - 0xc4, 0x94, 0xc3, 0xaf, 0xc4, 0xb6, 0x46, 0xc5, 0x90, 0xc4, 0x91, 0xc6, 0x97, 0xce, - 0x8a, 0xc7, 0xb9, 0xc6, 0xa7, 0xc3, 0x81, 0xc6, 0xa1, 0xc7, 0x82, 0xcd, 0xbc, 0xc6, - 0x82, 0xc2, 0xb9, 0xc5, 0xa7, 0xc5, 0xa3, 0xc9, 0x84, 0xc4, 0x8e, 0xc8, 0x9b, 0xe2, - 0xb1, 0xae, 0xe1, 0x9a, 0xbe, 0xc7, 0xb8, 0xe2, 0xb1, 0xb4, 0xe2, 0xb1, 0xba, 0xc4, - 0xb6, 0xc7, 0x8d, 0xe2, 0xb1, 0xb1, 0xc7, 0xbf, 0x50, 0xc5, 0x9f, 0xc6, 0x9d, 0xc5, - 0xa4, 0xc6, 0xb2, 0xc7, 0x83, 0x76, 0x68, 0xc8, 0x90, 0xc3, 0xaa, 0xc8, 0x8b, 0xc8, - 0x86, 0xc5, 0xba, 0x76, 0xcd, 0xb1, 0xc6, 0xa7, 0xc6, 0xa7, 0xc6, 0x84, 0xe1, 0x9b, - 0xa7, 0xc9, 0x8c, 0xc9, 0x89, 0x53, 0xc4, 0xb5, - ], - asset_base: [ - 0xc1, 0x69, 0x63, 0x4b, 0xf8, 0x47, 0x9d, 0x3d, 0x09, 0x47, 0x76, 0x4f, 0xbd, 0x30, - 0x3c, 0x31, 0xdc, 0x10, 0xb0, 0xa2, 0x81, 0x39, 0x1f, 0x5a, 0xde, 0xac, 0xf8, 0x2a, - 0xae, 0xce, 0xf3, 0xbe, - ], - }, - TestVector { - key: [ - 0xa2, 0x4a, 0x5b, 0x4b, 0x0c, 0x62, 0xe0, 0xfb, 0x6f, 0x01, 0xdb, 0x56, 0x7c, 0x33, - 0x3e, 0x12, 0x82, 0xe3, 0x70, 0xa6, 0x6f, 0x16, 0x8a, 0xe7, 0xf7, 0x7a, 0x3f, 0x16, - 0xaf, 0x40, 0x8d, 0x12, - ], - description: [ - 0xc8, 0xa5, 0xc4, 0xb5, 0xc8, 0xb7, 0xc6, 0xa8, 0x2e, 0xc7, 0xa8, 0xc7, 0xb0, 0x52, - 0xc7, 0xac, 0xc8, 0xbf, 0x79, 0xe1, 0x9a, 0xba, 0xe1, 0x9b, 0x83, 0xc3, 0xa9, 0xc4, - 0x90, 0xc7, 0x90, 0xc3, 0x80, 0xe1, 0x9b, 0x93, 0xe1, 0x9a, 0xad, 0x58, 0xc7, 0x9b, - 0xc5, 0x85, 0x69, 0xc5, 0x90, 0xc2, 0xb8, 0xc5, 0x92, 0xc4, 0xaa, 0xc2, 0xa5, 0xc4, - 0xaa, 0xc3, 0xa9, 0xc6, 0xaa, 0xc8, 0xa1, 0xc5, 0x8b, 0xc2, 0xbf, 0xe1, 0x9b, 0xa3, - 0xcd, 0xb4, 0xc5, 0xb9, 0xc7, 0x95, 0x32, 0xc7, 0xba, 0xc5, 0x8f, 0xc2, 0xbb, 0xc3, - 0xb4, 0xe2, 0xb1, 0xb0, 0xc8, 0xb6, 0xe1, 0x9a, 0xbd, 0xc4, 0xa7, 0xc5, 0xad, 0xc4, - 0x9e, 0xe1, 0x9a, 0xb5, 0xc6, 0xae, 0xc3, 0xb9, 0xc3, 0x89, 0xc7, 0xba, 0xc3, 0x90, - 0xc7, 0xb4, 0xc3, 0xbe, 0xe2, 0xb1, 0xb7, 0xc6, 0x90, 0xc5, 0x83, 0xc8, 0xba, 0xc5, - 0x89, 0xc5, 0xa9, 0xc9, 0x86, 0x4d, 0x53, 0xcd, 0xb5, 0xc2, 0xb0, 0xc2, 0xb5, 0xc6, - 0x9b, 0x7a, 0xc4, 0x8f, 0xc3, 0x96, 0x45, 0xc3, 0xab, 0xc5, 0x8d, 0x4c, 0xc4, 0x81, - 0xe1, 0x9b, 0xad, 0xc8, 0x93, 0xe2, 0xb1, 0xbb, 0x5a, 0xc5, 0xaf, 0xc7, 0xa3, 0x71, - 0xc6, 0xa1, 0xe1, 0x9b, 0xaf, 0xc5, 0x84, 0xc6, 0x86, 0xc7, 0xa0, 0xc2, 0xae, 0xc4, - 0xac, 0xcd, 0xbb, 0xc4, 0x8e, 0xc6, 0x9c, 0xc8, 0x85, 0xc2, 0xa4, 0xc5, 0x85, 0xc8, - 0x9b, 0xc6, 0x87, 0xe1, 0x9b, 0xad, 0xc3, 0x80, 0xc4, 0xb5, 0xe2, 0xb1, 0xbb, 0xc5, - 0x9b, 0xc7, 0xb6, 0xc2, 0xb5, 0xc7, 0x8c, 0xc5, 0x86, 0xc6, 0xa8, 0xc5, 0xb7, 0xe1, - 0x9b, 0xa2, 0xc7, 0x90, 0xc2, 0xb0, 0x2e, 0xc5, 0x95, 0xe1, 0x9b, 0x82, 0xc5, 0x89, - 0xc4, 0xa3, 0xe1, 0x9b, 0x87, 0x3c, 0xc9, 0x84, 0x46, 0x2c, 0xe2, 0xb1, 0xbb, 0xe1, - 0x9b, 0x8c, 0xc3, 0xb2, 0xc6, 0xa1, 0xc6, 0x85, 0x31, 0x45, 0xe2, 0xb1, 0xa9, 0xc5, - 0x8c, 0xc6, 0x88, 0xce, 0x84, 0xc5, 0x93, 0xc5, 0xa9, 0xe1, 0x9a, 0xa7, 0xcd, 0xb6, - 0xe1, 0x9b, 0xae, 0xc8, 0xa3, 0x5f, 0xe1, 0x9b, 0x94, 0xe1, 0x9b, 0xac, 0xc5, 0xbb, - 0xc7, 0xa2, 0xc6, 0x99, 0xc7, 0xbb, 0xc5, 0xbf, 0xc4, 0x95, 0xc7, 0x94, 0xe1, 0x9a, - 0xb8, 0xe2, 0xb1, 0xaf, 0xc9, 0x8a, 0xc7, 0x9d, 0xc8, 0x88, 0x7e, 0xc9, 0x88, 0x3e, - 0x21, 0x3e, 0xc5, 0xba, 0xc4, 0x9a, 0x30, 0xc9, 0x87, 0xc5, 0x9c, 0x44, 0xc4, 0xa6, - 0xc3, 0xad, 0xc5, 0x90, 0xc4, 0xa7, 0xc7, 0x9b, 0x3c, 0x58, 0xc4, 0x89, 0xc5, 0x9e, - 0xc5, 0x93, 0xe1, 0x9a, 0xbf, 0xc8, 0xb3, 0xe1, 0x9a, 0xb3, 0xc2, 0xa2, 0xc8, 0xbc, - 0xc6, 0xa6, 0x24, 0xe1, 0x9a, 0xba, 0xc6, 0xae, 0xe1, 0x9a, 0xa0, 0x57, 0xc6, 0x9a, - 0xc2, 0xbc, 0xc8, 0xbc, 0xc2, 0xb0, 0xc3, 0xa5, 0xc5, 0x81, 0xc3, 0xba, 0xe2, 0xb1, - 0xa5, 0xc7, 0xbf, 0xc4, 0xae, 0xc8, 0xae, 0xc2, 0xa6, 0xc6, 0xad, 0xc7, 0x82, 0xc3, - 0xba, 0xc5, 0x9d, 0xc3, 0x96, 0xc7, 0x93, 0xc7, 0xb9, 0xc4, 0xa7, 0xc7, 0xba, 0xc2, - 0xb1, 0xcd, 0xb7, 0xc4, 0xa8, 0xe2, 0xb1, 0xac, 0xe1, 0x9b, 0x89, 0xe2, 0xb1, 0xbc, - 0xc6, 0xb3, 0xc8, 0x9b, 0xc8, 0xbb, 0xe1, 0x9a, 0xa1, 0xc2, 0xa1, 0xc7, 0x81, 0xc8, - 0x98, 0xc4, 0x9b, 0xe1, 0x9a, 0xb8, 0xc6, 0x9f, 0xc2, 0xa7, 0xc5, 0x85, 0xc3, 0xb8, - 0xc7, 0x97, 0xc9, 0x83, 0xc9, 0x89, 0xc7, 0x90, 0xc8, 0xbf, 0xc8, 0xaa, 0xc8, 0x8a, - 0xc6, 0x9a, 0xc5, 0x81, 0xc7, 0x9e, 0x4b, 0xc3, 0x90, 0xc6, 0xa8, 0xe1, 0x9b, 0x9c, - 0xc8, 0x94, 0xc7, 0x9c, 0xc5, 0x90, 0xc4, 0x9b, 0xe1, 0x9b, 0x9d, 0xe1, 0x9b, 0xb0, - 0xe1, 0x9a, 0xa2, 0xc6, 0xb8, 0x61, 0x5a, 0x5a, - ], - asset_base: [ - 0xed, 0x3b, 0xad, 0xc9, 0x6d, 0xc0, 0x5f, 0x5f, 0x70, 0x48, 0xcc, 0x86, 0xd9, 0xea, - 0xe7, 0x59, 0x9b, 0x57, 0xd8, 0x61, 0xbe, 0x33, 0x15, 0x4e, 0x3b, 0x88, 0xc3, 0xc6, - 0x86, 0xb2, 0x82, 0xbb, - ], - }, - TestVector { - key: [ - 0xbe, 0xb4, 0x9a, 0x61, 0x01, 0x0b, 0x35, 0x51, 0xbc, 0x5c, 0xb2, 0xdb, 0xbc, 0xa6, - 0x0b, 0x20, 0xb5, 0x31, 0x6e, 0x42, 0x21, 0xdc, 0x9c, 0xed, 0xb8, 0xc3, 0xc4, 0x62, - 0xc1, 0xca, 0xcd, 0x02, - ], - description: [ - 0x79, 0x60, 0xc6, 0xb7, 0xc3, 0x8a, 0xc7, 0xb3, 0xe2, 0xb1, 0xbd, 0xc6, 0x85, 0xc6, - 0xb3, 0xc7, 0x9d, 0xe1, 0x9a, 0xa6, 0xc7, 0xba, 0xc4, 0xb8, 0xe1, 0x9b, 0xa1, 0xc3, - 0xbe, 0xe2, 0xb1, 0xb4, 0x7c, 0xe2, 0xb1, 0xae, 0xc8, 0x90, 0xc5, 0xab, 0xc5, 0xbc, - 0x4f, 0xc5, 0xb8, 0x6c, 0x5f, 0xe1, 0x9a, 0xbf, 0xc5, 0x8a, 0xe1, 0x9b, 0xa7, 0xc8, - 0xbc, 0xc8, 0x9b, 0xc3, 0xa7, 0xc5, 0xa6, 0xc4, 0xac, 0xe2, 0xb1, 0xab, 0x38, 0xc7, - 0x99, 0x54, 0xe2, 0xb1, 0xb6, 0x50, 0xc5, 0x8c, 0xe2, 0xb1, 0xb0, 0xc5, 0xb7, 0xc5, - 0x86, 0xc5, 0xa8, 0x3e, 0xc8, 0x88, 0xc4, 0xb5, 0xc5, 0x9c, 0xc7, 0x9b, 0xe1, 0x9b, - 0x8a, 0xc3, 0x97, 0xc8, 0xba, 0xe1, 0x9a, 0xa8, 0xc6, 0xb8, 0xc2, 0xa3, 0xe1, 0x9b, - 0x82, 0xe1, 0x9b, 0xa5, 0xc2, 0xae, 0xc8, 0x94, 0xe1, 0x9b, 0xa8, 0xc6, 0xb4, 0xc8, - 0xb9, 0xc3, 0xaf, 0xc6, 0xab, 0xc3, 0x91, 0xe2, 0xb1, 0xb3, 0xc4, 0xb6, 0xc5, 0xbf, - 0xc4, 0x8d, 0x43, 0xc6, 0xa0, 0xc4, 0xb3, 0xc6, 0x98, 0xc5, 0xbc, 0xc6, 0x9a, 0xc6, - 0xb3, 0xc3, 0x91, 0xc3, 0xa2, 0xc8, 0xa7, 0xc8, 0x9c, 0xc7, 0xb4, 0x43, 0xc7, 0x82, - 0xc2, 0xbe, 0xc7, 0xbf, 0xe1, 0x9a, 0xa9, 0xc3, 0xb2, 0xc4, 0xb2, 0xc8, 0xb0, 0xc7, - 0x80, 0xc6, 0xac, 0xc3, 0xb7, 0xc5, 0x91, 0xe1, 0x9b, 0x8f, 0xc8, 0xbb, 0xc3, 0x9f, - 0xc6, 0xa5, 0x7b, 0xc3, 0xb9, 0xcd, 0xb0, 0xe1, 0x9b, 0xa2, 0xc8, 0x8f, 0xc5, 0xa9, - 0xcd, 0xbd, 0xc8, 0x90, 0xcd, 0xb3, 0xe1, 0x9b, 0xa9, 0xc8, 0x82, 0xc3, 0xb6, 0xe1, - 0x9b, 0xa9, 0xc2, 0xb4, 0xc4, 0x9f, 0xc9, 0x8e, 0xc6, 0x8a, 0x37, 0xc7, 0x93, 0xc6, - 0x96, 0xc3, 0xa8, 0xc2, 0xae, 0xce, 0x84, 0xe2, 0xb1, 0xb2, 0xc2, 0xb6, 0xc5, 0x95, - 0xe2, 0xb1, 0xba, 0xc4, 0xa2, 0xc6, 0xbb, 0xc8, 0x93, 0xc3, 0x9f, 0xc5, 0xb0, 0xc5, - 0xb8, 0xe1, 0x9b, 0x8f, 0xc7, 0xb4, 0xc7, 0xaa, 0xc2, 0xb0, 0xe1, 0x9a, 0xb3, 0x5f, - 0xc6, 0xb1, 0xc8, 0x93, 0xc4, 0xb8, 0xe1, 0x9a, 0xa0, 0xc7, 0x9f, 0xc2, 0xb6, 0xe1, - 0x9b, 0xa2, 0xc8, 0x86, 0xe1, 0x9a, 0xa6, 0xc5, 0x8d, 0xc8, 0x89, 0xe1, 0x9a, 0xa4, - 0x44, 0xc5, 0xb3, 0xc8, 0x89, 0x5d, 0xc4, 0xa8, 0xc2, 0xa1, 0xcd, 0xbc, 0xc3, 0x88, - 0xc6, 0xb2, 0xe1, 0x9b, 0xa9, 0x26, 0xc8, 0xbb, 0xc3, 0xb9, 0xe1, 0x9b, 0x99, 0xc5, - 0xb2, 0x40, 0xc3, 0x8d, 0xc9, 0x8c, 0x5e, 0xe2, 0xb1, 0xa9, 0xc7, 0x9a, 0xe1, 0x9b, - 0xa1, 0xc4, 0x9a, 0xe1, 0x9b, 0x85, 0xc9, 0x80, 0xe1, 0x9a, 0xbf, 0xc3, 0x81, 0xe1, - 0x9b, 0x8e, 0xc8, 0x92, 0xe1, 0x9a, 0xaa, 0xc6, 0xac, 0xc9, 0x8f, 0xc7, 0x88, 0x3e, - 0xc3, 0xa8, 0xc3, 0xba, 0xc8, 0x96, 0xc6, 0xa2, 0xc7, 0x9e, 0xc8, 0x81, 0xc6, 0xac, - 0xc6, 0x85, 0xc8, 0xb6, 0xc8, 0x91, 0xc7, 0x99, 0xc6, 0x89, 0xc4, 0xae, 0xe1, 0x9b, - 0x8c, 0xe1, 0x9b, 0xad, 0xe1, 0x9b, 0xae, 0xc2, 0xb3, 0xc5, 0xa3, 0xc2, 0xa8, 0xc5, - 0xbc, 0xc3, 0xa7, 0xc8, 0xb6, 0xc6, 0xb1, 0xc8, 0x9e, 0xc6, 0x87, 0xc6, 0x80, 0x61, - 0xc6, 0xb3, 0x5c, 0xe1, 0x9a, 0xb0, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, 0xaa, 0x25, 0xcd, - 0xb4, 0xc7, 0x89, 0x28, 0xc6, 0x8d, 0x6e, 0x40, 0xc7, 0xb6, 0xc7, 0x9e, 0xc6, 0x93, - 0x2d, 0xc7, 0xaf, 0xc6, 0x86, 0xc6, 0xbf, 0xc6, 0x9a, 0xc7, 0x82, 0xc6, 0x8c, 0xc7, - 0xaa, 0xe2, 0xb1, 0xa4, 0xc7, 0xa9, 0x32, 0x75, 0xc8, 0x98, 0xc8, 0xb7, 0xe2, 0xb1, - 0xb5, 0xc5, 0x89, 0xc2, 0xb4, 0xc8, 0xb8, 0xc6, 0xad, 0xc4, 0x9a, 0xe2, 0xb1, 0xb3, - 0xc3, 0x84, 0xc2, 0xb0, 0xc8, 0xa4, 0xc6, 0xb3, - ], - asset_base: [ - 0xb2, 0xd8, 0x44, 0xfe, 0xe4, 0x40, 0xbd, 0x64, 0x96, 0xd3, 0x1d, 0x5e, 0xdb, 0xee, - 0x95, 0x62, 0x3d, 0x19, 0x0e, 0xb3, 0x48, 0x4c, 0x48, 0x71, 0x0c, 0x76, 0x2f, 0x21, - 0x5b, 0x68, 0x4d, 0xbf, - ], - }, - TestVector { - key: [ - 0xb7, 0x0b, 0xb2, 0x77, 0xc0, 0x83, 0xf2, 0x95, 0x37, 0x6a, 0x02, 0xb3, 0x98, 0x76, - 0xae, 0x35, 0xfb, 0x26, 0x62, 0x3d, 0x9d, 0x6a, 0x55, 0xa5, 0x63, 0xf7, 0x85, 0xa6, - 0x5b, 0xc5, 0xa8, 0x27, - ], - description: [ - 0xc7, 0x96, 0xc8, 0xad, 0xc4, 0xbd, 0xe1, 0x9b, 0x9b, 0xe1, 0x9b, 0x96, 0xe2, 0xb1, - 0xb2, 0xc3, 0x8f, 0xe1, 0x9b, 0x91, 0xc5, 0x85, 0xe1, 0x9a, 0xa2, 0xc4, 0xba, 0xc3, - 0xa8, 0xc3, 0xaa, 0xc3, 0xa9, 0xc8, 0x93, 0xc8, 0x9b, 0xc8, 0x80, 0xc4, 0xa5, 0xc5, - 0xa9, 0xc4, 0x90, 0x6f, 0xc2, 0xaf, 0xc3, 0x95, 0xc6, 0xa6, 0xc8, 0x86, 0xe1, 0x9a, - 0xbd, 0xc8, 0x87, 0xc7, 0x97, 0xc6, 0xaa, 0x79, 0x52, 0xc7, 0x89, 0xc2, 0xa1, 0xc4, - 0xa7, 0xc9, 0x8d, 0x53, 0xc8, 0x89, 0xc7, 0xa4, 0xe1, 0x9b, 0x84, 0xc5, 0xac, 0x79, - 0xc8, 0xbc, 0xc4, 0xb0, 0xc6, 0xa9, 0xe1, 0x9a, 0xa4, 0xe2, 0xb1, 0xb6, 0xc7, 0x86, - 0xc4, 0x9b, 0x72, 0xc7, 0x88, 0xc2, 0xbc, 0xe1, 0x9a, 0xa4, 0xcd, 0xb0, 0xc6, 0xb7, - 0xe1, 0x9b, 0x80, 0xe2, 0xb1, 0xb8, 0xc5, 0x89, 0xc9, 0x84, 0x35, 0xc3, 0xa3, 0xe1, - 0x9b, 0x90, 0xc7, 0x9c, 0x31, 0xc5, 0x9a, 0xc5, 0xa9, 0xc8, 0x88, 0xce, 0x8c, 0xc4, - 0x88, 0xc4, 0x95, 0xc8, 0xaa, 0x69, 0x46, 0xc8, 0x8d, 0xc5, 0xb9, 0xcd, 0xb0, 0xe1, - 0x9a, 0xb7, 0xc8, 0x83, 0xc4, 0x99, 0xe1, 0x9b, 0x81, 0xc4, 0x90, 0xc2, 0xb3, 0xc3, - 0x9b, 0x37, 0xc7, 0x95, 0xc3, 0x86, 0xe1, 0x9a, 0xbc, 0xc3, 0xba, 0xe2, 0xb1, 0xa5, - 0xc8, 0xac, 0x51, 0xc6, 0xa4, 0xc4, 0xb4, 0x21, 0xc5, 0x94, 0xc5, 0x92, 0xc4, 0xa3, - 0xc6, 0x8c, 0xc8, 0x84, 0xc8, 0xa9, 0xc3, 0x81, 0xc5, 0xb2, 0x53, 0xc7, 0x8a, 0xe1, - 0x9a, 0xba, 0xc4, 0xb7, 0xc8, 0x9e, 0xc3, 0xb6, 0xc7, 0xb1, 0xe2, 0xb1, 0xad, 0xc7, - 0x80, 0xc7, 0xb7, 0x51, 0xce, 0x85, 0xc4, 0xab, 0xc7, 0xaa, 0xc3, 0xad, 0xc5, 0x97, - 0xc8, 0xbe, 0x2e, 0x36, 0x71, 0xe1, 0x9b, 0x8a, 0xc5, 0xb1, 0xc4, 0x9b, 0xe1, 0x9b, - 0x8a, 0xc5, 0xb7, 0xc5, 0xb9, 0xc3, 0xbe, 0xc7, 0x80, 0xc3, 0xad, 0xc8, 0x80, 0xe1, - 0x9b, 0x9d, 0xc5, 0xb2, 0xc6, 0xaa, 0xc8, 0xa6, 0xc5, 0x93, 0xc6, 0xb2, 0xe1, 0x9a, - 0xb0, 0xc5, 0x86, 0xc5, 0xa2, 0xe1, 0x9a, 0xaf, 0x77, 0xc4, 0xb1, 0xe1, 0x9a, 0xa0, - 0xc4, 0x91, 0xc8, 0xb9, 0x21, 0xc3, 0x9a, 0xc6, 0x88, 0xc3, 0x80, 0xc4, 0x80, 0xc4, - 0x83, 0xc7, 0x81, 0x24, 0xc3, 0xa5, 0xc6, 0xbf, 0xc7, 0xb1, 0xe1, 0x9b, 0x98, 0xc8, - 0xaf, 0xc5, 0x9a, 0xc7, 0xa1, 0xc4, 0x89, 0x4f, 0xc2, 0xaf, 0xc9, 0x8c, 0x2f, 0xc4, - 0x94, 0x74, 0xc5, 0xb8, 0x26, 0xe1, 0x9b, 0x85, 0xc6, 0x97, 0xc2, 0xa3, 0xc5, 0xb4, - 0xc7, 0xbe, 0xc6, 0xa3, 0xc4, 0x9b, 0xe1, 0x9b, 0xa2, 0xc8, 0xb9, 0x7d, 0xc8, 0xa2, - 0xc7, 0x8a, 0xe2, 0xb1, 0xaa, 0xc3, 0x92, 0x5b, 0xc3, 0xaa, 0xc8, 0xa4, 0xc7, 0xad, - 0xc4, 0x91, 0xc8, 0xad, 0xc8, 0x8a, 0xc4, 0x89, 0x3e, 0xc5, 0xba, 0x58, 0xc4, 0xb7, - 0xc5, 0x82, 0xe1, 0x9b, 0x82, 0x51, 0xc5, 0xa5, 0xc3, 0x96, 0xc2, 0xb1, 0xc2, 0xa4, - 0xc8, 0x8f, 0xc3, 0xac, 0xc6, 0x91, 0xe1, 0x9b, 0xa3, 0xc8, 0xba, 0xc4, 0x82, 0x21, - 0xc6, 0xb3, 0xc7, 0xb1, 0xc3, 0x92, 0x2f, 0xc4, 0x9a, 0xc7, 0x86, 0xc4, 0x82, 0x7c, - 0x2e, 0xc8, 0xb6, 0xe1, 0x9b, 0x8a, 0x2f, 0x34, 0xc4, 0xaf, 0xc7, 0xb8, 0xc9, 0x8b, - 0xc6, 0xb6, 0xe1, 0x9b, 0x91, 0xc7, 0xb2, 0xc5, 0x87, 0xce, 0x85, 0xc4, 0x8b, 0xc7, - 0x88, 0xc5, 0xb7, 0xc8, 0x9c, 0xc6, 0xbb, 0xc4, 0x9e, 0xc4, 0xb2, 0xc4, 0xa8, 0xe1, - 0x9b, 0x83, 0xc7, 0x91, 0xc8, 0x82, 0xc8, 0xb6, 0xc5, 0x8e, 0xe1, 0x9b, 0xaf, 0xc7, - 0x89, 0xc4, 0x98, 0xc7, 0x90, 0xc2, 0xb8, 0xc8, 0xa2, 0xc8, 0xbf, 0xc5, 0xb8, 0x6e, - 0xc2, 0xbc, 0xc3, 0xb0, 0xc3, 0xa0, 0xc6, 0xb6, - ], - asset_base: [ - 0xee, 0xb5, 0xc9, 0x51, 0xcd, 0x1c, 0x9b, 0x20, 0x4f, 0x65, 0xe6, 0xf2, 0xb9, 0xeb, - 0xa1, 0xd2, 0x16, 0x1e, 0x21, 0x2b, 0x6f, 0x8e, 0x1c, 0x37, 0x96, 0x22, 0xbb, 0x7c, - 0x44, 0xb8, 0x8e, 0xa7, - ], - }, - TestVector { - key: [ - 0x70, 0x0d, 0xc0, 0x7a, 0xea, 0x5b, 0x17, 0xb5, 0xc0, 0x2b, 0xe3, 0x8c, 0x71, 0x1c, - 0x5d, 0x6d, 0x38, 0x13, 0xa4, 0x5e, 0xc2, 0x30, 0xda, 0x29, 0xfb, 0x37, 0x3c, 0x56, - 0x8c, 0x10, 0x44, 0x20, - ], - description: [ - 0xc3, 0x82, 0xc9, 0x85, 0xc3, 0xa9, 0xc7, 0xac, 0xc3, 0x93, 0xe1, 0x9b, 0xa7, 0xe1, - 0x9b, 0x81, 0xc8, 0xb5, 0x26, 0xe2, 0xb1, 0xbf, 0xc3, 0x96, 0xc4, 0xa2, 0xc5, 0x8c, - 0x4c, 0xc7, 0xbe, 0xce, 0x89, 0xc8, 0xa0, 0xc5, 0xb7, 0xc5, 0x92, 0xc7, 0xa6, 0xc4, - 0x8f, 0xc8, 0x84, 0x2f, 0xe2, 0xb1, 0xad, 0xc3, 0xab, 0xc6, 0xbc, 0xe1, 0x9a, 0xa8, - 0xc2, 0xb9, 0x72, 0x6b, 0xc3, 0xa9, 0xc3, 0xa3, 0xc9, 0x87, 0xc4, 0xb8, 0xc6, 0xbc, - 0xc8, 0xb8, 0xc6, 0x80, 0xe1, 0x9a, 0xbc, 0xc6, 0xb7, 0xc3, 0x9c, 0x3e, 0xc8, 0x8f, - 0xe1, 0x9b, 0x92, 0xc7, 0x88, 0x33, 0xc6, 0xab, 0xc8, 0x80, 0xc8, 0x9e, 0xe2, 0xb1, - 0xa2, 0x29, 0xc3, 0x9d, 0xc6, 0x82, 0xc3, 0xad, 0xc8, 0xa1, 0xe1, 0x9b, 0x99, 0xc4, - 0xad, 0xc9, 0x8c, 0xc7, 0xa8, 0xc8, 0x89, 0xc4, 0x90, 0xe1, 0x9b, 0xa0, 0xc4, 0xae, - 0xc6, 0xb5, 0xc7, 0x92, 0xc6, 0xbc, 0xc8, 0xa1, 0xc3, 0xac, 0xc3, 0x83, 0xe1, 0x9b, - 0x83, 0xc3, 0xb9, 0xc3, 0x9d, 0xc5, 0xa8, 0xe2, 0xb1, 0xbb, 0xc8, 0x9f, 0xc4, 0xb0, - 0xe2, 0xb1, 0xa3, 0xc7, 0xa8, 0xc4, 0x82, 0xc7, 0x87, 0xe1, 0x9b, 0x9e, 0xc8, 0x81, - 0xc3, 0xb7, 0xc5, 0x95, 0x34, 0xc6, 0xb8, 0xc5, 0xbd, 0xc4, 0x82, 0xc6, 0x92, 0xc4, - 0x9f, 0xc5, 0x9d, 0xc8, 0x9a, 0xc4, 0x89, 0xc3, 0x81, 0xc5, 0x8d, 0xe1, 0x9b, 0x85, - 0xc8, 0x84, 0xcd, 0xbe, 0xc6, 0xb5, 0xc7, 0xb5, 0xc4, 0xbe, 0x4d, 0xc6, 0x8c, 0xc6, - 0x83, 0xc6, 0x99, 0xc7, 0xa3, 0xc4, 0xae, 0xe1, 0x9b, 0x8d, 0xe1, 0x9b, 0x86, 0xe1, - 0x9a, 0xa1, 0xc6, 0x84, 0xc3, 0xb0, 0xc9, 0x8b, 0xcd, 0xb0, 0xc7, 0x8c, 0xc6, 0xb4, - 0xc5, 0x82, 0xe2, 0xb1, 0xba, 0xc2, 0xbb, 0xc4, 0xbd, 0xc2, 0xaf, 0xc6, 0xba, 0x7b, - 0xc4, 0x89, 0x25, 0xe1, 0x9b, 0xae, 0xc7, 0x9d, 0xe1, 0x9b, 0x8b, 0xe2, 0xb1, 0xb8, - 0xe2, 0xb1, 0xa5, 0xc3, 0xb4, 0xc8, 0xb2, 0xc5, 0x9f, 0xc8, 0x9c, 0xc3, 0xa7, 0x38, - 0xc7, 0x8e, 0xc7, 0x92, 0xc6, 0xa8, 0xc6, 0x88, 0xe2, 0xb1, 0xa2, 0xc5, 0xb1, 0x39, - 0x6b, 0x4c, 0xe1, 0x9b, 0x86, 0xe1, 0x9a, 0xa8, 0xc2, 0xa6, 0xc5, 0xbf, 0xc5, 0xb5, - 0xc4, 0xaa, 0xe2, 0xb1, 0xa2, 0x3b, 0xc8, 0x98, 0xc9, 0x8f, 0xc4, 0x83, 0xc8, 0x91, - 0xc7, 0x8e, 0xe2, 0xb1, 0xab, 0xc8, 0x94, 0xc6, 0xb3, 0xc3, 0x93, 0xc3, 0x92, 0x3d, - 0xc4, 0x86, 0xc6, 0x88, 0xc4, 0xa3, 0xc5, 0x98, 0xc8, 0xb9, 0xc8, 0xb5, 0x26, 0xc4, - 0xb9, 0xc3, 0x90, 0xc5, 0xa7, 0xc6, 0xa6, 0xe2, 0xb1, 0xba, 0xc2, 0xb8, 0xc5, 0x93, - 0xce, 0x89, 0xc3, 0xa0, 0xc3, 0x8e, 0xe1, 0x9b, 0x81, 0xc2, 0xbb, 0xc7, 0xba, 0xc4, - 0x83, 0xc9, 0x83, 0xc5, 0xa8, 0xc4, 0x84, 0xc3, 0xb5, 0xc3, 0xad, 0x5d, 0xc4, 0x9b, - 0xc7, 0xbb, 0xe2, 0xb1, 0xb4, 0xc4, 0xb5, 0xc4, 0x8c, 0xc3, 0x8a, 0xc6, 0xb2, 0xe2, - 0xb1, 0xa5, 0xc6, 0xb1, 0xc4, 0xa7, 0xc3, 0xb3, 0xe1, 0x9b, 0xa6, 0xc7, 0x9d, 0xc4, - 0xb3, 0xc3, 0xbd, 0x3b, 0xe1, 0x9b, 0xa5, 0x3e, 0xc3, 0xbe, 0xc7, 0x87, 0xc3, 0xa4, - 0xc6, 0xbb, 0xe1, 0x9b, 0xad, 0xe2, 0xb1, 0xa4, 0xce, 0x89, 0xc8, 0xa2, 0xc8, 0x84, - 0x7a, 0xc8, 0x84, 0xc4, 0xb5, 0xc4, 0xbb, 0xc5, 0xa2, 0xc7, 0xaf, 0x49, 0xe1, 0x9b, - 0xb0, 0xc8, 0xab, 0xc6, 0xa7, 0xc7, 0xa4, 0xe2, 0xb1, 0xbd, 0xc4, 0x8f, 0xc6, 0x96, - 0xe1, 0x9b, 0x86, 0xc6, 0x9f, 0xc3, 0x83, 0xc4, 0x8b, 0x2b, 0xe1, 0x9a, 0xa9, 0x38, - 0xe2, 0xb1, 0xbc, 0xc3, 0x8c, 0xc8, 0x94, 0xcd, 0xb0, 0xc3, 0xb5, 0xc7, 0x82, 0x36, - 0x23, 0x41, 0xe2, 0xb1, 0xa8, 0x67, 0x5a, 0x5a, - ], - asset_base: [ - 0x65, 0x3e, 0x99, 0x25, 0x68, 0x30, 0x69, 0xc9, 0x88, 0x32, 0xaf, 0x7d, 0x3a, 0xa9, - 0xd3, 0x14, 0x41, 0xcc, 0x0f, 0x76, 0x34, 0x07, 0x91, 0x49, 0xf3, 0xef, 0xcb, 0x64, - 0xc7, 0x36, 0x97, 0x3d, - ], - }, - TestVector { - key: [ - 0xf3, 0x2c, 0x7a, 0x80, 0xb6, 0x83, 0x45, 0xb2, 0x38, 0xc7, 0x73, 0x34, 0x67, 0xba, - 0x6c, 0xd9, 0x7c, 0xcd, 0xf4, 0xfd, 0x21, 0x29, 0x48, 0x13, 0x1b, 0xfb, 0xc4, 0x06, - 0x19, 0x68, 0x73, 0x26, - ], - description: [ - 0xc8, 0x9b, 0x56, 0xe1, 0x9b, 0x9d, 0xc6, 0xaf, 0xe2, 0xb1, 0xbd, 0xc3, 0x80, 0xc5, - 0x8f, 0xe1, 0x9b, 0xaa, 0xc7, 0xbd, 0x45, 0x30, 0xe1, 0x9a, 0xbd, 0x62, 0xc5, 0x8a, - 0xc5, 0xba, 0xc7, 0x83, 0xc4, 0xa7, 0xe1, 0x9a, 0xa5, 0xc6, 0xab, 0xc6, 0x94, 0xe2, - 0xb1, 0xa0, 0xc3, 0x81, 0x6f, 0xc3, 0x84, 0x31, 0xc5, 0xbe, 0xc3, 0x87, 0xc7, 0xa8, - 0xe1, 0x9a, 0xa0, 0xc2, 0xa7, 0xc5, 0xb1, 0xc8, 0x85, 0xc8, 0xa1, 0x48, 0x2c, 0x41, - 0x53, 0xe2, 0xb1, 0xb4, 0xc7, 0xad, 0xc7, 0xb9, 0xc8, 0x9e, 0xc6, 0xa5, 0x4d, 0xe2, - 0xb1, 0xa4, 0xc3, 0x96, 0xc8, 0xbf, 0xc4, 0x95, 0xc6, 0x94, 0xc4, 0xa5, 0x64, 0xc4, - 0xbe, 0x69, 0xc8, 0xb9, 0x7d, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0x9b, 0xce, 0x86, 0xe1, - 0x9a, 0xa9, 0xc4, 0x9f, 0x30, 0xc8, 0x8b, 0xe1, 0x9b, 0xa7, 0xc6, 0xbf, 0xc7, 0xbb, - 0xc7, 0x9a, 0xc8, 0x94, 0xc8, 0x9d, 0xc8, 0x8c, 0xc3, 0xb2, 0xc7, 0x95, 0x34, 0x71, - 0x38, 0xc6, 0xb5, 0xc4, 0xa6, 0xc8, 0x96, 0xce, 0x89, 0xc4, 0x93, 0x26, 0xc8, 0xa4, - 0xc6, 0xa7, 0xe1, 0x9b, 0xa7, 0x3b, 0xc4, 0x80, 0xc5, 0xb8, 0xc7, 0x86, 0xc8, 0xa0, - 0xc4, 0xbb, 0xc4, 0xa1, 0xc8, 0x88, 0x70, 0x5d, 0xe2, 0xb1, 0xa5, 0xc9, 0x89, 0xc7, - 0xbc, 0xc6, 0xb3, 0xc9, 0x8a, 0xc3, 0xbe, 0xe2, 0xb1, 0xa9, 0xc2, 0xbd, 0xc5, 0x88, - 0xc5, 0x88, 0xc4, 0xbc, 0xc6, 0x88, 0x5c, 0xc8, 0x86, 0xc3, 0xa8, 0x23, 0x58, 0xe1, - 0x9a, 0xa2, 0xc4, 0xb2, 0xc7, 0xbc, 0x5e, 0xe2, 0xb1, 0xb2, 0x45, 0xc7, 0xb7, 0xc9, - 0x81, 0xc2, 0xba, 0xe1, 0x9b, 0x91, 0xc3, 0x87, 0xc9, 0x8c, 0xce, 0x84, 0xe1, 0x9a, - 0xa8, 0xc8, 0x8c, 0xc7, 0x8b, 0xce, 0x86, 0xe2, 0xb1, 0xaf, 0x32, 0xc8, 0x88, 0xc4, - 0x9c, 0xe1, 0x9a, 0xac, 0xe1, 0x9b, 0x9e, 0xc6, 0xb1, 0xc7, 0x90, 0xe2, 0xb1, 0xa6, - 0xc8, 0x91, 0xc5, 0x9a, 0xc6, 0x8e, 0xc6, 0x84, 0xe1, 0x9a, 0xbd, 0xc4, 0xa6, 0xc5, - 0x84, 0xc3, 0x91, 0xc6, 0xbf, 0xc4, 0xb9, 0xce, 0x85, 0xc2, 0xa1, 0xc7, 0x93, 0xc9, - 0x8e, 0xc5, 0xb4, 0xc8, 0x91, 0xc5, 0xa1, 0xe1, 0x9b, 0x95, 0xc8, 0xa9, 0xe1, 0x9b, - 0x92, 0x5f, 0xc6, 0xba, 0x56, 0xc4, 0x95, 0x32, 0xe2, 0xb1, 0xa5, 0x53, 0xc3, 0xba, - 0x23, 0xc7, 0x99, 0xc7, 0xa8, 0xc3, 0x81, 0xc6, 0xa1, 0x34, 0xc5, 0xb1, 0xc3, 0x85, - 0xe1, 0x9b, 0xac, 0xc7, 0xad, 0xc4, 0x90, 0xc5, 0x9f, 0xc5, 0xaf, 0xc8, 0x9e, 0xc7, - 0xb5, 0xc5, 0x82, 0xc9, 0x81, 0xc5, 0x8d, 0xc5, 0x92, 0xc6, 0x9d, 0xc5, 0xba, 0xe1, - 0x9a, 0xa7, 0xc4, 0x81, 0xe2, 0xb1, 0xa1, 0xc6, 0xa5, 0xe2, 0xb1, 0xb9, 0xc4, 0x9f, - 0xce, 0x88, 0xc6, 0x97, 0xc6, 0xaf, 0xe1, 0x9b, 0xac, 0xc5, 0xa1, 0xe2, 0xb1, 0xb3, - 0xc9, 0x83, 0xc5, 0x86, 0xc6, 0xaa, 0xe2, 0xb1, 0xb0, 0xc7, 0x8b, 0xc5, 0xae, 0xc2, - 0xb5, 0x42, 0xc6, 0xab, 0x58, 0xc8, 0x93, 0xc6, 0x82, 0xe2, 0xb1, 0xb6, 0xc7, 0x92, - 0xe1, 0x9b, 0x95, 0xc4, 0x81, 0xc3, 0x9f, 0xc2, 0xb7, 0xc5, 0x8f, 0xc8, 0xb7, 0xc3, - 0xac, 0xc4, 0xbf, 0x48, 0xc5, 0xba, 0xe1, 0x9a, 0xb9, 0xc4, 0x8c, 0xe1, 0x9b, 0x87, - 0xc6, 0x93, 0xc4, 0x8a, 0xc7, 0x99, 0xc6, 0x98, 0xc6, 0xb7, 0xc5, 0xb9, 0xc4, 0x8b, - 0xc3, 0xbb, 0xc8, 0x8b, 0xc3, 0xbb, 0xc5, 0x93, 0xe1, 0x9b, 0xad, 0xe1, 0x9a, 0xb1, - 0xc3, 0x82, 0xc6, 0x99, 0xc5, 0x93, 0xc6, 0x8e, 0xcd, 0xb4, 0xe2, 0xb1, 0xa8, 0xc6, - 0x97, 0xc6, 0x99, 0xc5, 0x80, 0xc4, 0x9c, 0x78, 0xcd, 0xb2, 0xc4, 0xb3, 0xc5, 0x80, - 0xe1, 0x9b, 0x99, 0xc7, 0xa8, 0xc5, 0x8e, 0x5a, - ], - asset_base: [ - 0x76, 0xb6, 0xcc, 0x39, 0x90, 0xd8, 0xf1, 0x14, 0x96, 0x01, 0xe6, 0x8f, 0x2e, 0xca, - 0xcd, 0x97, 0x0f, 0xa0, 0xb7, 0xc0, 0xbe, 0xab, 0x7c, 0x88, 0x28, 0x21, 0x4a, 0x37, - 0xce, 0x87, 0x10, 0xa3, - ], - }, - TestVector { - key: [ - 0x98, 0xee, 0xc6, 0xfb, 0xdc, 0xa2, 0x77, 0x2a, 0x2a, 0x6b, 0xf9, 0x2f, 0x17, 0x18, - 0xdf, 0x59, 0xba, 0xb2, 0x5f, 0xd1, 0x05, 0x4c, 0x57, 0xad, 0xae, 0x0d, 0x72, 0x20, - 0xbf, 0xcd, 0x06, 0x38, - ], - description: [ - 0xc5, 0x87, 0xe2, 0xb1, 0xbb, 0xc8, 0xa4, 0xc5, 0x85, 0xc4, 0x84, 0xe1, 0x9b, 0x99, - 0xc9, 0x85, 0xe1, 0x9a, 0xbe, 0xc4, 0x85, 0xc7, 0x8b, 0xe1, 0x9b, 0xa2, 0xc6, 0xa4, - 0x5a, 0xc6, 0xad, 0xc7, 0x80, 0x23, 0xc5, 0x9f, 0xc4, 0xb2, 0xe1, 0x9b, 0x94, 0xc3, - 0xb1, 0xc6, 0xae, 0xe1, 0x9a, 0xaa, 0x71, 0xc6, 0xa1, 0xc8, 0x9e, 0xc8, 0x97, 0xc6, - 0xac, 0xc3, 0x83, 0xc8, 0x9a, 0xc6, 0xa7, 0x41, 0xe1, 0x9a, 0xbf, 0xc2, 0xaa, 0xc8, - 0x9b, 0xc4, 0xa4, 0xc3, 0x97, 0xc8, 0x9d, 0x55, 0xc4, 0x92, 0xc5, 0xa2, 0xc5, 0x8b, - 0xc8, 0xaa, 0xc6, 0xa3, 0xc3, 0x81, 0xc6, 0x81, 0x7a, 0xcd, 0xb0, 0x6e, 0xc3, 0xb4, - 0xc4, 0x90, 0xc4, 0xaa, 0xe2, 0xb1, 0xa6, 0xc4, 0xa0, 0xc2, 0xbf, 0xc7, 0xa7, 0xc3, - 0xad, 0x5b, 0xc7, 0xa3, 0xc5, 0xb3, 0xc7, 0xbe, 0xc6, 0x9a, 0xc7, 0x80, 0xc2, 0xab, - 0xc5, 0x99, 0xe1, 0x9b, 0x91, 0xc6, 0x90, 0x68, 0xc4, 0xb9, 0xc6, 0x87, 0x66, 0xc3, - 0xb6, 0xc5, 0xb8, 0xc6, 0x9a, 0x7b, 0xc7, 0x81, 0xc5, 0x8b, 0xc5, 0x87, 0xc3, 0x9b, - 0xc6, 0x94, 0xc4, 0x8d, 0xc2, 0xb9, 0xe2, 0xb1, 0xbd, 0xc6, 0x9e, 0xc7, 0xbc, 0x68, - 0xc3, 0xaa, 0x5b, 0xc5, 0x85, 0xc9, 0x87, 0xe1, 0x9b, 0x85, 0x5d, 0xc9, 0x8c, 0xe1, - 0x9b, 0xa6, 0x5d, 0xcd, 0xb7, 0xc7, 0x9f, 0x30, 0xc4, 0x9d, 0xc2, 0xb7, 0xe1, 0x9b, - 0xa0, 0xc4, 0xab, 0xc2, 0xaf, 0xc5, 0xb2, 0xe1, 0x9b, 0xa6, 0xc3, 0x81, 0xc5, 0xab, - 0xc8, 0xa0, 0xe1, 0x9b, 0x9c, 0xc5, 0xa5, 0xc4, 0x9e, 0xc3, 0x94, 0xc6, 0xa0, 0x7e, - 0xc6, 0x8c, 0xc5, 0x80, 0xc8, 0x9a, 0xcd, 0xb6, 0xc6, 0xa4, 0xc5, 0x9b, 0xe1, 0x9b, - 0x87, 0xe1, 0x9a, 0xa4, 0x62, 0xe2, 0xb1, 0xa4, 0x35, 0x3f, 0xc2, 0xaa, 0xc7, 0xb0, - 0xc5, 0xb4, 0xc9, 0x82, 0xe1, 0x9a, 0xab, 0xc8, 0xb1, 0xc8, 0xae, 0xc6, 0xbc, 0xc8, - 0x98, 0x33, 0xc5, 0xa4, 0x31, 0xe1, 0x9a, 0xbd, 0xc8, 0xb7, 0xc4, 0xa2, 0x45, 0xc5, - 0x8a, 0xe1, 0x9a, 0xb0, 0xc2, 0xb2, 0xc6, 0x8f, 0xc8, 0x96, 0xc6, 0x93, 0xc6, 0x89, - 0xe2, 0xb1, 0xb4, 0xc7, 0xb9, 0xc3, 0x88, 0xc7, 0x9f, 0xc7, 0x85, 0xe2, 0xb1, 0xa8, - 0xc7, 0xa9, 0xc8, 0x99, 0xc4, 0x8c, 0xc4, 0xaf, 0xc4, 0x99, 0x3b, 0xc5, 0xa8, 0xe1, - 0x9a, 0xaa, 0xc6, 0x9e, 0xc6, 0x86, 0xc2, 0xb5, 0x43, 0xc2, 0xaa, 0xe1, 0x9b, 0x95, - 0xc8, 0xba, 0xc2, 0xac, 0xc7, 0x9e, 0xe2, 0xb1, 0xb5, 0xc8, 0xb3, 0xe1, 0x9b, 0xa4, - 0xc8, 0xa6, 0xc6, 0x8c, 0xc6, 0x99, 0xc6, 0x89, 0xc5, 0x82, 0xc7, 0xa4, 0x7c, 0xce, - 0x89, 0xc6, 0xbf, 0xc8, 0x9d, 0xc3, 0x92, 0xc6, 0xab, 0xe1, 0x9a, 0xab, 0xe1, 0x9b, - 0x84, 0xc6, 0x9e, 0x21, 0x79, 0xcd, 0xb1, 0xc4, 0xb1, 0xce, 0x8c, 0xe1, 0x9b, 0x98, - 0xe1, 0x9b, 0x8d, 0xc6, 0xb0, 0xe1, 0x9a, 0xa5, 0xc7, 0xb9, 0xe1, 0x9b, 0x9d, 0x48, - 0xc4, 0xbe, 0xc8, 0xaf, 0xc8, 0x89, 0xe1, 0x9b, 0xb0, 0xc2, 0xb8, 0xe2, 0xb1, 0xb1, - 0xc3, 0x96, 0xc5, 0xb1, 0x44, 0xc3, 0x9e, 0x6c, 0xe1, 0x9a, 0xbb, 0xc4, 0xaf, 0xc4, - 0x8c, 0xc2, 0xa1, 0xc3, 0xa1, 0xc3, 0x98, 0xc8, 0xac, 0xc3, 0xa3, 0xc8, 0xa2, 0xcd, - 0xbb, 0xc6, 0xb3, 0xe1, 0x9b, 0x9c, 0x51, 0xc5, 0xa3, 0xc5, 0xb3, 0x77, 0xc3, 0x87, - 0xc3, 0xbb, 0x3b, 0xc8, 0x98, 0xc5, 0xb9, 0x2a, 0x4a, 0xc5, 0xb7, 0xc9, 0x8c, 0x6e, - 0xe1, 0x9b, 0xa9, 0xc3, 0x94, 0xc3, 0x9f, 0xc3, 0xaa, 0xe1, 0x9b, 0xb0, 0xc3, 0x85, - 0x59, 0xc8, 0xbb, 0xc4, 0x87, 0xc7, 0xb2, 0xcd, 0xbe, 0xc5, 0xb4, 0x6c, 0xe2, 0xb1, - 0xad, 0x6d, 0xc2, 0xa9, 0xc4, 0x8b, 0xc6, 0xb6, - ], - asset_base: [ - 0xba, 0xb2, 0xba, 0xb5, 0x2d, 0x54, 0x67, 0xd4, 0xa6, 0x36, 0x0c, 0xb2, 0x74, 0xc9, - 0x2a, 0x7b, 0x8e, 0x0b, 0xc5, 0x02, 0x28, 0xa9, 0x68, 0x0f, 0xcd, 0xa0, 0x38, 0x17, - 0x62, 0x3f, 0x48, 0x91, - ], - }, - TestVector { - key: [ - 0x3a, 0x86, 0x32, 0x5c, 0x89, 0x70, 0xca, 0x21, 0xb8, 0x3a, 0xb7, 0x59, 0x76, 0xa8, - 0xd8, 0x54, 0xff, 0xa0, 0xc7, 0x63, 0x1b, 0xd0, 0xf8, 0xa8, 0x8c, 0x0a, 0x09, 0x89, - 0xbd, 0xb7, 0x75, 0x19, - ], - description: [ - 0xc7, 0x93, 0xc6, 0xb5, 0xc4, 0x82, 0xc6, 0x85, 0xe1, 0x9a, 0xac, 0xc7, 0x91, 0xc4, - 0xad, 0xe1, 0x9b, 0x84, 0xe2, 0xb1, 0xbc, 0xc2, 0xbb, 0xc8, 0xa9, 0xc7, 0xaf, 0xc4, - 0xa6, 0x79, 0xc6, 0x8a, 0xc5, 0xac, 0xc6, 0x98, 0xe1, 0x9b, 0x8f, 0xc5, 0x8b, 0xc3, - 0x81, 0xe1, 0x9b, 0x84, 0xe1, 0x9a, 0xa9, 0xe2, 0xb1, 0xa2, 0xe1, 0x9b, 0x92, 0x40, - 0xe2, 0xb1, 0xa0, 0xc4, 0xa6, 0xc8, 0xac, 0xc7, 0xb9, 0xc9, 0x8d, 0xc7, 0xab, 0xc3, - 0x8a, 0xc6, 0xb8, 0x7c, 0xc5, 0xa1, 0xc8, 0xaf, 0xc4, 0x80, 0xc3, 0xb4, 0xc5, 0x82, - 0xc7, 0xb7, 0xc6, 0x8a, 0xc6, 0xb2, 0x2b, 0x6b, 0xc6, 0x9d, 0xe2, 0xb1, 0xb6, 0xc7, - 0x94, 0xcd, 0xb5, 0xc5, 0x96, 0xc7, 0xae, 0xc4, 0xb1, 0xc4, 0xb0, 0xe1, 0x9b, 0x8e, - 0xcd, 0xb2, 0xe1, 0x9b, 0x83, 0xc5, 0xb5, 0xc8, 0x84, 0xc6, 0x88, 0xcd, 0xb7, 0xe2, - 0xb1, 0xa5, 0xc8, 0xa6, 0xc5, 0x8c, 0xc5, 0x8f, 0x60, 0xc8, 0x83, 0xc6, 0x9f, 0xc4, - 0xa2, 0xc5, 0x9f, 0x5b, 0xc8, 0x97, 0xcd, 0xbc, 0xc4, 0xbb, 0xc5, 0x93, 0xc6, 0xa9, - 0xc3, 0x8e, 0x31, 0xe2, 0xb1, 0xae, 0x49, 0xc7, 0x93, 0xc2, 0xba, 0xc5, 0x9c, 0xc2, - 0xb4, 0xe1, 0x9a, 0xa6, 0xc9, 0x8b, 0x75, 0x36, 0xe1, 0x9b, 0x89, 0x6c, 0xc3, 0x95, - 0xc4, 0xba, 0x7e, 0x21, 0xc8, 0xac, 0xc4, 0xa0, 0x4f, 0xc5, 0xbc, 0x5b, 0xce, 0x88, - 0x37, 0x38, 0xc6, 0x8b, 0xc2, 0xb9, 0x58, 0xc3, 0x86, 0xc4, 0x96, 0x23, 0xc6, 0xbb, - 0xc8, 0xa3, 0x5a, 0xc6, 0xbc, 0xe1, 0x9b, 0x89, 0xc3, 0x82, 0xc3, 0x9d, 0x69, 0xe1, - 0x9a, 0xbe, 0xe1, 0x9b, 0x8d, 0xc3, 0xb6, 0x73, 0xc4, 0xb9, 0xe1, 0x9b, 0xaa, 0x6a, - 0xc2, 0xa8, 0xc6, 0xbb, 0xce, 0x85, 0xc7, 0x94, 0xc5, 0xaa, 0xc2, 0xb5, 0x5e, 0xc2, - 0xb5, 0xc3, 0xa1, 0xc6, 0x93, 0xc3, 0xb6, 0xc5, 0x95, 0xc6, 0x91, 0xc7, 0xb1, 0xc8, - 0xb3, 0x66, 0x21, 0xc4, 0x8a, 0xc7, 0xb9, 0xc5, 0x8d, 0x33, 0xc9, 0x8c, 0x5e, 0xc4, - 0xb6, 0xc7, 0x88, 0xc3, 0xae, 0xc5, 0x8e, 0xc7, 0xaf, 0x4e, 0xc4, 0xa6, 0xe1, 0x9b, - 0xad, 0xc7, 0x8c, 0xe1, 0x9a, 0xbf, 0xc7, 0x89, 0xc9, 0x88, 0xc6, 0xab, 0xe2, 0xb1, - 0xbf, 0xc7, 0x85, 0xc6, 0xa1, 0xc3, 0x86, 0xe1, 0x9b, 0x9c, 0x3b, 0xc2, 0xa6, 0x7c, - 0xc3, 0x94, 0x5c, 0xc8, 0x82, 0xc3, 0xad, 0xc7, 0x98, 0xc5, 0xab, 0xc7, 0xa1, 0xe1, - 0x9a, 0xa3, 0xc8, 0xa3, 0xc6, 0x96, 0xc5, 0x82, 0xe1, 0x9b, 0x84, 0xc8, 0xb0, 0xc2, - 0xaa, 0xc4, 0x94, 0x68, 0xc6, 0x8f, 0xe2, 0xb1, 0xb8, 0xc6, 0xae, 0x54, 0xe1, 0x9b, - 0x88, 0xc7, 0x82, 0xc3, 0x81, 0xc8, 0xaf, 0xc7, 0xa0, 0x3d, 0xc4, 0x98, 0xc4, 0x97, - 0xc7, 0xba, 0xe1, 0x9b, 0xa8, 0xc6, 0xba, 0xc3, 0x93, 0xc2, 0xa7, 0xc7, 0xa1, 0xc5, - 0x8d, 0xc7, 0x87, 0xc3, 0xa1, 0xc5, 0xa4, 0xc6, 0x9b, 0x21, 0xc5, 0xa8, 0xc8, 0xb2, - 0xc4, 0xb9, 0xc6, 0x81, 0xc7, 0xb6, 0xc8, 0xaa, 0xc3, 0x89, 0xe1, 0x9b, 0xac, 0x45, - 0xc3, 0xa0, 0xc4, 0xae, 0xe1, 0x9b, 0xa5, 0xc8, 0xad, 0xe1, 0x9a, 0xb6, 0x55, 0xe1, - 0x9b, 0x9d, 0xc4, 0x97, 0xc8, 0x89, 0xc8, 0xa8, 0xc5, 0xbe, 0xc7, 0x90, 0xc2, 0xab, - 0xc8, 0xbd, 0xc3, 0x96, 0xc7, 0x99, 0xc8, 0xa8, 0xc2, 0xa1, 0xe1, 0x9b, 0x80, 0xc7, - 0x9a, 0xc7, 0xba, 0xc5, 0xac, 0x26, 0xc5, 0x96, 0xe1, 0x9a, 0xa4, 0xc8, 0x9d, 0xc6, - 0xa6, 0xe1, 0x9a, 0xb9, 0xc4, 0x86, 0xe1, 0x9a, 0xbf, 0xc8, 0xab, 0xce, 0x87, 0xe1, - 0x9b, 0x94, 0xc4, 0x81, 0xc3, 0xaf, 0xc5, 0xb6, 0xc8, 0x8c, 0xe1, 0x9a, 0xbd, 0xc3, - 0xbc, 0xc3, 0x9b, 0xc4, 0xb5, 0x7b, 0xc8, 0xaf, - ], - asset_base: [ - 0x86, 0x7f, 0xd2, 0x6b, 0xe6, 0xf1, 0x84, 0x89, 0x32, 0x91, 0xf8, 0x22, 0x44, 0xee, - 0x64, 0xa0, 0x63, 0xac, 0x28, 0xd1, 0xb2, 0x32, 0x0e, 0x4b, 0x40, 0xca, 0x6a, 0xf2, - 0x0a, 0xa8, 0x11, 0xbe, - ], - }, - TestVector { - key: [ - 0x4f, 0x50, 0xd9, 0x58, 0xf6, 0xb6, 0x79, 0x91, 0x33, 0x48, 0x49, 0xd1, 0x85, 0xf1, - 0xa3, 0x92, 0x0e, 0xfb, 0x46, 0x35, 0x1c, 0x70, 0x7d, 0xc3, 0x7d, 0x3e, 0xa9, 0xa1, - 0x79, 0xc0, 0x76, 0x27, - ], - description: [ - 0xc7, 0x95, 0xc7, 0xa0, 0xe2, 0xb1, 0xb9, 0xc4, 0xb2, 0x36, 0x48, 0x2b, 0xc5, 0x93, - 0xc7, 0xb1, 0xc3, 0xbc, 0xc6, 0x9c, 0xc8, 0x98, 0xc5, 0xba, 0xe2, 0xb1, 0xa4, 0xc5, - 0x89, 0xc5, 0x9d, 0x2a, 0xc7, 0xa9, 0xe1, 0x9a, 0xb1, 0x7e, 0xc6, 0x98, 0xc7, 0xa2, - 0xc4, 0x85, 0xc8, 0xa3, 0xc8, 0xbb, 0xc6, 0x81, 0xc6, 0x9c, 0xc3, 0xb7, 0xc6, 0x98, - 0xc6, 0x8e, 0xce, 0x86, 0xc8, 0xa0, 0xce, 0x85, 0xe2, 0xb1, 0xb4, 0xc4, 0xaa, 0xc6, - 0xbb, 0xc5, 0xb1, 0xc8, 0x9f, 0x69, 0x21, 0xe1, 0x9a, 0xa8, 0xc4, 0xa3, 0x6f, 0xc3, - 0x93, 0xe1, 0x9b, 0x99, 0xc4, 0xa2, 0xcd, 0xb5, 0xe1, 0x9a, 0xa7, 0xc5, 0x82, 0x32, - 0xc5, 0x80, 0xc2, 0xb0, 0xc7, 0x82, 0x41, 0xc7, 0x90, 0xc8, 0xb8, 0xc6, 0xbe, 0xc5, - 0xa0, 0xc6, 0x8c, 0xe1, 0x9a, 0xb8, 0xc3, 0xb6, 0xc4, 0xb2, 0xc4, 0xa4, 0xc9, 0x84, - 0xc5, 0x8d, 0xc4, 0xb1, 0x54, 0xc7, 0x8f, 0xc8, 0x8b, 0x54, 0xe1, 0x9b, 0x9e, 0xc9, - 0x84, 0xe1, 0x9b, 0x82, 0xc8, 0xb5, 0x73, 0xc6, 0xa4, 0xc4, 0xa8, 0xc4, 0xba, 0xc7, - 0xa7, 0x26, 0x3d, 0xe2, 0xb1, 0xae, 0xc4, 0xbc, 0xc8, 0x91, 0xe1, 0x9a, 0xbe, 0xc6, - 0xb7, 0xc5, 0xb3, 0xc8, 0xad, 0xc6, 0xb4, 0xe1, 0x9a, 0xab, 0x44, 0x77, 0xc5, 0x93, - 0xc5, 0xab, 0xc3, 0xbb, 0xe1, 0x9a, 0xbe, 0xc4, 0x81, 0xc2, 0xbe, 0xc7, 0xbd, 0xcd, - 0xbc, 0x70, 0x45, 0xc5, 0x9a, 0xc9, 0x8d, 0x32, 0x76, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, - 0xa0, 0xe1, 0x9b, 0x8a, 0xc3, 0x81, 0xc8, 0xad, 0x4c, 0xc3, 0x89, 0xc6, 0xbd, 0xc4, - 0x93, 0xc7, 0x9c, 0x62, 0x4c, 0xe2, 0xb1, 0xa1, 0xcd, 0xbc, 0xc8, 0xb7, 0xe1, 0x9a, - 0xaf, 0xe1, 0x9a, 0xb9, 0xc3, 0xb2, 0xc5, 0xaa, 0xe1, 0x9b, 0xad, 0xc5, 0x8d, 0xce, - 0x8a, 0x6a, 0xc4, 0xbf, 0xc7, 0x8b, 0xc7, 0xa2, 0x7e, 0x6e, 0xe1, 0x9a, 0xb1, 0x47, - 0x2b, 0xc9, 0x82, 0xc7, 0x8b, 0xcd, 0xba, 0xc6, 0xaf, 0xc4, 0x91, 0xc6, 0x86, 0x52, - 0xe1, 0x9b, 0x9b, 0xc9, 0x8e, 0xe2, 0xb1, 0xbd, 0xc2, 0xbd, 0xc4, 0xb2, 0xc7, 0xb5, - 0xc5, 0xb0, 0xc8, 0xb6, 0xe2, 0xb1, 0xa6, 0xc6, 0x92, 0xc4, 0xbf, 0x4a, 0xc4, 0xa9, - 0xc6, 0xb2, 0xe1, 0x9b, 0x96, 0xc3, 0xa4, 0x70, 0x3d, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, - 0x93, 0xc6, 0xa3, 0x4d, 0xc7, 0xa6, 0xc3, 0x8c, 0xc6, 0x8e, 0xc7, 0xbd, 0xc3, 0x90, - 0x54, 0xc5, 0x9b, 0xe1, 0x9b, 0x94, 0x37, 0xc3, 0x89, 0x79, 0x49, 0xe1, 0x9b, 0x86, - 0xe1, 0x9b, 0xa2, 0xc6, 0x8b, 0xc8, 0xb6, 0xc3, 0x8b, 0xc7, 0x83, 0xc8, 0xa2, 0xc8, - 0x92, 0xc4, 0x9e, 0xc8, 0xa4, 0xc5, 0x80, 0xc7, 0xa6, 0xc6, 0x99, 0x24, 0xe1, 0x9b, - 0xa2, 0xc6, 0x8c, 0xe1, 0x9a, 0xac, 0x39, 0x21, 0xc2, 0xa9, 0xc7, 0x89, 0xe1, 0x9a, - 0xbe, 0xce, 0x8a, 0xc3, 0x86, 0xe1, 0x9b, 0xa4, 0xc7, 0xb6, 0xc3, 0x90, 0xc3, 0x97, - 0xc5, 0x99, 0xc7, 0x80, 0xc8, 0x93, 0xc2, 0xa5, 0xe1, 0x9b, 0x86, 0xc7, 0xb7, 0xc3, - 0x81, 0xc7, 0x8a, 0xe1, 0x9b, 0x9c, 0xe1, 0x9a, 0xaf, 0xc4, 0x84, 0xc2, 0xb7, 0xc6, - 0x8b, 0xc6, 0xab, 0xc8, 0xb0, 0xc3, 0xa7, 0xcd, 0xb1, 0xe1, 0x9a, 0xa2, 0xc8, 0x83, - 0xc6, 0xa8, 0xc6, 0xaf, 0xe2, 0xb1, 0xa1, 0xc3, 0xa2, 0xc7, 0xb5, 0xc9, 0x87, 0xc7, - 0x9c, 0xe1, 0x9a, 0xb1, 0xc5, 0x93, 0xe1, 0x9b, 0x95, 0xe2, 0xb1, 0xaa, 0xe1, 0x9b, - 0x8c, 0xc7, 0x99, 0xc6, 0xbe, 0x47, 0xc9, 0x83, 0xc5, 0xa5, 0xc5, 0x83, 0xe1, 0x9b, - 0x8b, 0xc8, 0xba, 0xc5, 0xb4, 0xc2, 0xb6, 0xe2, 0xb1, 0xa1, 0xce, 0x88, 0x36, 0x21, - 0xe2, 0xb1, 0xa6, 0xe1, 0x9b, 0x91, 0xc3, 0xa7, - ], - asset_base: [ - 0x3d, 0x73, 0x41, 0xcb, 0xb2, 0xd0, 0x56, 0xd3, 0xfa, 0x50, 0x77, 0x09, 0xd2, 0x62, - 0x75, 0xff, 0xee, 0xff, 0xa1, 0x64, 0xa4, 0xcd, 0xc9, 0x0d, 0x52, 0xf3, 0x56, 0xaa, - 0x67, 0x8e, 0xc6, 0xb6, - ], - }, - TestVector { - key: [ - 0x42, 0x67, 0x81, 0x37, 0x2b, 0x07, 0xac, 0x22, 0x91, 0x58, 0x7f, 0x9f, 0x81, 0xb5, - 0x4f, 0x8b, 0x96, 0xb4, 0xc8, 0xdd, 0xf8, 0xcd, 0x5b, 0x0d, 0x7d, 0x21, 0xe7, 0xa7, - 0x46, 0xbb, 0x13, 0x3e, - ], - description: [ - 0xc5, 0x9b, 0xc3, 0xb8, 0xc4, 0x89, 0xc3, 0xbd, 0xc8, 0xa6, 0xc6, 0x8e, 0xc4, 0xb9, - 0xe1, 0x9a, 0xb9, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0xb0, 0xc3, 0x99, 0x31, 0xe1, 0x9b, - 0x90, 0xc2, 0xb2, 0xc7, 0xa5, 0x7a, 0xe1, 0x9b, 0x88, 0xc8, 0x94, 0x35, 0x5d, 0xc5, - 0x9a, 0xc3, 0x9c, 0x55, 0xc6, 0x82, 0xc3, 0xb8, 0xc6, 0xaf, 0xc3, 0xb8, 0xc4, 0xab, - 0x25, 0xc4, 0x91, 0xc4, 0xb6, 0xce, 0x86, 0xc3, 0x80, 0xc2, 0xba, 0x40, 0xc9, 0x8a, - 0xc4, 0xa2, 0xc7, 0xb4, 0xc4, 0x8f, 0xe1, 0x9b, 0x90, 0xe1, 0x9b, 0xab, 0xc8, 0x83, - 0xc7, 0x97, 0x28, 0xc3, 0x9c, 0xc6, 0x9b, 0xc8, 0xbb, 0xc2, 0xa6, 0xc4, 0x81, 0xc5, - 0xac, 0xe1, 0x9a, 0xa0, 0xc2, 0xaf, 0xc9, 0x8e, 0xc2, 0xa9, 0xc6, 0xa7, 0xc8, 0xaf, - 0xc8, 0x86, 0xc8, 0xae, 0xc4, 0x8d, 0xe1, 0x9b, 0xb0, 0xc6, 0xa7, 0xc4, 0x81, 0xc2, - 0xa8, 0xc9, 0x87, 0xe1, 0x9a, 0xbf, 0xc5, 0xb5, 0xc8, 0xa1, 0xc4, 0x88, 0xc8, 0xb2, - 0xc7, 0x89, 0xc8, 0xb9, 0xc8, 0xa3, 0xe2, 0xb1, 0xb1, 0xc3, 0xb5, 0xc5, 0xaa, 0xc7, - 0x9f, 0xcd, 0xba, 0xc3, 0x8f, 0xc7, 0x9f, 0xcd, 0xb4, 0x42, 0xc7, 0xb2, 0xe1, 0x9a, - 0xa3, 0xc7, 0xbc, 0xe1, 0x9b, 0x93, 0xc8, 0xb9, 0xc7, 0xbd, 0xc2, 0xbb, 0xc5, 0x81, - 0xc5, 0xa7, 0xc6, 0x89, 0x69, 0xe1, 0x9b, 0x87, 0x32, 0xc9, 0x80, 0xcd, 0xba, 0xc5, - 0x9c, 0xe1, 0x9a, 0xbc, 0x2a, 0x57, 0xc7, 0x84, 0xc8, 0x95, 0xc8, 0xa6, 0xe2, 0xb1, - 0xa4, 0xc2, 0xab, 0xc4, 0xad, 0xe2, 0xb1, 0xb6, 0xc2, 0xb3, 0xe1, 0x9b, 0x92, 0xcd, - 0xbe, 0xc4, 0xa5, 0xc7, 0xbc, 0xc5, 0x87, 0xc8, 0xbe, 0xc3, 0xbc, 0xc3, 0xb8, 0xc6, - 0x8e, 0xc6, 0xba, 0x48, 0xe1, 0x9b, 0xa4, 0x57, 0xc4, 0x8f, 0xe2, 0xb1, 0xab, 0xc4, - 0x9d, 0xc7, 0xa0, 0xe1, 0x9a, 0xb2, 0x48, 0xc5, 0xba, 0xce, 0x87, 0xc7, 0x86, 0xc5, - 0xa6, 0xc2, 0xa7, 0xc7, 0x9d, 0xc6, 0x8c, 0xe1, 0x9a, 0xb0, 0x65, 0xc4, 0xb5, 0xc6, - 0xbb, 0xc7, 0x82, 0xc4, 0xb3, 0xc4, 0x98, 0xc3, 0x85, 0x24, 0xe1, 0x9a, 0xa9, 0xc4, - 0x83, 0xc6, 0xba, 0xc3, 0xaa, 0xc5, 0xa0, 0xc4, 0x9e, 0x5f, 0x59, 0xc3, 0x90, 0x59, - 0xc2, 0xb2, 0xc6, 0xa9, 0xcd, 0xb5, 0xe1, 0x9a, 0xa0, 0xc4, 0x83, 0xc6, 0x92, 0xe2, - 0xb1, 0xb4, 0xc3, 0x98, 0xc6, 0xa8, 0xc6, 0x90, 0xe1, 0x9b, 0x8d, 0xc8, 0x93, 0xc4, - 0xac, 0xc8, 0x93, 0xc7, 0xae, 0xe1, 0x9a, 0xa9, 0xc3, 0xa9, 0xc6, 0x8f, 0xc5, 0x93, - 0xc8, 0x84, 0xe1, 0x9b, 0xad, 0xe2, 0xb1, 0xb7, 0xe1, 0x9b, 0x97, 0xc3, 0x87, 0xe1, - 0x9b, 0x89, 0xc3, 0x91, 0x46, 0x4f, 0xc5, 0x9d, 0xc9, 0x8e, 0xc5, 0x99, 0xc6, 0x9b, - 0xe1, 0x9a, 0xbb, 0xe1, 0x9b, 0xa8, 0x51, 0xc6, 0x8d, 0xc3, 0x8b, 0xc2, 0xa7, 0xc3, - 0xb6, 0xc8, 0x82, 0xc7, 0x8b, 0xc8, 0xb2, 0x6b, 0xc5, 0x9e, 0xc9, 0x8b, 0xc6, 0x84, - 0xc6, 0xac, 0xc4, 0xa7, 0xe1, 0x9b, 0xa7, 0xc3, 0xb6, 0xc7, 0xb2, 0xc3, 0x9a, 0xc6, - 0xab, 0xc3, 0x86, 0xc6, 0xa8, 0x52, 0xe1, 0x9a, 0xba, 0x2a, 0xe1, 0x9b, 0x90, 0xc4, - 0xb7, 0xc3, 0x9f, 0xc4, 0x8d, 0xc8, 0xba, 0xc7, 0x86, 0xc8, 0x95, 0xe1, 0x9b, 0x9a, - 0x40, 0xc3, 0xa9, 0xe1, 0x9a, 0xbe, 0xc8, 0xa6, 0xc8, 0xab, 0xc5, 0x90, 0xce, 0x86, - 0xe2, 0xb1, 0xad, 0xc3, 0xa5, 0xe1, 0x9b, 0xa9, 0xc5, 0x84, 0xc4, 0xbf, 0xc3, 0x88, - 0xc7, 0x8b, 0xe1, 0x9a, 0xad, 0xc8, 0x90, 0xc7, 0xbb, 0xe2, 0xb1, 0xa2, 0xc6, 0xaf, - 0xc2, 0xa7, 0xc3, 0xb4, 0xc6, 0x8e, 0x56, 0xc8, 0x80, 0xc6, 0x86, 0xe1, 0x9a, 0xa7, - 0xc6, 0xbc, 0xc2, 0xba, 0xc6, 0xb7, 0xc5, 0x99, - ], - asset_base: [ - 0x39, 0xa7, 0x8f, 0x76, 0x63, 0x81, 0xec, 0x69, 0xd9, 0x2e, 0x8c, 0xa6, 0xb6, 0x4e, - 0x92, 0x10, 0xe9, 0x94, 0x28, 0x32, 0x9f, 0xde, 0x85, 0xb2, 0xe1, 0xfb, 0xb7, 0x35, - 0x70, 0x86, 0x7a, 0xb2, - ], - }, - TestVector { - key: [ - 0x76, 0xf4, 0x9c, 0xf8, 0xa3, 0x19, 0x21, 0x85, 0x61, 0x6a, 0x9a, 0x0d, 0xa0, 0xc7, - 0x6e, 0xc2, 0xc2, 0x75, 0x61, 0x59, 0xbc, 0xe1, 0x86, 0xa1, 0x86, 0x2b, 0x6e, 0x6e, - 0x59, 0x44, 0x2d, 0x11, - ], - description: [ - 0xc6, 0xbd, 0xc2, 0xa5, 0x6f, 0xe2, 0xb1, 0xb0, 0x64, 0xc5, 0xb2, 0x39, 0xc8, 0x9d, - 0xcd, 0xb0, 0xc3, 0x8d, 0xc5, 0xa5, 0xc7, 0xb7, 0xe1, 0x9b, 0xa5, 0xcd, 0xb4, 0xcd, - 0xb6, 0xc6, 0x96, 0xc5, 0xa2, 0xe1, 0x9b, 0x87, 0x68, 0xe1, 0x9a, 0xb2, 0xe1, 0x9b, - 0xa0, 0xc4, 0x99, 0xe1, 0x9a, 0xa5, 0xc9, 0x8f, 0x61, 0xe2, 0xb1, 0xa7, 0xc5, 0x8b, - 0xc4, 0xbb, 0xe1, 0x9a, 0xb9, 0xc8, 0xab, 0xc6, 0x99, 0xc7, 0xaa, 0x21, 0xcd, 0xbc, - 0xc4, 0xa6, 0xc2, 0xb4, 0xe1, 0x9b, 0x9b, 0x52, 0x7a, 0xc2, 0xb1, 0xc7, 0x97, 0x5a, - 0xc6, 0xba, 0xc6, 0xb5, 0xc5, 0xbd, 0xc6, 0xb3, 0xc2, 0xb9, 0xc3, 0xac, 0xc8, 0x93, - 0xe1, 0x9a, 0xa7, 0xc6, 0x80, 0xc6, 0x86, 0xce, 0x86, 0xc7, 0x86, 0xc4, 0xa9, 0xc5, - 0x9b, 0x4d, 0x21, 0xc8, 0xa8, 0x2b, 0xc6, 0x9b, 0xc3, 0x9f, 0xe1, 0x9a, 0xbf, 0x60, - 0xe1, 0x9b, 0x86, 0xe2, 0xb1, 0xbc, 0xcd, 0xb1, 0xc5, 0xb1, 0xc4, 0xa3, 0x21, 0xc6, - 0xb2, 0xc4, 0x95, 0xc2, 0xbe, 0xe1, 0x9b, 0x93, 0xc6, 0x88, 0xe1, 0x9a, 0xa9, 0xc7, - 0xbb, 0xc7, 0xb4, 0xc3, 0x84, 0xc9, 0x8e, 0xc7, 0xb3, 0x43, 0xc8, 0x87, 0xce, 0x85, - 0x55, 0xc3, 0xbd, 0xc3, 0x9c, 0xc7, 0x81, 0xc6, 0x9b, 0xc6, 0xa1, 0x6b, 0xc5, 0x9e, - 0xc6, 0xa1, 0xc5, 0xaa, 0x6e, 0xc5, 0xbc, 0xc4, 0xb0, 0xc8, 0x84, 0xc9, 0x80, 0xc7, - 0xb3, 0xc5, 0xb3, 0xc9, 0x88, 0x33, 0xc4, 0x83, 0xe1, 0x9b, 0x8c, 0xc9, 0x86, 0x6d, - 0xc8, 0xa5, 0xc3, 0xaf, 0xe1, 0x9b, 0xa0, 0xc2, 0xb1, 0xe2, 0xb1, 0xba, 0xc5, 0xae, - 0x3e, 0x79, 0xc4, 0xa4, 0xe1, 0x9b, 0xad, 0x33, 0xc7, 0xaa, 0xc4, 0x8c, 0xc8, 0xb6, - 0xe2, 0xb1, 0xa8, 0xe2, 0xb1, 0xb2, 0xe1, 0x9b, 0x94, 0xc8, 0x8e, 0xc5, 0xb2, 0xc4, - 0xb5, 0xc4, 0xad, 0xc8, 0xb5, 0xc7, 0xa5, 0xe2, 0xb1, 0xbd, 0x3b, 0xe1, 0x9b, 0x9f, - 0xc6, 0x8d, 0xc5, 0x84, 0xe1, 0x9b, 0xae, 0xc5, 0x8d, 0x23, 0x6f, 0x6f, 0xc5, 0x83, - 0xc5, 0xa7, 0xc4, 0x84, 0xc8, 0xa4, 0xc4, 0xb2, 0xc5, 0xba, 0xe2, 0xb1, 0xa5, 0xc8, - 0xa2, 0x3f, 0xc8, 0x86, 0xc8, 0x8b, 0xe1, 0x9b, 0x9e, 0xc5, 0x91, 0xe1, 0x9a, 0xaf, - 0xe1, 0x9b, 0x9b, 0xc4, 0xb7, 0xc6, 0x97, 0xc7, 0xbb, 0xe1, 0x9b, 0x9c, 0xc7, 0xa8, - 0xc7, 0x9a, 0xe1, 0x9b, 0xab, 0xc4, 0x93, 0x2f, 0xc6, 0xa3, 0xc6, 0x9d, 0xc6, 0xa6, - 0xc3, 0x86, 0xe1, 0x9b, 0x89, 0xc5, 0x84, 0xc6, 0x92, 0xc7, 0xa9, 0xc7, 0x91, 0xc5, - 0x99, 0xc6, 0x88, 0xc5, 0x98, 0x71, 0xe2, 0xb1, 0xa6, 0xcd, 0xbe, 0x5c, 0xc6, 0x8a, - 0xc3, 0xae, 0xc4, 0x80, 0xe1, 0x9a, 0xa6, 0x2d, 0xc6, 0x83, 0xc6, 0xa0, 0xc8, 0x8c, - 0xc7, 0xa9, 0xc6, 0xb1, 0xe1, 0x9b, 0x81, 0xe2, 0xb1, 0xb5, 0xc7, 0x8b, 0x43, 0xc8, - 0xad, 0xc4, 0xa4, 0xc7, 0x81, 0xc2, 0xbc, 0x4b, 0xc6, 0xb5, 0x67, 0xc2, 0xa2, 0xcd, - 0xba, 0xc6, 0xaa, 0xc2, 0xb8, 0xe1, 0x9b, 0xa5, 0x3c, 0xcd, 0xba, 0xc4, 0x94, 0xe2, - 0xb1, 0xaa, 0xe2, 0xb1, 0xbf, 0x48, 0x45, 0xc7, 0xba, 0xc5, 0xa0, 0xc2, 0xae, 0x2b, - 0xc2, 0xb7, 0xc6, 0xad, 0xc4, 0xa5, 0xc4, 0x93, 0xe1, 0x9a, 0xbd, 0xc3, 0xb2, 0xe1, - 0x9a, 0xa7, 0x66, 0xc7, 0x8b, 0xc2, 0xa7, 0x5c, 0xc7, 0x96, 0xc4, 0xb2, 0xe1, 0x9a, - 0xbc, 0xe2, 0xb1, 0xab, 0x43, 0xc9, 0x8f, 0xc5, 0x8e, 0x58, 0xe1, 0x9a, 0xa9, 0xe1, - 0x9b, 0x96, 0x59, 0xc5, 0x93, 0xe1, 0x9b, 0x89, 0xc7, 0xb1, 0xe1, 0x9a, 0xaf, 0xc9, - 0x82, 0xe2, 0xb1, 0xaf, 0xc7, 0xb4, 0xc4, 0xa5, 0x62, 0xc8, 0x93, 0xc5, 0xae, 0xc4, - 0xae, 0xce, 0x8c, 0xc8, 0xa8, 0xe1, 0x9a, 0xa0, - ], - asset_base: [ - 0xca, 0x81, 0x0e, 0x15, 0xe1, 0x48, 0x19, 0x50, 0xde, 0x77, 0xab, 0x5f, 0x02, 0xa1, - 0xa6, 0x37, 0xf0, 0x5c, 0x3f, 0x12, 0x64, 0xbb, 0x93, 0x65, 0xf5, 0x0a, 0x91, 0x10, - 0x4d, 0x52, 0x2b, 0x9e, - ], - }, - ] -} diff --git a/src/test_vectors/issuance_auth_sig.rs b/src/test_vectors/issuance_auth_sig.rs new file mode 100644 index 000000000..fe71486e2 --- /dev/null +++ b/src/test_vectors/issuance_auth_sig.rs @@ -0,0 +1,277 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (issuance_auth_sig) + +pub(crate) struct TestVector { + pub(crate) isk: [u8; 32], + pub(crate) ik: [u8; 32], + pub(crate) msg: [u8; 32], + pub(crate) sig: [u8; 64], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + isk: [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, + ], + ik: [ + 0xf9, 0x30, 0x8a, 0x01, 0x92, 0x58, 0xc3, 0x10, 0x49, 0x34, 0x4f, 0x85, 0xf8, 0x9d, + 0x52, 0x29, 0xb5, 0x31, 0xc8, 0x45, 0x83, 0x6f, 0x99, 0xb0, 0x86, 0x01, 0xf1, 0x13, + 0xbc, 0xe0, 0x36, 0xf9, + ], + msg: [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ], + sig: [ + 0xe9, 0x07, 0x83, 0x1f, 0x80, 0x84, 0x8d, 0x10, 0x69, 0xa5, 0x37, 0x1b, 0x40, 0x24, + 0x10, 0x36, 0x4b, 0xdf, 0x1c, 0x5f, 0x83, 0x07, 0xb0, 0x08, 0x4c, 0x55, 0xf1, 0xce, + 0x2d, 0xca, 0x82, 0x15, 0x25, 0xf6, 0x6a, 0x4a, 0x85, 0xea, 0x8b, 0x71, 0xe4, 0x82, + 0xa7, 0x4f, 0x38, 0x2d, 0x2c, 0xe5, 0xeb, 0xee, 0xe8, 0xfd, 0xb2, 0x17, 0x2f, 0x47, + 0x7d, 0xf4, 0x90, 0x0d, 0x31, 0x05, 0x36, 0xc0, + ], + }, + TestVector { + isk: [ + 0x5d, 0x7a, 0x8f, 0x73, 0x9a, 0x2d, 0x9e, 0x94, 0x5b, 0x0c, 0xe1, 0x52, 0xa8, 0x04, + 0x9e, 0x29, 0x4c, 0x4d, 0x6e, 0x66, 0xb1, 0x64, 0x93, 0x9d, 0xaf, 0xfa, 0x2e, 0xf6, + 0xee, 0x69, 0x21, 0x48, + ], + ik: [ + 0x4b, 0xec, 0xe1, 0xff, 0x00, 0xe2, 0xed, 0x77, 0x64, 0xae, 0x6b, 0xe2, 0x0d, 0x2f, + 0x67, 0x22, 0x04, 0xfc, 0x86, 0xcc, 0xed, 0xd6, 0xfc, 0x1f, 0x71, 0xdf, 0x02, 0xc7, + 0x51, 0x6d, 0x9f, 0x31, + ], + msg: [ + 0x1c, 0xdd, 0x86, 0xb3, 0xcc, 0x43, 0x18, 0xd9, 0x61, 0x4f, 0xc8, 0x20, 0x90, 0x5d, + 0x04, 0x2b, 0xb1, 0xef, 0x9c, 0xa3, 0xf2, 0x49, 0x88, 0xc7, 0xb3, 0x53, 0x42, 0x01, + 0xcf, 0xb1, 0xcd, 0x8d, + ], + sig: [ + 0xa5, 0xb5, 0x92, 0x78, 0x1b, 0xeb, 0x55, 0xee, 0xbf, 0x8b, 0xc2, 0xbf, 0xd7, 0x9d, + 0xa9, 0x45, 0x2d, 0xc9, 0x22, 0x39, 0x87, 0x7e, 0xb7, 0xe1, 0xf5, 0x64, 0x65, 0xff, + 0x11, 0x1e, 0x59, 0x08, 0xde, 0xac, 0x15, 0xd5, 0x69, 0x99, 0x9a, 0x2b, 0xd2, 0x2b, + 0x2e, 0xf6, 0x01, 0xc5, 0x81, 0x3b, 0xdb, 0xba, 0x99, 0x3c, 0x08, 0xd4, 0xe8, 0x56, + 0xc9, 0x26, 0xd9, 0xe2, 0xc0, 0x63, 0x93, 0x67, + ], + }, + TestVector { + isk: [ + 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, + 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, + 0x30, 0xa7, 0x35, 0x94, + ], + ik: [ + 0xd4, 0x22, 0x9e, 0x19, 0x5e, 0x25, 0xf6, 0x02, 0xa2, 0x18, 0x61, 0x22, 0xcb, 0x4e, + 0x78, 0x76, 0x7b, 0x3c, 0x66, 0xac, 0x39, 0x08, 0x08, 0xd2, 0xd1, 0xb4, 0x04, 0x42, + 0xda, 0x7f, 0x00, 0x66, + ], + msg: [ + 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, 0x25, + 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, 0x91, + 0x2a, 0x63, 0x81, 0xce, + ], + sig: [ + 0x18, 0x8b, 0x15, 0x57, 0x42, 0x87, 0x83, 0x55, 0x6b, 0x66, 0x80, 0x3b, 0xf9, 0x06, + 0x63, 0xb7, 0xa1, 0x6d, 0x43, 0x76, 0x92, 0x7c, 0x58, 0x35, 0xe0, 0xb7, 0x26, 0x52, + 0x0e, 0xb2, 0x6d, 0x53, 0x24, 0x99, 0x10, 0xc3, 0x9c, 0x5f, 0x05, 0x90, 0xb6, 0xd6, + 0xaa, 0xb3, 0x51, 0xff, 0x8c, 0xd8, 0xe0, 0x63, 0xfa, 0x74, 0x20, 0x42, 0x55, 0xda, + 0xdc, 0x00, 0xd9, 0xe0, 0xdf, 0xf7, 0x7b, 0x09, + ], + }, + TestVector { + isk: [ + 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, 0xd7, 0x55, 0x1d, 0xb5, 0xfd, + 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, 0xd4, 0x77, 0x08, 0x37, 0x56, + 0xd5, 0x9a, 0xf8, 0x0d, + ], + ik: [ + 0xce, 0xb7, 0x5a, 0x43, 0x9f, 0xf0, 0x16, 0x15, 0x80, 0xbf, 0x29, 0x57, 0x24, 0xc6, + 0xd9, 0x2d, 0x31, 0xb7, 0xaa, 0x02, 0x84, 0x03, 0x39, 0x44, 0x49, 0x64, 0x48, 0x6f, + 0xae, 0xa8, 0x90, 0xe5, + ], + msg: [ + 0x06, 0xa7, 0x45, 0xf4, 0x4a, 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, + 0x85, 0xe1, 0x81, 0x30, 0xab, 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, + 0xcc, 0xb8, 0xf6, 0x76, + ], + sig: [ + 0x6e, 0x5e, 0xd6, 0x65, 0x6c, 0x32, 0x71, 0x32, 0xb1, 0x65, 0x81, 0x06, 0x2f, 0x1b, + 0x13, 0x8a, 0xcc, 0x6f, 0x1f, 0x83, 0x43, 0xed, 0x9d, 0x89, 0xab, 0x5f, 0xd9, 0x38, + 0xe4, 0xe6, 0xce, 0xf7, 0x99, 0xa2, 0x25, 0x1c, 0xa5, 0x2d, 0x60, 0x82, 0x0e, 0x51, + 0x00, 0x25, 0x06, 0x7d, 0xcd, 0x1b, 0xf7, 0x54, 0xc5, 0xbf, 0xf1, 0x39, 0xb4, 0xcc, + 0x44, 0xb3, 0x7d, 0x27, 0xd1, 0x7c, 0x4a, 0xee, + ], + }, + TestVector { + isk: [ + 0x49, 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, + 0xc2, 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, + 0x94, 0x90, 0x3d, 0x3c, + ], + ik: [ + 0xb0, 0xfa, 0x9d, 0x77, 0xfc, 0xbd, 0x96, 0x45, 0x91, 0x32, 0xe3, 0x05, 0xe3, 0x24, + 0xe7, 0x93, 0x6a, 0xe1, 0x3b, 0x15, 0x14, 0x7e, 0x20, 0x5d, 0x7b, 0xae, 0x42, 0xfa, + 0x7f, 0xaf, 0x5d, 0x1e, + ], + msg: [ + 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, 0x18, 0x3e, 0x31, + 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, 0xdc, 0xf0, 0x4b, + 0xe3, 0x4a, 0x98, 0x51, + ], + sig: [ + 0x17, 0xc2, 0xe5, 0xdf, 0x2e, 0xa6, 0xa1, 0x2e, 0x8a, 0xb2, 0xb0, 0xd5, 0x04, 0x89, + 0x8f, 0x3f, 0x23, 0x43, 0xe0, 0x98, 0x90, 0x7f, 0x7a, 0xfe, 0x43, 0xac, 0x8a, 0x01, + 0x14, 0x42, 0x35, 0x80, 0x97, 0x53, 0x67, 0xba, 0x4b, 0x6d, 0x16, 0x6c, 0x44, 0x28, + 0x48, 0x57, 0xb7, 0xcd, 0x29, 0xa8, 0x38, 0xb4, 0x9c, 0xc3, 0x41, 0xd2, 0x89, 0x51, + 0xaa, 0x0b, 0x5d, 0x55, 0x6a, 0x20, 0x9e, 0xb6, + ], + }, + TestVector { + isk: [ + 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, + 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, + 0x32, 0x0d, 0xad, 0xd6, + ], + ik: [ + 0x0b, 0xb4, 0x91, 0x3d, 0xba, 0xf1, 0x4e, 0xf6, 0xd0, 0xad, 0xeb, 0x8b, 0x70, 0x27, + 0xbf, 0x0b, 0x9a, 0x8f, 0x59, 0x0d, 0x3e, 0x2d, 0x95, 0xa1, 0x2d, 0xba, 0xaf, 0x0b, + 0x95, 0x33, 0xdc, 0xa4, + ], + msg: [ + 0x4f, 0x54, 0x31, 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, + 0x13, 0x09, 0x13, 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, + 0x47, 0xf1, 0xe1, 0x91, + ], + sig: [ + 0x42, 0x1f, 0x5b, 0x07, 0x57, 0x2e, 0x6b, 0x05, 0xe8, 0x0b, 0xa5, 0x85, 0xff, 0x63, + 0x21, 0x42, 0x26, 0x75, 0xcd, 0x19, 0xea, 0x59, 0x15, 0xd6, 0x32, 0xeb, 0x47, 0x64, + 0x6c, 0xe2, 0x20, 0x27, 0x6b, 0xb7, 0x82, 0x42, 0xcc, 0x75, 0x48, 0xd9, 0xa0, 0x57, + 0x2b, 0x89, 0x69, 0x2e, 0x5b, 0x95, 0xdb, 0x14, 0x14, 0xe4, 0xeb, 0xd2, 0x20, 0xcc, + 0xf8, 0x3a, 0xf2, 0x98, 0x2f, 0xdd, 0x3a, 0xec, + ], + }, + TestVector { + isk: [ + 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, 0xa9, + 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, 0xda, + 0xe6, 0x9c, 0xe8, 0xfc, + ], + ik: [ + 0x61, 0xbb, 0x33, 0x91, 0x59, 0xdf, 0x98, 0x20, 0xef, 0xae, 0xb6, 0x1d, 0x9a, 0x10, + 0xcd, 0xc1, 0x3b, 0x4c, 0x99, 0xfd, 0xc8, 0x6d, 0x94, 0x85, 0x11, 0x5d, 0xfd, 0x83, + 0x62, 0x36, 0xac, 0xf8, + ], + msg: [ + 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, 0x93, 0x1d, 0xe5, 0x18, 0x85, + 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, 0xc9, 0x37, 0x83, 0x65, 0xc8, + 0xf7, 0x39, 0x3c, 0x94, + ], + sig: [ + 0x5a, 0x11, 0x48, 0xa8, 0x92, 0x8f, 0xbf, 0x43, 0xbb, 0x33, 0xa5, 0x70, 0xf0, 0xdf, + 0xa3, 0x53, 0x32, 0xb7, 0x01, 0x80, 0x21, 0xa0, 0xcb, 0x75, 0xe9, 0x55, 0x4e, 0x86, + 0xec, 0xb2, 0x1d, 0xa3, 0x2e, 0xb5, 0xa2, 0xd8, 0xc5, 0x9e, 0xa3, 0x90, 0x43, 0xb9, + 0x74, 0x78, 0x75, 0x0c, 0x6b, 0xf8, 0x66, 0xeb, 0x3b, 0x01, 0x5e, 0xbb, 0x31, 0x68, + 0xf7, 0x53, 0x76, 0x6a, 0xd1, 0x71, 0xd2, 0x1e, + ], + }, + TestVector { + isk: [ + 0xe2, 0x88, 0x53, 0x15, 0xeb, 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, + 0xe5, 0x3e, 0x29, 0xfe, 0xf2, 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, + 0xf4, 0x68, 0xa0, 0x08, + ], + ik: [ + 0x19, 0x58, 0x53, 0x8b, 0x12, 0x17, 0xa0, 0x3d, 0x89, 0xcd, 0x83, 0xb8, 0x3d, 0x0b, + 0xdd, 0x40, 0xa6, 0x9a, 0xbe, 0x3a, 0xc2, 0x5d, 0x00, 0xc6, 0xd2, 0x69, 0x97, 0xf9, + 0xf2, 0x57, 0x4d, 0x4f, + ], + msg: [ + 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, + 0x3f, 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, + 0x03, 0x59, 0x65, 0x55, + ], + sig: [ + 0x16, 0x90, 0xf5, 0x43, 0xee, 0x67, 0xbb, 0x1c, 0xe0, 0xe4, 0x25, 0x4e, 0xa5, 0xdf, + 0xd0, 0x42, 0xfe, 0x86, 0x3a, 0xb4, 0x6c, 0xd9, 0xa8, 0x90, 0x55, 0x19, 0xff, 0xb1, + 0xb8, 0x40, 0x6b, 0xec, 0xbd, 0x90, 0xda, 0x66, 0xe5, 0xb5, 0x44, 0xbc, 0xd4, 0x3b, + 0xdb, 0x29, 0xbc, 0x5d, 0x2c, 0x02, 0x4d, 0xd2, 0x85, 0xab, 0xcd, 0x77, 0xe4, 0xac, + 0x1f, 0x9d, 0x60, 0x35, 0x22, 0xe4, 0xf1, 0x5b, + ], + }, + TestVector { + isk: [ + 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, 0x89, 0x26, + 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, 0x1e, 0x98, 0x5d, + 0x99, 0x58, 0x9c, 0x8b, + ], + ik: [ + 0x7d, 0xd6, 0xd7, 0x61, 0xe1, 0x02, 0x01, 0x37, 0xfa, 0x01, 0xb4, 0xdd, 0xd3, 0xb0, + 0xf3, 0x48, 0x04, 0xcc, 0x10, 0xcc, 0x4e, 0x9f, 0x6e, 0x9d, 0xf5, 0xb6, 0x04, 0x69, + 0xf5, 0x79, 0x36, 0x67, + ], + msg: [ + 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, + 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, + 0xed, 0x42, 0x43, 0x5e, + ], + sig: [ + 0x59, 0x34, 0x5d, 0x6b, 0x89, 0x4e, 0xd6, 0xd0, 0x3a, 0x56, 0x73, 0xa0, 0x14, 0x63, + 0x07, 0x51, 0x04, 0x3d, 0x11, 0xfa, 0x63, 0x18, 0x7c, 0x92, 0x9c, 0xae, 0x3f, 0xa1, + 0xb0, 0x29, 0x22, 0xf2, 0x7d, 0xc0, 0x16, 0x40, 0x33, 0x95, 0x2c, 0x84, 0x16, 0xe6, + 0xd0, 0x43, 0x81, 0x77, 0xb3, 0xbc, 0xe8, 0x78, 0xfd, 0xec, 0x75, 0x0a, 0x16, 0x64, + 0xd4, 0x89, 0xdf, 0x0a, 0x4e, 0xae, 0xb1, 0x35, + ], + }, + TestVector { + isk: [ + 0x92, 0x47, 0x69, 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, + 0x7b, 0x89, 0xe0, 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, + 0xf2, 0x65, 0x72, 0x50, + ], + ik: [ + 0xb5, 0x9c, 0x5f, 0x32, 0x34, 0xd6, 0xca, 0x36, 0xcc, 0x48, 0x3d, 0x67, 0xa8, 0x4f, + 0x37, 0xd6, 0xb2, 0x4b, 0x24, 0x45, 0x48, 0x25, 0xd2, 0xb7, 0xbf, 0xdc, 0x80, 0x2b, + 0x2e, 0x32, 0x8c, 0x43, + ], + msg: [ + 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, 0xbc, + 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, 0xe7, + 0x1a, 0x02, 0xaf, 0x11, + ], + sig: [ + 0xa4, 0x58, 0x79, 0x33, 0x26, 0x98, 0x37, 0x74, 0x09, 0x6d, 0x36, 0x59, 0xeb, 0x9a, + 0x21, 0xd1, 0x2c, 0x8e, 0xb8, 0x77, 0x56, 0x6b, 0x66, 0xbf, 0x60, 0x33, 0xdb, 0x8f, + 0xde, 0x20, 0xc4, 0x66, 0xa2, 0xe9, 0x54, 0x30, 0xa0, 0x1e, 0xb9, 0xad, 0x28, 0xe0, + 0x76, 0x5b, 0xed, 0x21, 0xdc, 0xd3, 0x03, 0x86, 0xfc, 0xe7, 0xaa, 0xba, 0xde, 0xa6, + 0xda, 0x72, 0x8c, 0x16, 0xbb, 0x80, 0xf1, 0xc2, + ], + }, + TestVector { + isk: [ + 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, 0xb1, 0xfc, 0xe4, 0x67, 0x50, + 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, 0xc3, 0x82, 0x85, 0x7d, 0xee, + 0xcc, 0x40, 0xa9, 0x8d, + ], + ik: [ + 0x45, 0x61, 0x9f, 0x20, 0x6c, 0x3b, 0xfc, 0x84, 0xfd, 0x42, 0x4f, 0xfb, 0x5c, 0x81, + 0x6f, 0x65, 0x4b, 0x27, 0xaa, 0x7f, 0x7b, 0x4b, 0xd6, 0x7e, 0xc5, 0xf9, 0xac, 0x6d, + 0x0f, 0x38, 0xdb, 0xb1, + ], + msg: [ + 0x5f, 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0x2d, 0xd2, 0x1a, 0xfd, 0xbb, 0x5d, 0x47, + 0xfa, 0x9a, 0x6d, 0xd9, 0x84, 0xd5, 0x67, 0xdb, 0x28, 0x57, 0xb9, 0x27, 0xb7, 0xfa, + 0xe2, 0xdb, 0x58, 0x71, + ], + sig: [ + 0xe6, 0x92, 0x4d, 0x53, 0xec, 0x97, 0x80, 0x79, 0xd6, 0x6a, 0x28, 0x4c, 0x00, 0xa8, + 0x68, 0xf9, 0xeb, 0x75, 0x1a, 0xe3, 0xb1, 0x69, 0x0d, 0x15, 0xee, 0x1b, 0x39, 0x68, + 0x0b, 0x83, 0xc4, 0x38, 0xe4, 0x5f, 0x02, 0xa2, 0x3c, 0x65, 0x6e, 0x4e, 0x53, 0xd3, + 0xc7, 0x3e, 0xfa, 0x0d, 0xc5, 0xf7, 0xad, 0x63, 0x28, 0x21, 0x7f, 0xd5, 0x9b, 0x23, + 0xaa, 0xe4, 0xf9, 0x0c, 0x68, 0xbe, 0x76, 0xbc, + ], + }, + ] +} diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 8fa650a37..4417713eb 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -44,14 +44,14 @@ pub(crate) fn test_vectors() -> Vec { 0xd4, 0xe2, 0x0f, 0x15, ], isk: [ - 0x95, 0x4a, 0x86, 0xc7, 0xa7, 0x15, 0x53, 0xfa, 0x6c, 0x8b, 0x67, 0x58, 0x54, 0x26, - 0x8e, 0xa5, 0x4c, 0x51, 0xfb, 0x17, 0xd8, 0x3d, 0x80, 0xee, 0x71, 0xd4, 0xae, 0x42, - 0xa1, 0xf8, 0xc8, 0x16, + 0x1c, 0xdd, 0x86, 0xb3, 0xcc, 0x43, 0x18, 0xd9, 0x61, 0x4f, 0xc8, 0x20, 0x90, 0x5d, + 0x04, 0x2b, 0xb1, 0xef, 0x9c, 0xa3, 0xf2, 0x49, 0x88, 0xc7, 0xb3, 0x53, 0x42, 0x01, + 0xcf, 0xb1, 0xcd, 0x8d, ], ik: [ - 0x2e, 0x4f, 0xd4, 0xa6, 0xec, 0x39, 0x94, 0x87, 0xd3, 0x78, 0xb4, 0xc7, 0x25, 0xfb, - 0x9b, 0xaf, 0xbc, 0x01, 0xa5, 0xe2, 0xb7, 0xf3, 0x68, 0x2e, 0xf4, 0x53, 0x95, 0x91, - 0xbc, 0xf0, 0x59, 0x02, + 0x16, 0x88, 0x4f, 0x1d, 0xbc, 0x92, 0x90, 0x89, 0xa4, 0x17, 0x6e, 0x84, 0x0b, 0xb5, + 0x81, 0xc8, 0x0e, 0x16, 0xe9, 0xb1, 0xab, 0xd6, 0x54, 0xe6, 0x2c, 0x8b, 0x0b, 0x95, + 0x70, 0x20, 0xb7, 0x48, ], nk: [ 0x9f, 0x2f, 0x82, 0x67, 0x38, 0x94, 0x5a, 0xd0, 0x1f, 0x47, 0xf7, 0x0d, 0xb0, 0xc3, @@ -111,7 +111,7 @@ pub(crate) fn test_vectors() -> Vec { 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 15643327852135767324, + note_v: 4751042572350679487, note_rho: [ 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, 0x5c, 0x22, 0x2f, @@ -123,14 +123,14 @@ pub(crate) fn test_vectors() -> Vec { 0x0c, 0x1d, 0x37, 0x10, ], note_cmx: [ - 0x45, 0x02, 0xe3, 0x39, 0x90, 0x1e, 0x39, 0x77, 0x17, 0x83, 0x91, 0x67, 0xcb, 0xb4, - 0x03, 0x7e, 0x0e, 0xcf, 0x68, 0x13, 0xb5, 0x1c, 0x81, 0xfe, 0x08, 0x5a, 0x7b, 0x78, - 0x2f, 0x12, 0x42, 0x28, + 0x6a, 0xcb, 0x59, 0x4e, 0x29, 0x6f, 0xfe, 0x99, 0xa8, 0x5c, 0x17, 0x5a, 0xa4, 0x22, + 0xc8, 0x29, 0x3c, 0xe7, 0xe1, 0x9a, 0x92, 0xdf, 0x7f, 0x80, 0xae, 0x87, 0x66, 0x55, + 0x44, 0x25, 0x83, 0x38, ], note_nf: [ - 0x1b, 0x32, 0xed, 0xbb, 0xe4, 0xd1, 0x8f, 0x28, 0x87, 0x6d, 0xe2, 0x62, 0x51, 0x8a, - 0xd3, 0x11, 0x22, 0x70, 0x1f, 0x8c, 0x0a, 0x52, 0xe9, 0x80, 0x47, 0xa3, 0x37, 0x87, - 0x6e, 0x7e, 0xea, 0x19, + 0x1c, 0x64, 0xc6, 0x82, 0x9a, 0x41, 0x21, 0xe1, 0x38, 0xd9, 0x8a, 0xae, 0xb4, 0xe6, + 0xbd, 0x4f, 0xf4, 0x5a, 0x1d, 0xb8, 0x6d, 0xef, 0x9f, 0x08, 0xd6, 0xaa, 0x60, 0x5a, + 0x97, 0xf3, 0x79, 0x39, ], }, TestVector { @@ -150,14 +150,14 @@ pub(crate) fn test_vectors() -> Vec { 0x56, 0xe4, 0x00, 0x2a, ], isk: [ - 0xee, 0xf5, 0xe9, 0x1b, 0x36, 0xb8, 0x06, 0x86, 0x72, 0x3d, 0x14, 0xdc, 0xc7, 0x04, - 0xad, 0x59, 0x67, 0x08, 0x0b, 0x7d, 0x6e, 0x49, 0xaf, 0x97, 0x03, 0x0e, 0x4f, 0xa0, - 0xbf, 0x5a, 0xd9, 0x0b, + 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, + 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, 0xe6, + 0x1d, 0xdf, 0x65, 0x8d, ], ik: [ - 0x2e, 0xde, 0xfb, 0x15, 0x8e, 0xa4, 0x48, 0x82, 0x57, 0x2b, 0xcd, 0xb2, 0x35, 0xca, - 0x36, 0xab, 0x39, 0xc7, 0x47, 0xbb, 0x71, 0xfe, 0x0f, 0x10, 0xfa, 0xa3, 0x9b, 0xfd, - 0x62, 0x0a, 0xcc, 0x04, + 0x46, 0x2e, 0xe2, 0x38, 0x00, 0xc2, 0x1e, 0x2b, 0xbd, 0x90, 0x2b, 0xf7, 0x2f, 0x60, + 0xe1, 0xab, 0x08, 0x26, 0xd3, 0x68, 0x0c, 0x6f, 0xd0, 0xa2, 0x6f, 0x87, 0xdb, 0xac, + 0xd0, 0xd7, 0x6c, 0xa0, ], nk: [ 0xa8, 0xb7, 0x3d, 0x97, 0x9b, 0x6e, 0xaa, 0xda, 0x89, 0x24, 0xbc, 0xbd, 0xc6, 0x3a, @@ -217,874 +217,874 @@ pub(crate) fn test_vectors() -> Vec { 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 4481649511318637270, + note_v: 654021594278506020, note_rho: [ - 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, - 0xad, 0xd6, 0x4f, 0x54, 0x31, 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, - 0x2c, 0x8d, 0x13, 0x09, + 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, + 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, + 0x79, 0x0f, 0xe5, 0x3e, ], note_rseed: [ - 0x13, 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, - 0xe1, 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, - 0x33, 0xa9, 0x7f, 0xa6, + 0x29, 0xfe, 0xf2, 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, + 0xa0, 0x08, 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, + 0xaa, 0xbe, 0x3f, 0x1a, ], note_cmx: [ - 0xc7, 0xad, 0x79, 0x4c, 0x56, 0x3e, 0x32, 0xca, 0xd4, 0x7d, 0x47, 0xdc, 0xda, 0x78, - 0x84, 0x69, 0x28, 0x48, 0xdc, 0xe2, 0x9b, 0xa4, 0xfe, 0xbd, 0x93, 0x20, 0x2b, 0x73, - 0x05, 0xf9, 0x03, 0x00, + 0x3b, 0x7a, 0x77, 0x4e, 0x5a, 0xc0, 0x16, 0xfd, 0x2a, 0x8a, 0x2b, 0xa0, 0x21, 0x2e, + 0x67, 0xfe, 0x16, 0x92, 0x9b, 0xa7, 0x2e, 0x7b, 0x82, 0x70, 0x8b, 0xd5, 0x74, 0x96, + 0xfb, 0xb3, 0x0f, 0x22, ], note_nf: [ - 0x2c, 0xf0, 0x67, 0xbc, 0x21, 0xd6, 0x63, 0x20, 0xe5, 0x1b, 0x9f, 0xbd, 0xc8, 0xae, - 0x03, 0x1c, 0x2c, 0x96, 0x37, 0x3d, 0xb4, 0x3b, 0x7b, 0x1a, 0x45, 0x05, 0x6c, 0x00, - 0xc6, 0x5d, 0x43, 0x20, + 0x6c, 0xba, 0xbc, 0xfe, 0x07, 0x58, 0xc0, 0x61, 0x75, 0x59, 0x3f, 0xcc, 0x89, 0x37, + 0x55, 0x9a, 0xc1, 0xc7, 0xb7, 0x22, 0xd5, 0x65, 0xa1, 0xf3, 0xfc, 0xf0, 0xb8, 0xc5, + 0x90, 0x37, 0x8a, 0x1c, ], }, TestVector { sk: [ - 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, 0xda, 0xe6, 0x9c, - 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, 0x93, 0x1d, 0xe5, - 0x18, 0x85, 0x68, 0x78, + 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, 0x59, + 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, + 0x89, 0x26, 0xc1, 0x03, ], ask: [ - 0xce, 0x8b, 0x65, 0xa7, 0x23, 0x65, 0x11, 0xb2, 0xea, 0xf1, 0x9f, 0x72, 0xa3, 0xd6, - 0xdb, 0x7d, 0x06, 0x2b, 0x66, 0xf5, 0x16, 0x30, 0x7d, 0x19, 0x87, 0x06, 0xe5, 0xf6, - 0x92, 0x8e, 0x16, 0x15, + 0xe0, 0x9b, 0x65, 0x10, 0x87, 0x7d, 0xd4, 0x0e, 0x85, 0x4e, 0xe4, 0xb9, 0xc4, 0xc3, + 0x89, 0x8e, 0xc1, 0xe7, 0x26, 0x60, 0xfe, 0xf5, 0xb0, 0xab, 0xda, 0xdb, 0xa8, 0x08, + 0x10, 0x50, 0xae, 0x38, ], ak: [ - 0xef, 0xa5, 0xf1, 0xde, 0xbe, 0xea, 0xd0, 0x94, 0x0a, 0x61, 0x9c, 0xe0, 0x01, 0x7b, - 0xed, 0xb4, 0x26, 0x65, 0x7b, 0x2d, 0x07, 0x40, 0x66, 0x64, 0xd8, 0x95, 0x31, 0x2e, - 0xa1, 0xc3, 0xb3, 0x34, + 0x53, 0xf7, 0x4b, 0x84, 0x33, 0xe9, 0x4a, 0xae, 0xb8, 0x5f, 0x5e, 0xb4, 0x1a, 0x89, + 0xc1, 0x0f, 0xe2, 0x0a, 0xe0, 0x03, 0xec, 0xf4, 0xbc, 0xe1, 0x63, 0x38, 0xd9, 0x75, + 0x88, 0x65, 0x6b, 0x38, ], isk: [ - 0x5b, 0x1f, 0xc4, 0x57, 0xae, 0x71, 0x38, 0x3c, 0x53, 0xf4, 0x69, 0x41, 0xb7, 0xcb, - 0x4c, 0xec, 0x3d, 0xea, 0xc0, 0xc6, 0x03, 0xe2, 0xcd, 0xd0, 0xd1, 0x8d, 0x94, 0x01, - 0x9e, 0x43, 0xe2, 0x07, + 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, 0x1e, 0x98, 0x5d, 0x99, 0x58, + 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, + 0x1c, 0xd0, 0x74, 0xa5, ], ik: [ - 0x4f, 0x43, 0xeb, 0x7d, 0x9e, 0x03, 0x6f, 0xa6, 0x15, 0xfd, 0x04, 0xa5, 0xef, 0x6a, - 0xeb, 0x21, 0x6e, 0x06, 0x9b, 0xe9, 0x2d, 0x30, 0xe8, 0xf7, 0x16, 0x3e, 0xe3, 0x15, - 0x11, 0x6f, 0x18, 0x32, + 0xcb, 0x48, 0x0d, 0x9b, 0x96, 0x27, 0x3e, 0x89, 0x91, 0x40, 0x89, 0xa1, 0x04, 0xc2, + 0xc9, 0x36, 0xd0, 0x75, 0x95, 0xd4, 0xf8, 0x46, 0xad, 0xa6, 0xca, 0xea, 0x68, 0x5c, + 0x88, 0x0b, 0x8a, 0xf8, ], nk: [ - 0x04, 0x51, 0x4e, 0xa0, 0x48, 0xb9, 0x43, 0x63, 0xde, 0xa7, 0xcb, 0x3b, 0xe8, 0xd6, - 0x25, 0x82, 0xac, 0x52, 0x92, 0x2e, 0x08, 0x65, 0xf6, 0x62, 0x74, 0x3b, 0x05, 0xea, - 0xe8, 0x71, 0x5f, 0x17, + 0x6e, 0x37, 0x10, 0xbc, 0xa6, 0x80, 0x46, 0xc8, 0x3e, 0x54, 0x80, 0xbf, 0xe7, 0x3f, + 0xd7, 0x54, 0x13, 0x5d, 0xc0, 0x7f, 0xa1, 0xd1, 0x1b, 0x86, 0x5f, 0xd1, 0x5e, 0x7c, + 0x4e, 0x63, 0xe2, 0x02, ], rivk: [ - 0x2a, 0x32, 0x8f, 0x99, 0x4f, 0x6e, 0x5a, 0xd2, 0x9c, 0xa8, 0x11, 0xed, 0x34, 0x49, - 0x68, 0xea, 0x2c, 0xfc, 0x3f, 0xd2, 0x31, 0x03, 0x0e, 0x37, 0xbb, 0xd5, 0x6d, 0xb4, - 0x26, 0x40, 0x23, 0x1c, + 0xaa, 0xcc, 0xc8, 0x41, 0xfe, 0x74, 0x89, 0x49, 0xcf, 0x90, 0x59, 0xb5, 0x41, 0x1c, + 0x2c, 0xe8, 0xf0, 0x07, 0x05, 0x00, 0x23, 0x85, 0x2d, 0xd5, 0x8d, 0xb0, 0xb6, 0x9b, + 0x44, 0xfe, 0xf5, 0x33, ], ivk: [ - 0x60, 0x9e, 0xcb, 0xc3, 0xd8, 0xce, 0xe3, 0xbe, 0x2b, 0x2a, 0x23, 0x62, 0x95, 0x1f, - 0x58, 0xb7, 0x44, 0x82, 0xad, 0xfa, 0xee, 0xe1, 0xc4, 0x0f, 0x94, 0x03, 0x04, 0x40, - 0xf5, 0x58, 0xaa, 0x30, + 0xa8, 0x1d, 0xfd, 0x18, 0xbf, 0x1e, 0x5e, 0xad, 0x3d, 0x10, 0x02, 0xf5, 0xfe, 0x4b, + 0xcb, 0x89, 0xde, 0xea, 0xf9, 0xd6, 0x4c, 0xf8, 0x0a, 0xef, 0xdc, 0xb6, 0xcd, 0x0c, + 0xb7, 0xd1, 0x79, 0x02, ], ovk: [ - 0xdf, 0xd3, 0x0f, 0x62, 0xaa, 0x31, 0x9c, 0x6f, 0x53, 0xe2, 0x4c, 0x1f, 0x48, 0xc1, - 0xde, 0x96, 0x1b, 0x90, 0x01, 0xcb, 0x98, 0x8b, 0x80, 0xb3, 0xed, 0xa2, 0x44, 0xfc, - 0xfe, 0xb2, 0x5f, 0x83, + 0x45, 0xcf, 0x1a, 0x1d, 0xf6, 0x62, 0xfe, 0xc0, 0xf7, 0x84, 0x7a, 0x63, 0xa0, 0xd7, + 0x95, 0x51, 0xe1, 0xb0, 0x49, 0xc3, 0xc3, 0x58, 0x7e, 0x68, 0x37, 0xa7, 0x54, 0x45, + 0xa0, 0x04, 0x12, 0xa7, ], dk: [ - 0x23, 0x6b, 0xc3, 0xf3, 0xd0, 0x2f, 0x96, 0x02, 0x80, 0xee, 0xde, 0xde, 0x10, 0x8d, - 0x36, 0x85, 0x04, 0x9f, 0x23, 0x9a, 0xa6, 0x7c, 0x48, 0x55, 0x8f, 0x7c, 0x01, 0xd3, - 0xfd, 0x46, 0x9e, 0xcd, + 0xa8, 0x61, 0xd9, 0xa4, 0x37, 0x61, 0x87, 0xb2, 0xb5, 0xc1, 0x9a, 0x5f, 0x89, 0x6f, + 0xa4, 0x75, 0xaa, 0x0e, 0xd3, 0x8b, 0x99, 0x54, 0xf3, 0x93, 0x8a, 0x04, 0xec, 0x41, + 0xe5, 0x4f, 0xaf, 0x1c, ], default_d: [ - 0x64, 0x24, 0xf7, 0x1a, 0x3a, 0xd1, 0x97, 0x42, 0x64, 0x98, 0xf4, + 0x59, 0x8d, 0x20, 0x0e, 0x50, 0x9e, 0xc2, 0x4b, 0xdc, 0x7f, 0x1c, ], default_pk_d: [ - 0xec, 0xcb, 0x6a, 0x57, 0x80, 0x20, 0x42, 0x37, 0x98, 0x72, 0x32, 0xbc, 0x09, 0x8f, - 0x89, 0xac, 0xc4, 0x75, 0xc3, 0xf7, 0x4b, 0xd6, 0x9e, 0x2f, 0x35, 0xd4, 0x47, 0x36, - 0xf4, 0x8f, 0x3c, 0x14, + 0x68, 0x10, 0x44, 0xee, 0x77, 0xd7, 0xf8, 0x6a, 0x0a, 0x5c, 0x0c, 0xbe, 0x89, 0xa7, + 0xef, 0x3b, 0x3f, 0x5a, 0x6e, 0x85, 0x99, 0x8f, 0x48, 0x48, 0x51, 0xc9, 0x8a, 0x22, + 0x80, 0x18, 0xa0, 0x1e, ], internal_rivk: [ - 0x0a, 0xa9, 0xaa, 0xaa, 0x2c, 0xf1, 0x84, 0x90, 0xdd, 0xf9, 0xa7, 0xe5, 0x21, 0x07, - 0x14, 0x07, 0xea, 0x9b, 0xff, 0xfe, 0x84, 0x34, 0x29, 0xbc, 0x94, 0xa2, 0x88, 0xe8, - 0xa6, 0x06, 0xa7, 0x10, + 0xda, 0x3c, 0xdd, 0x9e, 0x0a, 0x3d, 0x1c, 0x41, 0x3e, 0x51, 0xb5, 0x34, 0x67, 0x7e, + 0x88, 0x3e, 0x85, 0x4b, 0x5f, 0x54, 0xbb, 0xdb, 0xba, 0x05, 0x04, 0xab, 0xb2, 0x2b, + 0x31, 0x5c, 0x4c, 0x1d, ], internal_ivk: [ - 0xa0, 0x6a, 0xbd, 0x29, 0xd5, 0xa1, 0x99, 0xe1, 0xc2, 0x10, 0x25, 0xb0, 0x33, 0x7e, - 0x94, 0x1f, 0x6d, 0x4d, 0x84, 0xeb, 0x7c, 0xc3, 0x5a, 0x39, 0x7f, 0x9e, 0x75, 0x3f, - 0xda, 0xed, 0x81, 0x0d, + 0x29, 0x3f, 0xf5, 0xf5, 0x2b, 0x40, 0xcf, 0x48, 0xeb, 0x4f, 0x21, 0x45, 0x24, 0xad, + 0xed, 0x6b, 0x53, 0x85, 0xf6, 0x09, 0x67, 0x56, 0xec, 0xa3, 0x0d, 0x46, 0xff, 0x47, + 0xa8, 0xc8, 0x6f, 0x0c, ], internal_ovk: [ - 0xf8, 0x2e, 0xb2, 0x49, 0x06, 0xe2, 0x94, 0xff, 0x65, 0x71, 0xac, 0x7d, 0x83, 0x68, - 0xea, 0x82, 0x80, 0xd4, 0x22, 0xf3, 0x47, 0x7c, 0xe7, 0x2a, 0xef, 0x5f, 0x9b, 0x9e, - 0xca, 0x48, 0x46, 0x8f, + 0x0c, 0xfc, 0xe5, 0xec, 0xc4, 0x1f, 0x12, 0x02, 0xcb, 0x61, 0xa4, 0x7f, 0x6d, 0x55, + 0x9a, 0x63, 0x92, 0x25, 0xc5, 0xb4, 0x7a, 0x99, 0x65, 0xc3, 0x02, 0x00, 0xd1, 0xb7, + 0xea, 0x58, 0xc1, 0x30, ], internal_dk: [ - 0x36, 0x56, 0xb5, 0x45, 0xa5, 0x0a, 0x6b, 0x26, 0x28, 0x74, 0x76, 0x64, 0x1b, 0x2b, - 0x68, 0xc6, 0x3c, 0x36, 0xf3, 0x32, 0xe7, 0x45, 0x57, 0xe9, 0x16, 0x05, 0x0f, 0x0b, - 0x91, 0x11, 0x17, 0x9b, + 0x43, 0x81, 0x82, 0x5b, 0x76, 0xeb, 0x8d, 0x47, 0x0a, 0x8b, 0x98, 0xed, 0x53, 0xff, + 0xb4, 0xd1, 0xf2, 0x1e, 0x96, 0x45, 0x0b, 0xe9, 0x4b, 0x15, 0xa8, 0x52, 0x1e, 0xe8, + 0x6f, 0xb6, 0xea, 0xe8, ], asset: [ 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 14496603531126387959, + note_v: 15839468553911279642, note_rho: [ - 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, - 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, 0x1a, 0x84, 0xb2, 0x7d, 0xb5, - 0x9a, 0x4a, 0x15, 0x3d, + 0xce, 0xcb, 0x8c, 0xb8, 0xa5, 0xda, 0x01, 0x30, 0x71, 0x52, 0xf1, 0x39, 0x36, 0xa2, + 0x70, 0x57, 0x26, 0x70, 0xdc, 0x82, 0xd3, 0x90, 0x26, 0xc6, 0xcb, 0x4c, 0xd4, 0xb0, + 0xf7, 0xf5, 0xaa, 0x2a, ], note_rseed: [ - 0x88, 0x2d, 0x2b, 0x21, 0x03, 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, - 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, - 0xcf, 0x4a, 0x0d, 0x9c, + 0x4f, 0x5a, 0x53, 0x41, 0xec, 0x5d, 0xd7, 0x15, 0x40, 0x6f, 0x2f, 0xdd, 0x2a, 0xfa, + 0x73, 0x3f, 0x5f, 0x64, 0x1c, 0x8c, 0x21, 0x86, 0x2a, 0x1b, 0xaf, 0xce, 0x26, 0x09, + 0xd9, 0xee, 0xcf, 0xa1, ], note_cmx: [ - 0x03, 0xce, 0x20, 0xce, 0xa1, 0x94, 0xb7, 0x55, 0x9a, 0x8a, 0x90, 0x47, 0x1d, 0x28, - 0xa3, 0xc0, 0x53, 0xc3, 0x72, 0x0a, 0xd4, 0x9f, 0x40, 0xd2, 0x7c, 0x2d, 0xcc, 0xe3, - 0x35, 0x00, 0x56, 0x16, + 0x1b, 0x83, 0x10, 0x6d, 0xf8, 0x12, 0xf5, 0xb3, 0x24, 0xbc, 0x8d, 0xc9, 0x87, 0x02, + 0x52, 0xfd, 0x7a, 0x44, 0xf2, 0xd7, 0x5b, 0xf5, 0x54, 0x41, 0xac, 0x92, 0x5b, 0x45, + 0x82, 0xf9, 0x75, 0x17, ], note_nf: [ - 0x16, 0xfa, 0x2c, 0x34, 0x97, 0xfc, 0x09, 0xad, 0x90, 0xdd, 0x34, 0x92, 0x02, 0xa2, - 0x4b, 0x69, 0x89, 0x2d, 0xc8, 0x06, 0x29, 0xb2, 0xd1, 0xbf, 0xeb, 0xaf, 0x41, 0x70, - 0x8f, 0x0f, 0xb1, 0x0c, + 0x4b, 0xf3, 0xd9, 0x9e, 0x14, 0xdb, 0x5c, 0xa1, 0xb5, 0x81, 0x8d, 0x93, 0x37, 0xe9, + 0x26, 0xb1, 0x3c, 0x55, 0x94, 0x12, 0xd5, 0x61, 0xb6, 0xc7, 0x30, 0x53, 0xe2, 0xc7, + 0xb2, 0x08, 0x5a, 0x2d, ], }, TestVector { sk: [ - 0x73, 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, - 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, - 0xba, 0x18, 0xd1, 0xdb, + 0x58, 0xcf, 0xb5, 0xcd, 0x79, 0xf8, 0x80, 0x08, 0xe3, 0x15, 0xdc, 0x7d, 0x83, 0x88, + 0xe7, 0x6c, 0x17, 0x82, 0xfd, 0x27, 0x95, 0xd1, 0x8a, 0x76, 0x36, 0x24, 0xc2, 0x5f, + 0xa9, 0x59, 0xcc, 0x97, ], ask: [ - 0x42, 0x6a, 0x78, 0x44, 0xf3, 0x05, 0xb9, 0xd4, 0xe0, 0x7e, 0xa5, 0x2a, 0x39, 0x00, - 0x1c, 0x9b, 0x33, 0x6c, 0xfc, 0x0d, 0x6f, 0xa1, 0x5e, 0xf3, 0xd1, 0x1c, 0x3d, 0x7b, - 0x74, 0xf0, 0x8c, 0x2d, + 0x74, 0xef, 0xaa, 0xff, 0x27, 0x9c, 0xde, 0x93, 0x36, 0x11, 0x7a, 0xa4, 0x68, 0xb4, + 0xed, 0xdb, 0x70, 0x38, 0xa1, 0x22, 0xef, 0x86, 0x7d, 0xba, 0x05, 0x3e, 0x33, 0x55, + 0x68, 0x0a, 0x8c, 0x3c, ], ak: [ - 0xb1, 0xe0, 0xac, 0xbc, 0x69, 0xbf, 0x37, 0x7b, 0x85, 0xab, 0xf0, 0xf5, 0xa1, 0x0b, - 0xe7, 0x2c, 0x3b, 0x64, 0x00, 0x06, 0xff, 0x08, 0x50, 0x52, 0x80, 0xe4, 0xf0, 0x0f, - 0xad, 0xf7, 0x63, 0x28, + 0xc4, 0x51, 0x8d, 0x3c, 0xde, 0xa6, 0x55, 0xa3, 0x2d, 0xf8, 0xe3, 0xf5, 0xc1, 0x51, + 0xb5, 0x42, 0x32, 0x85, 0x31, 0xca, 0x01, 0xa6, 0x3f, 0x3c, 0x03, 0xa3, 0xc2, 0x4e, + 0xa7, 0x32, 0x82, 0x3a, ], isk: [ - 0x71, 0xd0, 0x64, 0xaa, 0xa0, 0x82, 0x63, 0xb8, 0xe4, 0xc3, 0xed, 0x70, 0x3c, 0x6f, - 0x54, 0x25, 0x4a, 0x88, 0x8c, 0x36, 0xec, 0x69, 0x86, 0x62, 0xf7, 0x1f, 0xbb, 0xf4, - 0x26, 0xd9, 0x09, 0x28, + 0x48, 0x9c, 0xe7, 0x57, 0x45, 0x82, 0x4b, 0x77, 0x86, 0x8c, 0x53, 0x23, 0x9c, 0xfb, + 0xdf, 0x73, 0xca, 0xec, 0x65, 0x60, 0x40, 0x37, 0x31, 0x4f, 0xaa, 0xce, 0xb5, 0x62, + 0x18, 0xc6, 0xbd, 0x30, ], ik: [ - 0x12, 0xb3, 0xab, 0xff, 0x96, 0x75, 0x20, 0x9e, 0x94, 0x54, 0x07, 0x0c, 0x14, 0xac, - 0x15, 0x54, 0x65, 0xae, 0x83, 0xbe, 0x2c, 0x39, 0x46, 0x63, 0x5e, 0x38, 0x77, 0xba, - 0x67, 0xdf, 0x49, 0x12, + 0xed, 0x56, 0xef, 0x8b, 0x55, 0x28, 0x00, 0x0f, 0xc2, 0xee, 0xf3, 0x33, 0x50, 0x8f, + 0x4c, 0x32, 0x71, 0x62, 0xd8, 0x96, 0x3b, 0xad, 0x50, 0xcc, 0x55, 0xdc, 0x03, 0x7d, + 0xb9, 0x60, 0x7f, 0x52, ], nk: [ - 0xcf, 0x36, 0xad, 0x6a, 0x06, 0x6c, 0xd2, 0x13, 0xe1, 0xd7, 0x67, 0xab, 0x07, 0x1d, - 0xc1, 0x16, 0x78, 0x85, 0xc4, 0x16, 0x8b, 0xc2, 0xe2, 0x17, 0x54, 0x48, 0x56, 0x3a, - 0xd1, 0x3f, 0x33, 0x3d, + 0x76, 0xff, 0xc1, 0xbb, 0x8d, 0xd7, 0xfb, 0x48, 0x7d, 0x48, 0xd0, 0x94, 0x29, 0x66, + 0x0b, 0xbc, 0x1d, 0xfc, 0xbf, 0x57, 0xc4, 0xa5, 0xa3, 0x21, 0x33, 0x24, 0x33, 0x44, + 0x70, 0xed, 0xdf, 0x33, ], rivk: [ - 0xc4, 0x1b, 0xba, 0xd3, 0x51, 0x05, 0xa8, 0x03, 0x14, 0xb7, 0x96, 0x24, 0xb6, 0x75, - 0x24, 0x12, 0x20, 0xb3, 0x31, 0xf1, 0x25, 0x92, 0x61, 0x7b, 0xdb, 0x70, 0x5b, 0xfc, - 0xce, 0x72, 0xae, 0x38, + 0x22, 0xe2, 0xf3, 0x90, 0x11, 0xe6, 0x70, 0xc8, 0x0f, 0xba, 0xc8, 0x91, 0x59, 0xac, + 0x63, 0x4d, 0x84, 0xd7, 0xc1, 0x3e, 0xbe, 0xfb, 0x97, 0x3b, 0xa4, 0x1f, 0x0c, 0x79, + 0xf0, 0x33, 0xfc, 0x3f, ], ivk: [ - 0xf7, 0x9f, 0xe8, 0x02, 0xe4, 0xd2, 0x43, 0x07, 0xa6, 0xaa, 0xf8, 0x5d, 0x19, 0xf5, - 0xe0, 0x83, 0x37, 0x40, 0xba, 0xe5, 0x98, 0xdc, 0x7c, 0x88, 0x0a, 0xc6, 0x09, 0x63, - 0x1d, 0xe1, 0x58, 0x19, + 0xe6, 0x80, 0xf5, 0xa7, 0x15, 0xb3, 0x2b, 0x9e, 0x1a, 0x14, 0x67, 0x9f, 0x11, 0x16, + 0xf1, 0x13, 0xaa, 0x04, 0x93, 0xf3, 0x82, 0x1b, 0x10, 0x8c, 0xa7, 0xe1, 0xc0, 0x71, + 0xad, 0x75, 0x2d, 0x22, ], ovk: [ - 0xf9, 0x63, 0x66, 0xbc, 0x6e, 0xab, 0xd2, 0x32, 0x54, 0x9e, 0xbb, 0x43, 0xb4, 0xed, - 0x6f, 0xd8, 0x1d, 0x33, 0x03, 0x73, 0xc5, 0xb5, 0x66, 0x90, 0x4e, 0x9a, 0xf1, 0x1a, - 0x6b, 0xab, 0x8d, 0x77, + 0x2a, 0x34, 0xab, 0x11, 0xc4, 0x0c, 0x6b, 0x3b, 0x28, 0x54, 0x56, 0xa6, 0x91, 0x54, + 0xcb, 0xe4, 0x4c, 0xba, 0x01, 0xda, 0x6d, 0xb0, 0xc2, 0xb2, 0x2b, 0x84, 0xca, 0x27, + 0x2b, 0xae, 0x01, 0xad, ], dk: [ - 0x80, 0x3e, 0x34, 0x85, 0x73, 0x02, 0x2b, 0xf8, 0x93, 0x2f, 0x23, 0xee, 0x7a, 0x32, - 0x5e, 0xa2, 0x83, 0x87, 0x9c, 0x65, 0x24, 0x12, 0xb8, 0x60, 0x6b, 0xe3, 0x19, 0x8c, - 0x4b, 0x78, 0x2c, 0x47, + 0xfa, 0xaa, 0xb4, 0xb9, 0x32, 0x46, 0x23, 0xc6, 0xc8, 0x6b, 0xd5, 0xdb, 0x70, 0xa7, + 0x18, 0xd9, 0x0b, 0xc0, 0xf1, 0x5b, 0x2b, 0x39, 0xeb, 0xfa, 0x82, 0xb5, 0xb1, 0xcc, + 0x14, 0x67, 0x0c, 0xbe, ], default_d: [ - 0xdb, 0x8c, 0x30, 0x55, 0x24, 0xbc, 0x0d, 0xea, 0xa8, 0x5d, 0x97, + 0x66, 0x4c, 0xab, 0xf8, 0xf7, 0x68, 0x93, 0xcb, 0x8d, 0xa7, 0x84, ], default_pk_d: [ - 0x04, 0xea, 0x8c, 0x13, 0x20, 0xff, 0xbb, 0xad, 0xfe, 0x96, 0xf0, 0xc6, 0xff, 0x16, - 0xb6, 0x07, 0x11, 0x1b, 0x55, 0x83, 0xbf, 0xb6, 0xf1, 0xea, 0x45, 0x27, 0x5e, 0xf2, - 0xaa, 0x2d, 0x87, 0x9b, + 0x07, 0x7c, 0x84, 0x57, 0x8b, 0x1d, 0xae, 0x2f, 0x80, 0x69, 0xef, 0x67, 0xd2, 0x87, + 0x71, 0x8d, 0xaf, 0xf5, 0xa1, 0x69, 0x4e, 0x1a, 0x8e, 0xa2, 0x36, 0xc9, 0xe6, 0x94, + 0x61, 0x5f, 0xb8, 0x16, ], internal_rivk: [ - 0x9e, 0x45, 0x2a, 0xb7, 0x2c, 0x6c, 0x8e, 0xcc, 0xf2, 0xe4, 0x39, 0xa0, 0xce, 0xc0, - 0xa0, 0xac, 0x39, 0x4a, 0x1a, 0xa1, 0x21, 0xac, 0x60, 0x32, 0xa7, 0xeb, 0xc2, 0x9d, - 0xb4, 0x85, 0x62, 0x26, + 0xc4, 0x01, 0xbc, 0x90, 0x7a, 0xaa, 0xed, 0xd1, 0x3b, 0x1f, 0xa7, 0x0d, 0x7a, 0xb2, + 0x8d, 0x71, 0x3b, 0x46, 0x38, 0xeb, 0xfb, 0xc8, 0xf9, 0xcc, 0x1d, 0xae, 0xd5, 0xac, + 0x2b, 0x76, 0x75, 0x33, ], internal_ivk: [ - 0x3b, 0xa9, 0x3b, 0x0f, 0xc3, 0xf2, 0x7a, 0xb2, 0x17, 0x63, 0x5d, 0x03, 0xf9, 0x0d, - 0x0b, 0x84, 0x2d, 0x99, 0xa1, 0x2c, 0xdc, 0x37, 0xa8, 0x1c, 0x18, 0x1e, 0xc0, 0x18, - 0xe5, 0xf4, 0x4c, 0x11, + 0xea, 0x9b, 0xeb, 0x2d, 0x19, 0x6a, 0xd4, 0x79, 0x69, 0xf2, 0x03, 0xdd, 0x28, 0xa0, + 0xfb, 0xe2, 0x4b, 0x98, 0x12, 0xb1, 0x15, 0x5b, 0x17, 0x01, 0x96, 0x36, 0x6a, 0xcd, + 0x62, 0xf5, 0xeb, 0x0c, ], internal_ovk: [ - 0xe3, 0xc7, 0xf8, 0x6c, 0x1b, 0x23, 0x83, 0xb3, 0xbd, 0x41, 0xad, 0x1a, 0x8f, 0x11, - 0xef, 0xa2, 0x55, 0x4a, 0x41, 0x0a, 0x98, 0xc8, 0x92, 0x07, 0xae, 0xb4, 0x31, 0x9b, - 0x1a, 0xbd, 0x78, 0x79, + 0x2f, 0x6d, 0x74, 0x4f, 0x40, 0xd6, 0xdc, 0xe6, 0x5e, 0x33, 0x5d, 0x3c, 0xb3, 0x96, + 0xc5, 0xaf, 0x54, 0xf0, 0xf7, 0xd5, 0x4f, 0xb4, 0x37, 0xec, 0x8e, 0x20, 0x29, 0x28, + 0x05, 0x8e, 0xfa, 0xdf, ], internal_dk: [ - 0xd7, 0x1a, 0x68, 0xcf, 0xd6, 0xc7, 0x68, 0xf4, 0x30, 0x73, 0xf6, 0x98, 0x18, 0x9a, - 0xc7, 0x5e, 0xe4, 0x21, 0xb4, 0x20, 0x4b, 0xb6, 0xf3, 0xc5, 0xd0, 0xfc, 0x43, 0x28, - 0x49, 0xaa, 0x71, 0x61, + 0x9f, 0xec, 0x61, 0xd0, 0x20, 0xb9, 0x29, 0x37, 0xbd, 0xf3, 0xc3, 0xce, 0x09, 0x43, + 0x3d, 0xdf, 0x01, 0xd4, 0xab, 0xe7, 0x43, 0x93, 0x94, 0x6e, 0x49, 0xcd, 0x79, 0xd1, + 0x19, 0x86, 0xb9, 0xfe, ], asset: [ 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 6792346249443327211, + note_v: 4573834453415770104, note_rho: [ - 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, 0xbc, - 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, 0xe7, - 0x1a, 0x02, 0xaf, 0x11, + 0x21, 0xa9, 0xfb, 0x80, 0xad, 0x03, 0xbc, 0x0c, 0xda, 0x4a, 0x44, 0x94, 0x6c, 0x00, + 0xe1, 0xb1, 0xa1, 0xdf, 0x0e, 0x5b, 0x87, 0xb5, 0xbe, 0xce, 0x47, 0x7a, 0x70, 0x96, + 0x49, 0xe9, 0x50, 0x06, ], note_rseed: [ - 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, 0xb1, 0xfc, 0xe4, 0x67, 0x50, - 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, 0xc3, 0x82, 0x85, 0x7d, 0xee, - 0xcc, 0x40, 0xa9, 0x8d, + 0x05, 0x91, 0x39, 0x48, 0x12, 0x95, 0x1e, 0x1f, 0xe3, 0x89, 0x5b, 0x8c, 0xc3, 0xd1, + 0x4d, 0x2c, 0xf6, 0x55, 0x6d, 0xf6, 0xed, 0x4b, 0x4d, 0xdd, 0x3d, 0x9a, 0x69, 0xf5, + 0x33, 0x57, 0xd7, 0x76, ], note_cmx: [ - 0xa9, 0xb1, 0x1b, 0xaf, 0x30, 0x34, 0xb6, 0x5c, 0x64, 0x24, 0x84, 0x1b, 0xfe, 0x02, - 0x3f, 0x8e, 0xda, 0x13, 0x13, 0xc3, 0x0a, 0xa2, 0x7d, 0xe9, 0x2e, 0x21, 0xa1, 0x08, - 0x31, 0x6e, 0x82, 0x19, + 0xbb, 0x2d, 0xd3, 0x29, 0xdf, 0xca, 0x48, 0xdc, 0x11, 0x56, 0x36, 0x58, 0xd0, 0x7e, + 0x20, 0x4a, 0x1d, 0x21, 0x2d, 0x20, 0x27, 0xe1, 0x45, 0x7c, 0xe6, 0x96, 0x8c, 0xdf, + 0xb0, 0x07, 0x7e, 0x04, ], note_nf: [ - 0x72, 0xd6, 0x30, 0x89, 0x60, 0x35, 0x1f, 0x7b, 0x26, 0xfa, 0x64, 0x60, 0x3f, 0xe4, - 0xdf, 0xd8, 0x67, 0xbd, 0x5e, 0xb3, 0x67, 0xba, 0x2b, 0x7c, 0xa4, 0x91, 0xc9, 0x23, - 0xc0, 0xea, 0xd2, 0x22, + 0xd4, 0x0c, 0xe3, 0x47, 0xb2, 0x3e, 0x26, 0x36, 0xc2, 0xb4, 0xc5, 0x43, 0x39, 0x50, + 0x26, 0xab, 0xb4, 0xa1, 0x5f, 0x28, 0xf9, 0x0a, 0x67, 0xb7, 0x08, 0xd6, 0x4b, 0x22, + 0x6f, 0x3a, 0x39, 0x31, ], }, TestVector { sk: [ - 0x5f, 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0x2d, 0xd2, 0x1a, 0xfd, 0xbb, 0x5d, 0x47, - 0xfa, 0x9a, 0x6d, 0xd9, 0x84, 0xd5, 0x67, 0xdb, 0x28, 0x57, 0xb9, 0x27, 0xb7, 0xfa, - 0xe2, 0xdb, 0x58, 0x71, + 0x7f, 0x4f, 0x5c, 0xcb, 0xdb, 0xc5, 0x96, 0x63, 0x12, 0x77, 0xf8, 0xfe, 0xcd, 0x08, + 0xcb, 0x05, 0x6b, 0x95, 0xe3, 0x02, 0x5b, 0x97, 0x92, 0xff, 0xf7, 0xf2, 0x44, 0xfc, + 0x71, 0x62, 0x69, 0xb9, ], ask: [ - 0x11, 0x80, 0x73, 0x28, 0x51, 0x64, 0xe6, 0x55, 0x73, 0x58, 0xfb, 0xc4, 0x1a, 0x81, - 0x35, 0xcb, 0x06, 0x2f, 0x86, 0x76, 0xcb, 0x61, 0xf9, 0xaa, 0x52, 0xd1, 0x9a, 0x09, - 0xfa, 0xc5, 0x58, 0x02, + 0x0a, 0xfd, 0x61, 0xd4, 0x12, 0x57, 0xb5, 0xe9, 0x36, 0xb9, 0x29, 0x29, 0xa3, 0xe1, + 0xb8, 0x7d, 0x60, 0x89, 0x7c, 0xb3, 0xdc, 0x8e, 0x77, 0x3f, 0x4f, 0xa1, 0xef, 0x40, + 0xef, 0xb5, 0x4b, 0x04, ], ak: [ - 0x0d, 0x26, 0x2d, 0xe3, 0x60, 0x94, 0x33, 0xfe, 0x5b, 0x7c, 0x86, 0x2b, 0xc4, 0x8e, - 0xf5, 0x6d, 0x83, 0x20, 0x09, 0xf7, 0x24, 0x2e, 0x1f, 0x7c, 0x77, 0x0a, 0x12, 0x24, - 0x1d, 0xfa, 0x28, 0x07, + 0x84, 0x7e, 0xc5, 0xb1, 0xe3, 0xdd, 0xfd, 0x93, 0xca, 0x0c, 0x67, 0xea, 0x48, 0x1b, + 0x40, 0x5b, 0xae, 0xef, 0x48, 0xb0, 0xf2, 0x7f, 0x87, 0xb8, 0x1f, 0xed, 0x32, 0xae, + 0x56, 0x31, 0x6f, 0x04, ], isk: [ - 0x44, 0x36, 0x1a, 0x7b, 0xa6, 0xa1, 0xaa, 0x17, 0x8e, 0x72, 0xaf, 0x47, 0xbd, 0xc1, - 0x60, 0x40, 0xce, 0x1c, 0x54, 0xdd, 0x4b, 0x56, 0x33, 0x21, 0x55, 0xba, 0x9d, 0x04, - 0x09, 0x71, 0xd0, 0x07, + 0x26, 0xd6, 0x2e, 0x95, 0x96, 0xfa, 0x82, 0x5c, 0x6b, 0xf2, 0x1a, 0xff, 0x9e, 0x68, + 0x62, 0x5a, 0x19, 0x24, 0x40, 0xea, 0x06, 0x82, 0x81, 0x23, 0xd9, 0x78, 0x84, 0x80, + 0x6f, 0x15, 0xfa, 0x08, ], ik: [ - 0x1f, 0x17, 0x2d, 0x79, 0xae, 0xdc, 0xc2, 0x06, 0x8c, 0x3a, 0x09, 0x08, 0x93, 0xe1, - 0xa1, 0x75, 0xd9, 0xb5, 0x78, 0xf8, 0x91, 0xaf, 0x9a, 0xb6, 0x8d, 0x4f, 0xe1, 0xe9, - 0x05, 0xa3, 0xb2, 0x11, + 0x95, 0x9c, 0x44, 0x8d, 0xaf, 0xb6, 0xb7, 0xc2, 0x54, 0x90, 0x42, 0xdd, 0x75, 0x7a, + 0x81, 0xfa, 0x16, 0xca, 0xd4, 0xd2, 0x7f, 0xc1, 0x5f, 0x45, 0x33, 0xcd, 0xe2, 0x0c, + 0xc5, 0xb5, 0xcd, 0xc9, ], nk: [ - 0x51, 0xba, 0xf3, 0x33, 0xcf, 0xf1, 0xf2, 0xd0, 0xc7, 0xe3, 0xcf, 0xf4, 0xd3, 0x01, - 0x29, 0x9d, 0xc1, 0xef, 0xe9, 0x83, 0x00, 0x31, 0x4a, 0x54, 0x19, 0x38, 0x02, 0x9b, - 0x45, 0xcc, 0x15, 0x21, + 0xd7, 0xd8, 0xf3, 0xd5, 0x18, 0x22, 0xd3, 0x4a, 0xdf, 0x86, 0xeb, 0xd3, 0x53, 0x36, + 0x47, 0x73, 0x2c, 0x03, 0xf6, 0x42, 0xd6, 0xed, 0x06, 0xff, 0x61, 0xd2, 0x50, 0xd6, + 0xba, 0xfd, 0x59, 0x37, ], rivk: [ - 0x22, 0x8f, 0xeb, 0x79, 0x21, 0x98, 0x73, 0xc7, 0xa7, 0x60, 0x6e, 0x52, 0x97, 0x3c, - 0x85, 0xf4, 0x60, 0x46, 0x5a, 0x60, 0x59, 0x08, 0x39, 0x19, 0xed, 0x73, 0xeb, 0x80, - 0x5c, 0x11, 0x83, 0x01, + 0xae, 0xea, 0xd1, 0x3e, 0x25, 0x36, 0xe8, 0xcb, 0xa6, 0x24, 0x46, 0xd8, 0xff, 0x10, + 0x99, 0x88, 0xce, 0xa9, 0xb2, 0x57, 0xce, 0xaf, 0xc8, 0xd2, 0x0b, 0x85, 0x07, 0xcc, + 0xc9, 0x81, 0x58, 0x2a, ], ivk: [ - 0x76, 0xf4, 0x9c, 0xf8, 0xa3, 0x19, 0x21, 0x85, 0x61, 0x6a, 0x9a, 0x0d, 0xa0, 0xc7, - 0x6e, 0xc2, 0xc2, 0x75, 0x61, 0x59, 0xbc, 0xe1, 0x86, 0xa1, 0x86, 0x2b, 0x6e, 0x6e, - 0x59, 0x44, 0x2d, 0x11, + 0x83, 0xbb, 0x91, 0x72, 0x72, 0xb0, 0xa0, 0x4b, 0x78, 0x21, 0xfb, 0x8e, 0xef, 0xd5, + 0x7b, 0xdb, 0x15, 0xa0, 0x28, 0x28, 0x73, 0x95, 0x46, 0x28, 0x5e, 0x7f, 0x19, 0x78, + 0x17, 0x43, 0xaa, 0x10, ], ovk: [ - 0xeb, 0x72, 0xb6, 0xc3, 0x1e, 0x83, 0x7f, 0xd8, 0x37, 0xaa, 0xcb, 0x61, 0xfa, 0xba, - 0xce, 0x75, 0xa1, 0x9d, 0xd9, 0xdd, 0x5b, 0x4b, 0x3a, 0x3e, 0xe7, 0x23, 0xc1, 0x4d, - 0xa7, 0x7b, 0x4b, 0xe8, + 0x48, 0x25, 0xc8, 0x9b, 0xc8, 0xef, 0x4d, 0x75, 0x50, 0xa8, 0xdc, 0x1b, 0xda, 0x47, + 0xc4, 0xe4, 0x1a, 0x30, 0xca, 0x56, 0x72, 0x26, 0xd0, 0xb3, 0x78, 0xb0, 0xb9, 0xcc, + 0xb2, 0xfb, 0x36, 0xe5, ], dk: [ - 0xee, 0x19, 0xf8, 0xdd, 0xd9, 0xda, 0x06, 0x34, 0x24, 0x51, 0x43, 0xc4, 0xb4, 0x3a, - 0xfc, 0x7d, 0x78, 0xc5, 0x49, 0xc8, 0x20, 0x54, 0xa9, 0xd8, 0x40, 0x07, 0xb5, 0x62, - 0x17, 0xdb, 0xfd, 0xd6, + 0x17, 0x84, 0x93, 0x0e, 0xf3, 0xd2, 0x6a, 0xce, 0x1e, 0xad, 0xb7, 0x0b, 0x38, 0x81, + 0x0b, 0x98, 0xf1, 0x82, 0x33, 0x8d, 0x54, 0xff, 0xe8, 0x37, 0x78, 0xf2, 0x7b, 0xe2, + 0xd1, 0x20, 0x67, 0xc0, ], default_d: [ - 0xaa, 0xe3, 0x6e, 0x09, 0x4d, 0xe0, 0x7b, 0xc1, 0x6f, 0x89, 0x8e, + 0x46, 0x3b, 0x71, 0x6d, 0x24, 0xdd, 0x01, 0x02, 0x03, 0xa7, 0x29, ], default_pk_d: [ - 0xb6, 0x53, 0x3d, 0xcb, 0xff, 0xf0, 0xf6, 0xc1, 0xce, 0xef, 0xa8, 0x47, 0x99, 0xbd, - 0xa3, 0xde, 0x73, 0x34, 0x32, 0x6c, 0xcd, 0x65, 0xf7, 0xce, 0x92, 0xff, 0x3d, 0x9e, - 0x6e, 0x1f, 0x14, 0x0b, + 0x9e, 0x22, 0xd0, 0x82, 0xbf, 0xbe, 0x2f, 0x05, 0x20, 0x69, 0x13, 0xa8, 0x63, 0x15, + 0xf0, 0x80, 0xbb, 0x87, 0xe7, 0x87, 0xff, 0x51, 0x84, 0x53, 0xb0, 0x85, 0x0b, 0xc3, + 0x57, 0xd9, 0x18, 0x06, ], internal_rivk: [ - 0x25, 0x44, 0x06, 0x72, 0x3b, 0x06, 0x67, 0xaf, 0x27, 0xe5, 0x1c, 0xb3, 0xce, 0x8f, - 0xa1, 0x38, 0x81, 0x64, 0xd9, 0x43, 0x76, 0xc8, 0x50, 0xbd, 0xdb, 0x39, 0xe9, 0xbe, - 0xa5, 0xfa, 0x96, 0x05, + 0xdf, 0x5f, 0x4f, 0x62, 0x55, 0x28, 0xd5, 0x6b, 0x2e, 0x64, 0xaf, 0x93, 0xb4, 0x79, + 0xbf, 0x1c, 0x3b, 0x37, 0xab, 0x8a, 0xcb, 0x9b, 0x9d, 0x4a, 0x75, 0x75, 0xcc, 0x75, + 0x2a, 0x9c, 0x08, 0x1b, ], internal_ivk: [ - 0xba, 0xd4, 0x83, 0x7b, 0xa7, 0x88, 0x22, 0xb8, 0xb1, 0x65, 0xb0, 0xa1, 0x6e, 0x11, - 0x04, 0xc7, 0x05, 0xc3, 0xc0, 0xe3, 0x82, 0xd3, 0xf1, 0x3c, 0x19, 0x5c, 0x0e, 0xf3, - 0x11, 0xbb, 0x80, 0x04, + 0xe3, 0x3c, 0xea, 0x19, 0xf7, 0x6a, 0x3b, 0xdc, 0x49, 0xc3, 0x2e, 0x32, 0x2f, 0xeb, + 0x87, 0x0e, 0xd2, 0xae, 0x18, 0x57, 0xca, 0x47, 0x03, 0x4a, 0x01, 0x60, 0x40, 0x0e, + 0x9c, 0xeb, 0x4c, 0x2b, ], internal_ovk: [ - 0xb9, 0x11, 0x3a, 0x95, 0x2d, 0xcc, 0x1e, 0x15, 0xc3, 0x4d, 0x13, 0x66, 0x03, 0xa2, - 0xef, 0x25, 0x4a, 0x38, 0x75, 0x5a, 0x55, 0x7f, 0xa9, 0xf8, 0x8c, 0x14, 0x3b, 0xd3, - 0x07, 0x64, 0x41, 0xb0, + 0xc9, 0x3d, 0x92, 0x4f, 0x45, 0x96, 0x08, 0xef, 0x68, 0xa6, 0x36, 0xe2, 0xe2, 0xfe, + 0xd5, 0xeb, 0x9b, 0xe3, 0x8c, 0xeb, 0xae, 0x57, 0x1d, 0x0e, 0xeb, 0xf3, 0xe8, 0xa5, + 0x37, 0x4f, 0x99, 0x71, ], internal_dk: [ - 0x02, 0xb5, 0x2c, 0x6e, 0xd9, 0xad, 0x49, 0xfb, 0x38, 0xe4, 0x44, 0x7c, 0x69, 0xb5, - 0x70, 0xeb, 0xd0, 0x55, 0xe4, 0xc7, 0xfd, 0x91, 0xc0, 0x20, 0xff, 0x43, 0x46, 0x1d, - 0x14, 0xe0, 0x2f, 0x29, + 0xec, 0xe1, 0xd3, 0x58, 0x8f, 0xc5, 0x0a, 0xa1, 0xf1, 0x06, 0x5d, 0x93, 0xf5, 0xd8, + 0xcf, 0xca, 0xf1, 0x35, 0x3a, 0xe1, 0xab, 0x39, 0x58, 0x9a, 0xb9, 0x28, 0xdf, 0xda, + 0xfe, 0x36, 0x84, 0x43, ], asset: [ 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 4079549063511228677, + note_v: 18438745196586160858, note_rho: [ - 0x26, 0x70, 0xdc, 0x82, 0xd3, 0x90, 0x26, 0xc6, 0xcb, 0x4c, 0xd4, 0xb0, 0xf7, 0xf5, - 0xaa, 0x2a, 0x4f, 0x5a, 0x53, 0x41, 0xec, 0x5d, 0xd7, 0x15, 0x40, 0x6f, 0x2f, 0xdd, - 0x2a, 0xfa, 0x73, 0x3f, + 0x1a, 0xbd, 0x5c, 0xe4, 0xfd, 0xdf, 0xcc, 0xfc, 0x3a, 0x61, 0x28, 0xae, 0xf7, 0x84, + 0xa6, 0x46, 0x10, 0xa8, 0x9d, 0x1a, 0x70, 0x99, 0x21, 0x6d, 0x08, 0x14, 0xd3, 0xa2, + 0xd4, 0x52, 0x43, 0x1c, ], note_rseed: [ - 0x5f, 0x64, 0x1c, 0x8c, 0x21, 0x86, 0x2a, 0x1b, 0xaf, 0xce, 0x26, 0x09, 0xd9, 0xee, - 0xcf, 0xa1, 0x58, 0xcf, 0xb5, 0xcd, 0x79, 0xf8, 0x80, 0x08, 0xe3, 0x15, 0xdc, 0x7d, - 0x83, 0x88, 0xe7, 0x6c, + 0x32, 0xd4, 0x11, 0xac, 0x1c, 0xce, 0x82, 0xad, 0x02, 0x29, 0x40, 0x7b, 0xbc, 0x48, + 0x98, 0x56, 0x75, 0xe3, 0xf8, 0x74, 0xa4, 0x53, 0x3f, 0x1d, 0x63, 0xa8, 0x4d, 0xfa, + 0x3e, 0x0f, 0x46, 0x0f, ], note_cmx: [ - 0x0f, 0xfb, 0xca, 0x1d, 0x59, 0x21, 0xfa, 0x0a, 0x8c, 0x51, 0x16, 0xae, 0x13, 0x7e, - 0x37, 0xf2, 0xc1, 0x18, 0xd5, 0x21, 0x25, 0x62, 0x8d, 0x8a, 0x3f, 0x41, 0x2c, 0xe0, - 0xe6, 0x53, 0x0e, 0x04, + 0xd6, 0x3a, 0x49, 0x61, 0x70, 0x68, 0x72, 0xdd, 0xf4, 0x0b, 0x6d, 0xd2, 0xa9, 0xc9, + 0xc1, 0xdb, 0xec, 0xb9, 0x7e, 0x72, 0xf0, 0x3f, 0x2f, 0x5a, 0xdd, 0x8b, 0x63, 0x53, + 0xe3, 0x9e, 0x59, 0x10, ], note_nf: [ - 0xe6, 0x2b, 0x8e, 0xd8, 0x35, 0x40, 0x14, 0x6c, 0xd2, 0x3c, 0xac, 0x74, 0xee, 0xd7, - 0xd7, 0x73, 0xd8, 0x02, 0x24, 0xa5, 0xaa, 0x30, 0xd6, 0x8e, 0x35, 0x57, 0x2e, 0xe8, - 0x83, 0xd1, 0xb7, 0x04, + 0x7e, 0xbe, 0xaa, 0x1a, 0x59, 0xed, 0x46, 0x01, 0x45, 0x8b, 0xa4, 0x6d, 0xcc, 0x96, + 0x2e, 0xd8, 0x1c, 0x15, 0xc7, 0x7f, 0x7e, 0x44, 0x52, 0x48, 0xe4, 0xfb, 0x52, 0x1e, + 0x59, 0xaa, 0x23, 0x1c, ], }, TestVector { sk: [ - 0x17, 0x82, 0xfd, 0x27, 0x95, 0xd1, 0x8a, 0x76, 0x36, 0x24, 0xc2, 0x5f, 0xa9, 0x59, - 0xcc, 0x97, 0x48, 0x9c, 0xe7, 0x57, 0x45, 0x82, 0x4b, 0x77, 0x86, 0x8c, 0x53, 0x23, - 0x9c, 0xfb, 0xdf, 0x73, + 0xe2, 0xf5, 0x7e, 0x34, 0xfb, 0xc7, 0x54, 0x23, 0xc3, 0x73, 0x7f, 0x5b, 0x2a, 0x06, + 0x15, 0xf5, 0x72, 0x2d, 0xb0, 0x41, 0xa3, 0xef, 0x66, 0xfa, 0x48, 0x3a, 0xfd, 0x3c, + 0x2e, 0x19, 0xe5, 0x94, ], ask: [ - 0xf6, 0xef, 0x32, 0x8d, 0x24, 0x76, 0x1d, 0x6d, 0x3c, 0xcd, 0x25, 0xd4, 0x71, 0x96, - 0xe8, 0x10, 0x9c, 0x03, 0x8f, 0xe1, 0x7c, 0x59, 0xa7, 0xf0, 0x5b, 0x98, 0xd6, 0x6b, - 0xeb, 0xc6, 0x41, 0x24, + 0x12, 0x4b, 0x26, 0x4c, 0x66, 0x07, 0xd3, 0x43, 0x5b, 0x4b, 0xbb, 0x10, 0x39, 0x31, + 0x4b, 0x39, 0x60, 0x4f, 0x06, 0x54, 0x10, 0x0e, 0xa9, 0x0a, 0x3f, 0x9b, 0xfa, 0xe5, + 0x4a, 0x45, 0xa8, 0x36, ], ak: [ - 0xd1, 0x17, 0x87, 0xca, 0x58, 0x2f, 0x94, 0x8e, 0x45, 0x07, 0x18, 0xb3, 0x69, 0x98, - 0xdf, 0x28, 0xbb, 0x0f, 0x10, 0x21, 0xea, 0x84, 0x3f, 0x86, 0x7f, 0x8a, 0x17, 0x0f, - 0x5c, 0x33, 0x90, 0x1f, + 0xbe, 0xbc, 0xa2, 0xb4, 0x46, 0x40, 0x91, 0x6a, 0xbf, 0x7e, 0xab, 0xb3, 0x44, 0x48, + 0xef, 0x19, 0xec, 0x7c, 0x02, 0x32, 0x8b, 0x12, 0x5e, 0xb5, 0xa1, 0x04, 0xcc, 0xf3, + 0x08, 0xfb, 0xd0, 0x3c, ], isk: [ - 0xdc, 0x93, 0x72, 0x9f, 0x3f, 0x28, 0x30, 0xed, 0x79, 0x1c, 0x21, 0xbe, 0xbe, 0x45, - 0x0f, 0xcf, 0x1f, 0x8f, 0xef, 0x49, 0x81, 0x39, 0xc7, 0x99, 0xd1, 0x63, 0x66, 0x5a, - 0x8c, 0x51, 0xe5, 0x2d, + 0x44, 0xa6, 0x4a, 0xdd, 0x6d, 0xf1, 0xd9, 0x63, 0xf5, 0xdd, 0x5b, 0x50, 0x10, 0xd3, + 0xd0, 0x25, 0xf0, 0x28, 0x7c, 0x4c, 0xf1, 0x9c, 0x75, 0xf3, 0x3d, 0x51, 0xdd, 0xdd, + 0xba, 0x5d, 0x65, 0x7b, ], ik: [ - 0x1d, 0xb6, 0x1c, 0x29, 0x3e, 0x3a, 0x93, 0x34, 0x5d, 0x06, 0xb9, 0x0b, 0xd7, 0x1f, - 0xd3, 0x21, 0x5c, 0x2c, 0x1c, 0x29, 0x53, 0x5a, 0x10, 0xde, 0x9d, 0x31, 0x40, 0xb7, - 0x4d, 0xb6, 0x1d, 0x07, + 0x0b, 0x93, 0xf6, 0x34, 0x6e, 0x57, 0x23, 0x27, 0x1b, 0x60, 0x7b, 0xc8, 0x08, 0x68, + 0x08, 0xf1, 0xbb, 0x03, 0x5d, 0x0d, 0xe5, 0x52, 0x4d, 0x06, 0x48, 0x08, 0x31, 0xe7, + 0x16, 0x31, 0x52, 0xd7, ], nk: [ - 0x9e, 0x99, 0x7d, 0x9d, 0x26, 0x97, 0x87, 0x26, 0x8e, 0x09, 0x2a, 0x7c, 0x85, 0x41, - 0x7d, 0xa5, 0x30, 0xea, 0x42, 0xfa, 0xc6, 0x68, 0xa7, 0x49, 0xaf, 0x55, 0xdf, 0xb7, - 0x1c, 0xdb, 0xbe, 0x09, + 0x49, 0xaf, 0xb9, 0xd3, 0x17, 0x63, 0x82, 0x90, 0x2b, 0x98, 0x5d, 0x7b, 0x04, 0xb3, + 0x77, 0x7b, 0x3e, 0x93, 0xf9, 0x25, 0xc0, 0xcf, 0x09, 0x40, 0x22, 0x91, 0xd6, 0x90, + 0x9d, 0x8b, 0x64, 0x0b, ], rivk: [ - 0x13, 0x6c, 0x6f, 0xe2, 0xe2, 0xb7, 0x9c, 0x51, 0x56, 0xdb, 0x50, 0x47, 0xd8, 0xd5, - 0xe7, 0x95, 0xdf, 0xc0, 0xbd, 0xc0, 0x88, 0x08, 0x53, 0xa4, 0x4a, 0xdb, 0x73, 0x92, - 0xc0, 0x2f, 0x94, 0x1b, + 0x29, 0x1c, 0xe2, 0x3e, 0x99, 0x33, 0x8b, 0x88, 0x3c, 0x3e, 0xcc, 0x93, 0xed, 0x61, + 0x59, 0x74, 0x83, 0xea, 0x1f, 0xbc, 0x78, 0x3f, 0xa4, 0x5b, 0xa7, 0xba, 0xf8, 0xfb, + 0x14, 0x78, 0xfe, 0x1a, ], ivk: [ - 0x02, 0x8b, 0x64, 0x05, 0x64, 0xb2, 0x49, 0x05, 0xde, 0x92, 0x92, 0xba, 0x5b, 0x98, - 0x10, 0xad, 0xdd, 0x86, 0xbe, 0xd0, 0xfb, 0x3b, 0x2d, 0x6b, 0x37, 0xf2, 0x6d, 0xd2, - 0x38, 0xa7, 0xdb, 0x13, + 0x61, 0x58, 0x87, 0xc8, 0x04, 0xac, 0x73, 0x06, 0x24, 0x51, 0x93, 0x54, 0x3f, 0x8a, + 0x8b, 0x20, 0xde, 0x76, 0x67, 0xba, 0xdd, 0xd3, 0x52, 0x64, 0x78, 0x07, 0x63, 0x37, + 0x49, 0x20, 0xd1, 0x1f, ], ovk: [ - 0x98, 0xd6, 0xa4, 0xbf, 0x68, 0x01, 0xd8, 0xba, 0x0d, 0x0b, 0x67, 0xea, 0x7b, 0x80, - 0x52, 0x07, 0xab, 0xc0, 0x34, 0x8f, 0xc5, 0x62, 0x00, 0x5a, 0x59, 0xa2, 0x7a, 0x8a, - 0x46, 0xfa, 0x6a, 0xdd, + 0x69, 0x96, 0x86, 0xa4, 0x13, 0xbc, 0x95, 0x43, 0xe8, 0xb3, 0x90, 0xc1, 0x51, 0x4a, + 0x41, 0xff, 0xa2, 0x80, 0xf1, 0xea, 0x8a, 0x52, 0xc6, 0x1a, 0x56, 0xea, 0x94, 0x98, + 0x6d, 0xd8, 0x66, 0x2c, ], dk: [ - 0xd0, 0xba, 0xef, 0x60, 0x12, 0xd3, 0x08, 0xef, 0xbb, 0x76, 0x9a, 0x99, 0xcc, 0xa2, - 0x92, 0x8c, 0xed, 0xe8, 0xdb, 0x27, 0x76, 0x45, 0xa7, 0x77, 0xea, 0xf1, 0x72, 0x2c, - 0xd0, 0x84, 0x50, 0xb3, + 0x2b, 0xc7, 0xd4, 0x9f, 0xed, 0x53, 0xc1, 0x59, 0x21, 0x9d, 0x29, 0xb3, 0xe5, 0x51, + 0x08, 0xd6, 0x5d, 0x2a, 0x82, 0x3f, 0xce, 0x17, 0x51, 0x08, 0xdb, 0xc9, 0xc5, 0xb5, + 0x00, 0x4a, 0x7f, 0xd4, ], default_d: [ - 0xcc, 0x7c, 0xe7, 0x34, 0xb0, 0x75, 0xa0, 0x1b, 0x92, 0xaa, 0xca, + 0x80, 0x1a, 0x91, 0xc1, 0x78, 0x47, 0x23, 0x30, 0x82, 0x67, 0x9a, ], default_pk_d: [ - 0x3d, 0xa5, 0x27, 0x3a, 0x56, 0x67, 0xc7, 0x66, 0xb8, 0x23, 0x12, 0x06, 0x18, 0x0f, - 0x15, 0x8a, 0xc0, 0x2a, 0xf3, 0xf0, 0x6e, 0xcc, 0xa6, 0xec, 0x7c, 0x38, 0xc7, 0x5d, - 0x33, 0x60, 0x03, 0x20, + 0x8e, 0xa1, 0xac, 0x5f, 0x65, 0xc1, 0x79, 0x9b, 0x6c, 0x7a, 0x68, 0x4f, 0xf3, 0x5e, + 0x63, 0xbd, 0xdf, 0x75, 0xff, 0xf6, 0x9f, 0xc2, 0xd2, 0x83, 0x59, 0xf2, 0xd4, 0x96, + 0xff, 0x9e, 0xb7, 0x20, ], internal_rivk: [ - 0x88, 0xd7, 0xb1, 0x96, 0x99, 0xf3, 0x94, 0xa5, 0x50, 0xbc, 0x9c, 0xdc, 0x6b, 0xf3, - 0xfc, 0x71, 0xf6, 0x10, 0xc3, 0x06, 0x56, 0x37, 0x61, 0x53, 0xa6, 0x96, 0x1f, 0xcd, - 0x5b, 0x97, 0xfa, 0x19, + 0x29, 0x8e, 0xf3, 0x46, 0x9e, 0x43, 0x01, 0x93, 0x44, 0xfa, 0x27, 0x4b, 0x67, 0xcc, + 0xd3, 0xef, 0xda, 0x04, 0x02, 0x18, 0x07, 0x17, 0xea, 0x6c, 0x7e, 0x6f, 0x11, 0xdf, + 0x1c, 0x8e, 0xbe, 0x20, ], internal_ivk: [ - 0x0a, 0x2d, 0xc9, 0x66, 0x61, 0xb9, 0x27, 0x25, 0x0d, 0x7e, 0x3c, 0xd2, 0xc7, 0xe0, - 0x6d, 0x51, 0x74, 0xc6, 0x2c, 0xb1, 0x2e, 0x07, 0x16, 0x7f, 0x19, 0x4f, 0x4c, 0xe6, - 0x4e, 0x68, 0x95, 0x02, + 0xa2, 0xea, 0xb2, 0x74, 0xa9, 0x69, 0xc4, 0x46, 0x8f, 0x66, 0x83, 0x9c, 0x72, 0xaa, + 0x6e, 0x65, 0xe6, 0x59, 0xb1, 0x2c, 0xd2, 0x17, 0xba, 0x91, 0x04, 0x21, 0xb8, 0x89, + 0x9f, 0xab, 0x59, 0x32, ], internal_ovk: [ - 0xcc, 0x79, 0x65, 0xf3, 0x3a, 0xc0, 0x1c, 0x60, 0x68, 0x51, 0xb1, 0x29, 0xbd, 0xc9, - 0xb6, 0xab, 0xd5, 0xca, 0x5b, 0x9d, 0x24, 0x1d, 0xbd, 0x5c, 0x18, 0xb2, 0x46, 0x9b, - 0x7c, 0x8c, 0xc8, 0x9f, + 0x81, 0xc1, 0xe2, 0xde, 0x44, 0xcb, 0xd6, 0xd5, 0xdd, 0x87, 0x6c, 0x87, 0xb5, 0xf8, + 0x28, 0x0b, 0xec, 0xa7, 0xfa, 0x77, 0x97, 0x76, 0x54, 0x73, 0xf5, 0x92, 0xd5, 0xfa, + 0xe3, 0xf7, 0xda, 0x9f, ], internal_dk: [ - 0xda, 0xa2, 0x42, 0xd2, 0x0d, 0xfd, 0xce, 0x8f, 0xc1, 0x0f, 0x4d, 0x99, 0x39, 0x7d, - 0xa2, 0x2c, 0x49, 0x1d, 0xc0, 0x9e, 0x1b, 0x12, 0x0f, 0x66, 0x93, 0xd6, 0x86, 0xec, - 0xd4, 0x03, 0x0a, 0x00, + 0x2b, 0x04, 0xdc, 0x9d, 0xed, 0xc2, 0xd0, 0x5e, 0x16, 0x37, 0x1b, 0xcb, 0x8a, 0x17, + 0x85, 0x44, 0x98, 0x53, 0xf0, 0xed, 0xaf, 0xeb, 0x09, 0xfd, 0xd4, 0x48, 0x3f, 0x42, + 0xec, 0x7a, 0xc1, 0xb6, ], asset: [ - 0xaa, 0xce, 0xb5, 0x62, 0x18, 0xc6, 0xbd, 0x30, 0xf8, 0x37, 0x4a, 0xc1, 0x33, 0x86, - 0x79, 0x3f, 0x21, 0xa9, 0xfb, 0x80, 0xad, 0x03, 0xbc, 0x0c, 0xda, 0x4a, 0x44, 0x94, - 0x6c, 0x00, 0xe1, 0xb1, + 0xcc, 0x73, 0x29, 0xf3, 0xe9, 0xb4, 0xe5, 0x4c, 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, + 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, + 0x86, 0xa2, 0x65, 0x8e, ], - note_v: 5706402952489856202, + note_v: 1456989545392107075, note_rho: [ - 0xa1, 0xdf, 0x0e, 0x5b, 0x87, 0xb5, 0xbe, 0xce, 0x47, 0x7a, 0x70, 0x96, 0x49, 0xe9, - 0x50, 0x06, 0x05, 0x91, 0x39, 0x48, 0x12, 0x95, 0x1e, 0x1f, 0xe3, 0x89, 0x5b, 0x8c, - 0xc3, 0xd1, 0x4d, 0x2c, + 0x90, 0x70, 0x46, 0x07, 0xf3, 0x87, 0xa0, 0x3e, 0x49, 0xbf, 0x98, 0x36, 0x57, 0x44, + 0x31, 0x34, 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, + 0x62, 0xcb, 0x78, 0x0a, ], note_rseed: [ - 0xf6, 0x55, 0x6d, 0xf6, 0xed, 0x4b, 0x4d, 0xdd, 0x3d, 0x9a, 0x69, 0xf5, 0x33, 0x57, - 0xd7, 0x76, 0x7f, 0x4f, 0x5c, 0xcb, 0xdb, 0xc5, 0x96, 0x63, 0x12, 0x77, 0xf8, 0xfe, - 0xcd, 0x08, 0xcb, 0x05, + 0xb6, 0x88, 0x3a, 0x50, 0xa0, 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, + 0x82, 0x84, 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, + 0x0d, 0xc0, 0xb7, 0x16, ], note_cmx: [ - 0xf1, 0x34, 0x33, 0x5c, 0x60, 0xf3, 0x17, 0xec, 0x48, 0xd6, 0x7b, 0x49, 0x34, 0x58, - 0xde, 0x26, 0xb4, 0x06, 0xfd, 0xd2, 0x10, 0xf8, 0x60, 0xb1, 0x81, 0xaf, 0x7b, 0x82, - 0xcd, 0xe9, 0x4e, 0x37, + 0x26, 0xc0, 0xb4, 0x92, 0xe5, 0x6c, 0xf6, 0xc5, 0xdd, 0x67, 0x9c, 0x84, 0x66, 0x7b, + 0x74, 0x41, 0x83, 0x63, 0xc7, 0xd9, 0x15, 0xed, 0x6b, 0x72, 0x50, 0xde, 0xa9, 0xd9, + 0xe7, 0xeb, 0x51, 0x39, ], note_nf: [ - 0x75, 0x6c, 0x1f, 0x4b, 0xfa, 0xae, 0xc5, 0x5b, 0x42, 0x0a, 0x4f, 0x88, 0x12, 0xdb, - 0x6c, 0x43, 0x2e, 0x48, 0x61, 0x6f, 0xb8, 0xd1, 0xbb, 0x2b, 0x1d, 0xd1, 0xe7, 0x2c, - 0x0a, 0xa3, 0xdb, 0x3a, + 0x7e, 0xec, 0xa6, 0x5c, 0xbd, 0xc5, 0x01, 0x18, 0x2f, 0x6e, 0x1b, 0x11, 0xa2, 0x3b, + 0x0f, 0xaa, 0x80, 0xfc, 0x26, 0xca, 0x16, 0xbc, 0x4c, 0xd0, 0x97, 0x33, 0xab, 0x0e, + 0x1d, 0x10, 0x8d, 0x16, ], }, TestVector { sk: [ - 0x6b, 0x95, 0xe3, 0x02, 0x5b, 0x97, 0x92, 0xff, 0xf7, 0xf2, 0x44, 0xfc, 0x71, 0x62, - 0x69, 0xb9, 0x26, 0xd6, 0x2e, 0x95, 0x96, 0xfa, 0x82, 0x5c, 0x6b, 0xf2, 0x1a, 0xff, - 0x9e, 0x68, 0x62, 0x5a, + 0xc4, 0x8f, 0xbd, 0x46, 0x7f, 0x75, 0xb7, 0x80, 0x14, 0x9a, 0xe8, 0x80, 0x8f, 0x4e, + 0x68, 0xf5, 0x0c, 0x05, 0x36, 0xac, 0xdd, 0xf6, 0xf1, 0xae, 0xab, 0x01, 0x6b, 0x6b, + 0xc1, 0xec, 0x14, 0x4b, ], ask: [ - 0x75, 0x7d, 0x15, 0x8d, 0x07, 0x35, 0x6b, 0x3b, 0xc2, 0xc9, 0xe5, 0x1c, 0x55, 0x8a, - 0x9b, 0x31, 0x6b, 0xdd, 0xbc, 0x36, 0x0b, 0x8b, 0xeb, 0x6e, 0x2a, 0xe3, 0xb0, 0x61, - 0x8f, 0x06, 0x2d, 0x2e, + 0xb1, 0xc5, 0x78, 0x06, 0x79, 0xa6, 0x48, 0x9f, 0x79, 0x78, 0xd0, 0x2d, 0x12, 0xb9, + 0xcf, 0x78, 0xe9, 0x18, 0x25, 0x6d, 0xfa, 0xae, 0xbe, 0xe5, 0xd8, 0x9d, 0x71, 0xe5, + 0xc1, 0xdc, 0x0e, 0x3b, ], ak: [ - 0x44, 0x9a, 0x90, 0xd2, 0xe8, 0xd1, 0xa0, 0x37, 0x64, 0x2a, 0x97, 0x09, 0x6c, 0x91, - 0x65, 0x43, 0x46, 0x2a, 0x13, 0x7f, 0xfe, 0xa3, 0x7b, 0xaf, 0x41, 0xef, 0x28, 0x6b, - 0xb7, 0x32, 0xbe, 0x2c, + 0x95, 0x99, 0x81, 0xe9, 0x29, 0xa7, 0x15, 0xa3, 0x4e, 0x5b, 0x05, 0xc0, 0xc1, 0x23, + 0x1e, 0x52, 0x25, 0x96, 0xb9, 0x44, 0xd5, 0x24, 0xf6, 0x2c, 0x2a, 0x4b, 0xd6, 0x95, + 0x3e, 0x5a, 0x84, 0x13, ], isk: [ - 0xf2, 0x34, 0x52, 0x32, 0xc9, 0x19, 0xc1, 0x29, 0xe0, 0x4b, 0x0c, 0x46, 0xac, 0x2c, - 0xa8, 0x50, 0x65, 0xd9, 0x54, 0x85, 0xb9, 0x02, 0xab, 0x0f, 0x98, 0xf9, 0x3a, 0xee, - 0x59, 0x4b, 0x5f, 0x02, + 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, 0x77, + 0xe3, 0x1b, 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x95, 0x8f, 0xe3, 0x78, 0x9d, + 0x41, 0xc2, 0xb1, 0xff, ], ik: [ - 0x2c, 0x83, 0xd9, 0x20, 0xe9, 0xf6, 0x6d, 0xa5, 0x04, 0x86, 0x37, 0xad, 0x9a, 0xa2, - 0xcc, 0xe6, 0xe1, 0x6e, 0xf4, 0x8f, 0x86, 0x50, 0xea, 0x00, 0xd8, 0xc2, 0xd7, 0x68, - 0x61, 0x8a, 0xe3, 0x36, + 0xbf, 0xfe, 0xa0, 0x0a, 0xf9, 0x2b, 0x81, 0xbc, 0x57, 0x2b, 0xea, 0x4a, 0x26, 0x73, + 0x5a, 0x34, 0x9f, 0x4d, 0x76, 0xd1, 0x69, 0x68, 0xe5, 0x6c, 0x56, 0x5f, 0xd9, 0x2b, + 0xeb, 0x46, 0x08, 0x48, ], nk: [ - 0xfd, 0x31, 0x64, 0xc6, 0x32, 0xbe, 0xc9, 0x4c, 0xe9, 0xfb, 0x2f, 0x30, 0x22, 0x63, - 0xb8, 0x84, 0xab, 0xb9, 0xc1, 0x0e, 0x55, 0xe4, 0x48, 0x64, 0x7f, 0x67, 0x98, 0x49, - 0x5c, 0x9d, 0x08, 0x3f, + 0x7c, 0xf5, 0xe1, 0x97, 0xb7, 0x7a, 0x3c, 0xe4, 0xb6, 0x69, 0x61, 0x5b, 0x78, 0xd3, + 0x19, 0x65, 0x9a, 0x90, 0x46, 0x3e, 0x45, 0x93, 0x32, 0x47, 0x44, 0xb9, 0xb4, 0x19, + 0x35, 0xa9, 0xfd, 0x3a, ], rivk: [ - 0xc0, 0xb3, 0x6b, 0x56, 0x07, 0x0f, 0xff, 0x2f, 0xdf, 0x38, 0xeb, 0xa1, 0x1a, 0x74, - 0x24, 0x95, 0x71, 0x95, 0x01, 0x4c, 0xba, 0x43, 0xa5, 0x6b, 0xd1, 0xb1, 0x65, 0x8e, - 0x66, 0xa3, 0x9d, 0x00, + 0x61, 0xf7, 0x39, 0x8a, 0x70, 0x07, 0x07, 0x95, 0x94, 0xad, 0xa8, 0xc8, 0x37, 0x0d, + 0xd8, 0xa9, 0xe4, 0x90, 0x66, 0xee, 0xf2, 0xd6, 0x05, 0x9b, 0x02, 0xa1, 0x67, 0x68, + 0x26, 0xaa, 0x4a, 0x2d, ], ivk: [ - 0x97, 0x6a, 0x87, 0x88, 0x19, 0x1b, 0x87, 0xe4, 0xc1, 0x3f, 0x2c, 0x6d, 0x23, 0xb4, - 0xf3, 0x59, 0x5e, 0x02, 0x28, 0xe2, 0x45, 0xe9, 0x6e, 0xef, 0x1d, 0x24, 0xb2, 0x93, - 0x29, 0x6a, 0x19, 0x1c, + 0xcc, 0xb2, 0x24, 0x66, 0xf1, 0xa3, 0xda, 0x33, 0xc2, 0xfd, 0xab, 0x63, 0x19, 0xde, + 0x82, 0x71, 0xff, 0xd9, 0xc7, 0xc7, 0xba, 0xfa, 0x24, 0x06, 0x8e, 0x72, 0x32, 0x1c, + 0x87, 0x67, 0x76, 0x2b, ], ovk: [ - 0x1e, 0xd0, 0xed, 0xa5, 0xa4, 0x08, 0x61, 0x31, 0x26, 0x1a, 0x2e, 0xd4, 0x42, 0x92, - 0x61, 0xe4, 0x27, 0x6a, 0x26, 0xd4, 0x28, 0x59, 0xfa, 0xbd, 0xa3, 0x1a, 0xa9, 0x67, - 0x09, 0x87, 0x43, 0x71, + 0x12, 0xac, 0xb4, 0xf9, 0xf0, 0xb2, 0xcc, 0x5d, 0xfa, 0x03, 0x15, 0x46, 0x73, 0xd7, + 0xf3, 0x0c, 0x7f, 0x1c, 0xb1, 0x84, 0xa7, 0xce, 0x4e, 0xd8, 0x4b, 0x9d, 0x0b, 0x3d, + 0x8e, 0x68, 0x63, 0xd3, ], dk: [ - 0x5e, 0x5b, 0x60, 0xc0, 0x5b, 0x53, 0xd0, 0xbc, 0xd2, 0xda, 0x46, 0xa1, 0x31, 0x29, - 0x12, 0x51, 0x5c, 0xc7, 0xcf, 0x2d, 0x97, 0x4c, 0x11, 0x7c, 0x8d, 0xde, 0xa9, 0xfa, - 0xb6, 0x20, 0xc6, 0x68, + 0x51, 0xba, 0x5e, 0x4e, 0x4b, 0x8f, 0xbe, 0xf0, 0xd0, 0x1e, 0xf3, 0x8c, 0x77, 0xb4, + 0xba, 0x7f, 0xfa, 0x26, 0x72, 0xfa, 0x7a, 0xde, 0x50, 0x4f, 0xdb, 0x85, 0x91, 0x05, + 0x46, 0x7d, 0x0a, 0x91, ], default_d: [ - 0x99, 0xaf, 0x6b, 0xf3, 0xf4, 0x75, 0xbd, 0xe8, 0x89, 0xaa, 0xca, + 0x7f, 0xd2, 0x1b, 0xf0, 0xf5, 0xf3, 0x2f, 0x7d, 0xf2, 0xec, 0x7f, ], default_pk_d: [ - 0xac, 0xdc, 0xd3, 0x48, 0xca, 0x45, 0xee, 0x58, 0x32, 0x78, 0x30, 0x38, 0x46, 0xca, - 0x07, 0x84, 0x59, 0xd5, 0xbe, 0x5c, 0x5d, 0xcf, 0x34, 0x7e, 0x3b, 0x9a, 0x34, 0xcb, - 0xa1, 0x24, 0xb4, 0xa3, + 0x54, 0x92, 0x6e, 0xd8, 0xd4, 0xbc, 0x4c, 0xcd, 0xed, 0xc9, 0x91, 0xaa, 0x62, 0x19, + 0xc3, 0xf6, 0xb4, 0x58, 0xd6, 0x78, 0xc6, 0xd6, 0xc3, 0xc9, 0x0d, 0x57, 0xfc, 0x08, + 0x71, 0xc3, 0x50, 0xbe, ], internal_rivk: [ - 0x94, 0x1a, 0x17, 0xe1, 0x20, 0x2a, 0x62, 0x71, 0xa4, 0x4a, 0x01, 0x66, 0x65, 0x53, - 0xb5, 0x81, 0xbf, 0x25, 0xef, 0x99, 0xe8, 0xe9, 0x5f, 0x13, 0x2a, 0xce, 0x38, 0x1d, - 0x96, 0x01, 0x84, 0x32, + 0xd6, 0x2f, 0x96, 0x87, 0x62, 0x35, 0x26, 0x2b, 0x7e, 0x75, 0x5a, 0x3f, 0x1d, 0x4e, + 0x79, 0x99, 0x7e, 0xec, 0x6d, 0x46, 0x60, 0x39, 0x8f, 0xe0, 0x7e, 0x29, 0x0a, 0x31, + 0xac, 0xf0, 0xdb, 0x2c, ], internal_ivk: [ - 0xa2, 0x76, 0x29, 0xac, 0x1c, 0x62, 0xc9, 0xf4, 0xda, 0xd5, 0x7c, 0x95, 0x30, 0xab, - 0x2a, 0x59, 0x80, 0x0d, 0x2e, 0xf4, 0x55, 0xcd, 0x17, 0x44, 0x6f, 0x3f, 0xc6, 0x08, - 0x1a, 0x58, 0x1e, 0x3b, + 0x6e, 0x03, 0xa4, 0xfd, 0xba, 0x1e, 0xc7, 0xcd, 0xcf, 0x05, 0x09, 0x97, 0x60, 0xbb, + 0xb9, 0xa7, 0x0f, 0x42, 0x4d, 0xcb, 0x20, 0x88, 0x01, 0xd1, 0xe2, 0x7f, 0x12, 0xbd, + 0x4f, 0x14, 0x91, 0x1f, ], internal_ovk: [ - 0xe9, 0x89, 0x8e, 0xd6, 0xb6, 0x69, 0xc8, 0xd9, 0xd5, 0x90, 0xb7, 0x59, 0xd0, 0x29, - 0x5f, 0xcf, 0xaf, 0x95, 0xe2, 0xda, 0xf7, 0xda, 0x99, 0x1c, 0x27, 0x57, 0xdc, 0xef, - 0xe1, 0x62, 0x6e, 0x0e, + 0xba, 0xe4, 0x5d, 0xdd, 0xa9, 0xfe, 0x68, 0x60, 0xe7, 0xc8, 0x70, 0x09, 0x38, 0xb1, + 0x32, 0x4e, 0x6f, 0xe0, 0xe9, 0x88, 0x6e, 0xd8, 0xb0, 0xe2, 0xf9, 0xeb, 0x46, 0xe0, + 0x53, 0x1d, 0x2a, 0x5f, ], internal_dk: [ - 0x61, 0x0c, 0xbd, 0x9a, 0x57, 0x79, 0x79, 0xe1, 0xf7, 0x1d, 0xa8, 0x10, 0x0f, 0x6f, - 0xe6, 0xb8, 0xf6, 0xd1, 0x0a, 0x74, 0x7f, 0xed, 0x2a, 0x1c, 0x91, 0xcb, 0xe1, 0x42, - 0x47, 0x5c, 0x30, 0x82, + 0xc1, 0xcf, 0x55, 0xea, 0xc9, 0xa8, 0x94, 0x18, 0x77, 0x6b, 0x9e, 0xfc, 0x67, 0xef, + 0xe9, 0x0b, 0xf3, 0x61, 0xee, 0xb0, 0x96, 0xed, 0x61, 0x86, 0xc4, 0x1a, 0x60, 0xc4, + 0x29, 0xa5, 0xb5, 0xa9, ], asset: [ - 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, - 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, 0x86, 0xa2, 0x65, 0x8e, 0x0a, 0x07, 0xa0, 0x5a, - 0xc5, 0xb9, 0x50, 0x05, + 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, 0xb7, 0x38, 0x0e, 0xa4, + 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, + 0xf3, 0x96, 0xbf, 0x29, ], - note_v: 2558469029534639129, + note_v: 94453636825041987, note_rho: [ - 0x34, 0x10, 0x80, 0x6e, 0xa6, 0xf2, 0x88, 0xf8, 0x73, 0x6c, 0x23, 0x35, 0x7c, 0x85, - 0xf4, 0x57, 0x91, 0xe1, 0x70, 0x80, 0x29, 0xd9, 0x82, 0x4d, 0x90, 0x70, 0x46, 0x07, - 0xf3, 0x87, 0xa0, 0x3e, + 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, + 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, + 0x62, 0x47, 0x0d, 0x02, ], note_rseed: [ - 0x49, 0xbf, 0x98, 0x36, 0x57, 0x44, 0x31, 0x34, 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, - 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, - 0xa0, 0xd4, 0x70, 0x19, + 0xe0, 0xf0, 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, + 0xfa, 0xa7, 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, + 0x9a, 0xd4, 0xbb, 0xc6, ], note_cmx: [ - 0x07, 0x1c, 0x49, 0x8b, 0x02, 0x6b, 0x8b, 0x1a, 0x7a, 0x1e, 0x84, 0x00, 0x13, 0x87, - 0x20, 0x82, 0x3d, 0x80, 0xec, 0xa4, 0x99, 0xac, 0xd2, 0x91, 0xfc, 0x07, 0xfd, 0x2f, - 0x41, 0x6e, 0x83, 0x38, + 0x98, 0xfc, 0x4e, 0x7f, 0x1d, 0xb8, 0x5a, 0xe6, 0x42, 0x14, 0xd8, 0x30, 0x06, 0xd8, + 0xac, 0xa8, 0xc2, 0x48, 0x73, 0x53, 0x2c, 0x22, 0x1b, 0x06, 0xd1, 0x8d, 0xf2, 0xb7, + 0xeb, 0x5f, 0xe5, 0x00, ], note_nf: [ - 0x22, 0x55, 0x5e, 0xe7, 0x85, 0x46, 0x8c, 0xc7, 0x70, 0xca, 0xf9, 0x0f, 0x82, 0x61, - 0x1b, 0x80, 0x15, 0xb0, 0x3d, 0xd8, 0x85, 0x6c, 0xc9, 0xa2, 0x7c, 0xbf, 0x7f, 0x5c, - 0x31, 0x3d, 0x96, 0x0e, + 0x37, 0xd7, 0xe9, 0x3c, 0xec, 0xfc, 0x62, 0x08, 0x8c, 0xde, 0x33, 0x41, 0x47, 0x88, + 0xfe, 0xab, 0x15, 0x8a, 0x40, 0xb4, 0xe9, 0x4a, 0x51, 0x11, 0xa7, 0x07, 0xaf, 0x3a, + 0x44, 0x3b, 0xd1, 0x3a, ], }, TestVector { sk: [ - 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, 0x82, 0x84, 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, - 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, 0x0d, 0xc0, 0xb7, 0x16, 0xc4, 0x8f, 0xbd, 0x46, - 0x7f, 0x75, 0xb7, 0x80, + 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, 0x84, 0x1e, + 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, 0x69, 0x44, + 0x2e, 0xb7, 0x68, 0x1e, ], ask: [ - 0x10, 0x10, 0x16, 0x60, 0x30, 0x07, 0x06, 0x52, 0x6a, 0x03, 0xb2, 0x63, 0x24, 0x13, - 0x5b, 0xbd, 0xd2, 0x33, 0xfc, 0xf6, 0x96, 0xca, 0x7f, 0xd2, 0x12, 0xf2, 0x82, 0x55, - 0x9e, 0x78, 0x12, 0x3b, + 0xfb, 0x9c, 0xa6, 0xa7, 0xf2, 0x49, 0x20, 0x67, 0xaa, 0x19, 0x42, 0x01, 0xaa, 0xbc, + 0xd5, 0xc0, 0xce, 0xe9, 0x9f, 0x6d, 0x65, 0x0f, 0x0f, 0x10, 0x44, 0x96, 0xac, 0xc5, + 0x88, 0x34, 0x89, 0x2b, ], ak: [ - 0xeb, 0x1e, 0xd7, 0xf9, 0x37, 0x17, 0xd5, 0xdf, 0x15, 0xdd, 0xb6, 0xb2, 0xb2, 0xb0, - 0x17, 0x76, 0xf9, 0xa1, 0x91, 0xfb, 0x08, 0xa6, 0x8a, 0xe1, 0x32, 0x4f, 0x29, 0x13, - 0xe0, 0x6f, 0xa7, 0x10, + 0xa0, 0xb2, 0x52, 0xde, 0x9e, 0x88, 0xee, 0xc0, 0x36, 0x2e, 0x43, 0x6f, 0x58, 0x52, + 0xf7, 0x4f, 0x7e, 0x3c, 0x74, 0x94, 0xe4, 0xa6, 0x65, 0x2f, 0xbf, 0xa7, 0x44, 0xdb, + 0xa3, 0xa9, 0x23, 0x14, ], isk: [ - 0x90, 0x16, 0x58, 0x59, 0x87, 0x32, 0xd6, 0x5b, 0xea, 0x90, 0x17, 0xdb, 0x74, 0x38, - 0x76, 0xc5, 0x86, 0xbc, 0xa7, 0x45, 0x54, 0xd7, 0x60, 0xf4, 0x9b, 0xa6, 0x59, 0xe4, - 0xe2, 0x1c, 0xbb, 0x14, + 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, + 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, + 0x4d, 0x9f, 0x9f, 0x95, ], ik: [ - 0xa1, 0xe5, 0xf8, 0xab, 0x90, 0x24, 0x01, 0x9a, 0x67, 0x10, 0x53, 0x90, 0x86, 0x72, - 0x65, 0xb4, 0xc5, 0x16, 0x40, 0xe6, 0x5d, 0xb3, 0xcb, 0xcd, 0x7d, 0xf0, 0x04, 0x88, - 0xf8, 0x9e, 0x68, 0x35, + 0x3e, 0x34, 0xea, 0xa1, 0x93, 0x26, 0x04, 0x49, 0xf3, 0xe8, 0x83, 0xfd, 0x5f, 0xbd, + 0x84, 0xfd, 0x99, 0xbf, 0x10, 0xa1, 0xa4, 0xdf, 0x14, 0x60, 0x98, 0x78, 0x4a, 0xe2, + 0xc3, 0xc2, 0xdb, 0xf7, ], nk: [ - 0xf6, 0x42, 0x02, 0x4d, 0x49, 0xe8, 0x4b, 0x65, 0x33, 0xed, 0x2c, 0x37, 0x65, 0x06, - 0x06, 0x39, 0xfc, 0x27, 0x82, 0xd3, 0x9f, 0x87, 0x69, 0xdb, 0x80, 0x6b, 0x37, 0xde, - 0xb1, 0xf0, 0x9c, 0x2b, + 0xfe, 0x7d, 0xda, 0x8a, 0x42, 0xb1, 0x49, 0x04, 0xad, 0x4f, 0xf1, 0x14, 0xae, 0x3a, + 0x97, 0xd2, 0x01, 0xb6, 0x17, 0xf5, 0xd5, 0xd0, 0x2e, 0xe0, 0xde, 0x77, 0x4b, 0xb4, + 0x6e, 0xd0, 0x56, 0x37, ], rivk: [ - 0xe8, 0x2d, 0xad, 0xba, 0x81, 0x82, 0x3b, 0x52, 0xaf, 0x0b, 0xb5, 0xfc, 0x22, 0x79, - 0xaf, 0xfb, 0xff, 0xf8, 0x9c, 0x2d, 0xb2, 0x93, 0xbc, 0x5e, 0x30, 0x78, 0xa1, 0x31, - 0x91, 0x71, 0x66, 0x39, + 0xf8, 0xbf, 0x8f, 0x4f, 0x71, 0x88, 0x90, 0x67, 0xcb, 0x99, 0xf2, 0xec, 0xc5, 0x41, + 0x50, 0x6c, 0x23, 0x0a, 0xff, 0x88, 0x64, 0x26, 0x68, 0x59, 0xf0, 0x15, 0xdf, 0xf4, + 0xc4, 0x89, 0x5e, 0x32, ], ivk: [ - 0xbd, 0xa0, 0xc1, 0x5b, 0x01, 0x4c, 0x15, 0x59, 0xf3, 0x34, 0x14, 0x97, 0xeb, 0x67, - 0xe7, 0x49, 0x5b, 0x73, 0x87, 0xbb, 0x6c, 0x2c, 0xbe, 0xa5, 0x95, 0x46, 0x9e, 0xc1, - 0xd2, 0xa8, 0x23, 0x3a, + 0x4b, 0x22, 0xa9, 0x1d, 0xfe, 0xa9, 0x16, 0x81, 0x91, 0x48, 0xb8, 0x3d, 0x80, 0x5d, + 0xe3, 0xc7, 0xc6, 0x3f, 0xe3, 0x58, 0x11, 0x41, 0xec, 0xdc, 0x26, 0x43, 0x28, 0xe5, + 0x7c, 0x0b, 0x43, 0x2b, ], ovk: [ - 0xd3, 0x8e, 0x31, 0xbd, 0x8a, 0xbd, 0xc5, 0x05, 0xfb, 0x3b, 0x0f, 0x03, 0xa5, 0x8a, - 0x73, 0x4f, 0xce, 0x58, 0x3b, 0x51, 0x4f, 0x32, 0xb3, 0x03, 0xf4, 0x6c, 0x5a, 0x69, - 0x01, 0x85, 0xa9, 0xb0, + 0x12, 0xe5, 0xa1, 0x7f, 0x89, 0x12, 0xd9, 0x6b, 0xfd, 0xc7, 0xd3, 0x75, 0x3c, 0xe2, + 0xa8, 0x3a, 0xca, 0x2b, 0xc6, 0x45, 0x38, 0x3b, 0xc4, 0x54, 0x51, 0x11, 0x5e, 0xd5, + 0xb3, 0xf5, 0xbe, 0xaa, ], dk: [ - 0x9a, 0x5b, 0x8c, 0xdc, 0x9f, 0x7b, 0xe7, 0x47, 0x6f, 0x7b, 0x5b, 0x73, 0x70, 0x71, - 0x90, 0xb6, 0x17, 0x20, 0xf8, 0x4b, 0xb4, 0x84, 0x47, 0x5c, 0x84, 0xd1, 0xce, 0xf1, - 0x5c, 0xa8, 0x15, 0x92, + 0xc6, 0xa0, 0xdc, 0x04, 0x56, 0xbc, 0x4c, 0x39, 0x9e, 0x20, 0x2d, 0x00, 0xd3, 0x2e, + 0xaf, 0xc9, 0xa8, 0xc0, 0xe2, 0x65, 0xa4, 0xae, 0xb1, 0x07, 0xa9, 0xa6, 0x4d, 0x93, + 0x8b, 0x14, 0xc0, 0x0f, ], default_d: [ - 0x46, 0x48, 0x8d, 0x15, 0x40, 0x98, 0x39, 0x66, 0x05, 0xf3, 0xc8, + 0x07, 0xd3, 0x0c, 0x15, 0x5a, 0x71, 0x0a, 0x2d, 0x03, 0x28, 0x25, ], default_pk_d: [ - 0x28, 0xa3, 0x18, 0xf5, 0x04, 0x30, 0x43, 0x03, 0xee, 0xfd, 0x42, 0x87, 0x9c, 0x9f, - 0xc4, 0xf6, 0x27, 0x51, 0x90, 0xc6, 0x37, 0x63, 0x09, 0xb9, 0x13, 0xcc, 0xab, 0x3a, - 0x56, 0x95, 0x94, 0x28, + 0xd7, 0x8b, 0x08, 0x60, 0xbb, 0xf7, 0x82, 0x52, 0x83, 0x79, 0x8e, 0xa7, 0xa6, 0x62, + 0x98, 0x14, 0xed, 0xe8, 0x14, 0x8a, 0x53, 0x8d, 0xe6, 0x30, 0x0e, 0x0f, 0x88, 0x90, + 0x4f, 0x01, 0x4c, 0x19, ], internal_rivk: [ - 0xdd, 0xa7, 0x37, 0x26, 0xb1, 0x7b, 0xfb, 0x17, 0x82, 0xc5, 0x73, 0xa7, 0x5b, 0x54, - 0xfe, 0x6a, 0x37, 0xff, 0x66, 0x0c, 0x9b, 0x0f, 0x08, 0x64, 0xa5, 0x4f, 0x77, 0xe6, - 0x25, 0x8d, 0x69, 0x39, + 0xc4, 0x35, 0x16, 0x37, 0x67, 0x71, 0xad, 0xca, 0x2b, 0x7b, 0xeb, 0xe3, 0xe6, 0xa7, + 0x1c, 0xb6, 0x5c, 0xa8, 0xcf, 0x1f, 0xfb, 0x16, 0xc9, 0xc4, 0xf0, 0x48, 0x19, 0x86, + 0x87, 0x9e, 0xee, 0x28, ], internal_ivk: [ - 0x71, 0x67, 0x63, 0x93, 0xce, 0x07, 0x32, 0xfc, 0x42, 0x42, 0x83, 0x1d, 0x94, 0xe7, - 0xf8, 0xc3, 0xf8, 0xa0, 0x78, 0x4d, 0xee, 0xa2, 0xae, 0xcd, 0x79, 0xdd, 0x54, 0x10, - 0x2a, 0x72, 0x89, 0x13, + 0xaf, 0x6a, 0xbb, 0xb5, 0xde, 0x71, 0x0f, 0x0f, 0xb4, 0x0f, 0xa5, 0xa2, 0xe2, 0x7e, + 0x8c, 0x83, 0x2c, 0x69, 0x9c, 0x2b, 0x7f, 0x58, 0xbd, 0xa6, 0xbc, 0x9a, 0xd5, 0xb9, + 0x11, 0xc1, 0xf0, 0x20, ], internal_ovk: [ - 0x4e, 0x71, 0xe6, 0xc1, 0x84, 0x5a, 0x5a, 0x36, 0xcf, 0x46, 0x03, 0x0f, 0xe6, 0x81, - 0xfd, 0xb0, 0xce, 0x39, 0xf4, 0x61, 0x31, 0x47, 0xbb, 0xcd, 0x10, 0xae, 0x42, 0x9c, - 0x81, 0x94, 0xb2, 0x05, + 0x08, 0x6a, 0x61, 0x0d, 0x50, 0x7d, 0xb9, 0xaa, 0x4f, 0x34, 0x90, 0x40, 0xd4, 0xf4, + 0xbf, 0x35, 0x58, 0x05, 0x68, 0xcf, 0x36, 0xe9, 0x3f, 0x40, 0x57, 0x5f, 0x7f, 0x2a, + 0x50, 0xb6, 0xa1, 0xde, ], internal_dk: [ - 0x06, 0x31, 0xff, 0x9b, 0x81, 0xac, 0xf2, 0x1f, 0xb6, 0xe1, 0xf0, 0x81, 0xb5, 0x50, - 0xa5, 0x4e, 0xa1, 0x54, 0x49, 0x8e, 0x52, 0x98, 0x73, 0xe2, 0x58, 0x82, 0xf0, 0x66, - 0xb7, 0x3b, 0x6b, 0x8c, + 0xfa, 0xae, 0xd1, 0xb9, 0xd7, 0xee, 0x7b, 0x90, 0xb4, 0xa4, 0x70, 0xfd, 0x49, 0xdc, + 0xd2, 0x8c, 0x76, 0xe6, 0x0e, 0xfc, 0xb8, 0x0f, 0x4d, 0x9e, 0x40, 0xe6, 0x6f, 0xa7, + 0x76, 0xc7, 0x07, 0x1f, ], asset: [ - 0x0c, 0x05, 0x36, 0xac, 0xdd, 0xf6, 0xf1, 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, - 0x14, 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, - 0x06, 0x77, 0xe3, 0x1b, + 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, 0x15, 0x81, 0xa1, 0x55, + 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, 0x6a, 0xd3, 0xa0, 0x8c, + 0xb6, 0xb8, 0x31, 0x31, ], - note_v: 17683470315120269844, + note_v: 1448031623652762490, note_rho: [ - 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, - 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, - 0x7b, 0x48, 0x8d, 0x25, + 0x76, 0x1f, 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, + 0xec, 0xa3, 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, + 0x99, 0xc7, 0x1f, 0x18, ], note_rseed: [ - 0x56, 0xd7, 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, - 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, - 0xe5, 0xe1, 0x71, 0x1c, + 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, 0x1c, 0xe7, + 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, 0xe7, 0x5e, + 0xf8, 0xe3, 0xf8, 0xbd, ], note_cmx: [ - 0x7b, 0xc1, 0xdd, 0xba, 0x52, 0x06, 0x14, 0xdd, 0x4e, 0x44, 0x3e, 0xaa, 0xf2, 0x5b, - 0xea, 0xa0, 0x14, 0xc2, 0x78, 0x6d, 0x15, 0x0a, 0x3b, 0x6f, 0xea, 0x97, 0x6a, 0x9b, - 0xdf, 0x27, 0x02, 0x04, + 0xdf, 0x72, 0x6a, 0x0e, 0x47, 0xd8, 0xb7, 0xd9, 0xcc, 0xa2, 0x6a, 0x1f, 0x74, 0x55, + 0x4a, 0x81, 0x52, 0x5b, 0x1b, 0x7a, 0xf1, 0x6e, 0xfb, 0x52, 0xb9, 0x27, 0x8b, 0x7c, + 0x8a, 0xbf, 0x8c, 0x22, ], note_nf: [ - 0x78, 0x31, 0xe9, 0xc5, 0x1c, 0xc1, 0xdc, 0xa6, 0xda, 0x89, 0x1a, 0xde, 0xad, 0x3a, - 0x79, 0x24, 0xff, 0x26, 0x4b, 0xe4, 0x25, 0x0b, 0xec, 0x05, 0xc5, 0x92, 0xd3, 0x14, - 0x52, 0x6b, 0x1a, 0x2f, + 0x6a, 0xfb, 0x25, 0xb0, 0x7d, 0x0d, 0x60, 0xa3, 0x28, 0xef, 0x22, 0xd9, 0x06, 0xf3, + 0x53, 0x1d, 0x8b, 0x50, 0xc4, 0x10, 0x7b, 0xd1, 0xc7, 0x66, 0x2c, 0xd6, 0x7b, 0x5d, + 0xb2, 0x0a, 0x05, 0x28, ], }, TestVector { sk: [ - 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, - 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, 0x5d, 0x4b, - 0xec, 0x95, 0x12, 0xbf, + 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, + 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, + 0x0a, 0x88, 0x06, 0x12, ], ask: [ - 0x6e, 0x61, 0x4e, 0x28, 0x21, 0x35, 0x2a, 0xce, 0xd4, 0x53, 0x3e, 0x86, 0x42, 0x75, - 0x18, 0xc7, 0x42, 0xbf, 0xda, 0x68, 0x79, 0x65, 0x07, 0xa7, 0x01, 0xdd, 0xa3, 0x7d, - 0xaf, 0x20, 0xb3, 0x17, + 0xf5, 0x90, 0xaa, 0x36, 0x24, 0x9c, 0x92, 0xdb, 0x3c, 0xb8, 0x45, 0x9e, 0x7c, 0x0a, + 0x19, 0xd9, 0x22, 0xa7, 0x5e, 0x78, 0x3f, 0xf3, 0x6e, 0x7d, 0x08, 0x10, 0x55, 0xcd, + 0x5f, 0xf2, 0x1c, 0x38, ], ak: [ - 0xed, 0x6e, 0x79, 0xae, 0xd5, 0x75, 0x2e, 0x64, 0xc6, 0xe4, 0xb7, 0x9c, 0x06, 0xa4, - 0x43, 0xb8, 0xef, 0x32, 0xf7, 0xef, 0xa1, 0xf8, 0xf3, 0x5b, 0x54, 0x12, 0x63, 0xaa, - 0x66, 0xaf, 0xd7, 0x0a, + 0x66, 0x38, 0xf1, 0x69, 0x63, 0x2d, 0xd9, 0x4d, 0x3b, 0x0c, 0x21, 0x4e, 0xac, 0xc8, + 0x52, 0xc1, 0xe4, 0xe0, 0x70, 0xcb, 0xdf, 0xb6, 0xe6, 0x2d, 0x08, 0x0f, 0x57, 0x68, + 0xa6, 0xaa, 0xd4, 0x23, ], isk: [ - 0x91, 0xfe, 0x60, 0x36, 0x9d, 0x03, 0x63, 0x66, 0xc2, 0x45, 0x79, 0xec, 0x10, 0xb5, - 0x38, 0x1e, 0x8f, 0x1e, 0xda, 0x89, 0x5f, 0xe0, 0xb6, 0x76, 0xa2, 0xc8, 0x0b, 0x25, - 0xaf, 0x98, 0x67, 0x11, + 0x53, 0xca, 0x28, 0x5b, 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, + 0x54, 0xa8, 0x94, 0x32, 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, + 0x68, 0xaf, 0xac, 0x87, ], ik: [ - 0xfe, 0x7e, 0xfc, 0x8b, 0x60, 0x72, 0x1b, 0x3c, 0x8e, 0x88, 0xdc, 0xc8, 0x86, 0xcb, - 0x04, 0x8f, 0xad, 0x5b, 0x48, 0x07, 0xf2, 0xae, 0xe4, 0xae, 0xc6, 0xe1, 0xc3, 0xfa, - 0x51, 0x44, 0x03, 0x1c, + 0x5e, 0x8e, 0x92, 0x06, 0x37, 0x1f, 0xe4, 0xa0, 0x1d, 0x1c, 0x8a, 0x2c, 0x36, 0xe2, + 0x1a, 0x22, 0x6b, 0x12, 0xb2, 0xf6, 0x56, 0xfc, 0xcc, 0x0e, 0x9c, 0x43, 0x22, 0x27, + 0x69, 0x31, 0x09, 0x91, ], nk: [ - 0xb1, 0xe9, 0x25, 0x85, 0x1e, 0x8c, 0xbf, 0x94, 0x28, 0xaf, 0x98, 0xfc, 0x71, 0x4c, - 0xc9, 0xf2, 0x41, 0x30, 0x1a, 0x3d, 0x0f, 0xea, 0x55, 0xe1, 0x29, 0x26, 0xbf, 0x4e, - 0x84, 0x0d, 0x49, 0x16, + 0x64, 0x02, 0x41, 0x63, 0x14, 0x5b, 0x68, 0x66, 0x8d, 0x1c, 0x3f, 0x9c, 0x0f, 0x76, + 0xd3, 0x92, 0xd3, 0x71, 0x8f, 0x01, 0x75, 0x18, 0x1b, 0xa1, 0x4a, 0x0f, 0xc9, 0x5b, + 0x7f, 0xec, 0x65, 0x35, ], rivk: [ - 0x85, 0x45, 0x0e, 0x25, 0xbf, 0x7d, 0x7a, 0xed, 0x86, 0xc7, 0xab, 0xd3, 0x5e, 0xfb, - 0x8c, 0x62, 0x86, 0x77, 0x96, 0xf3, 0x47, 0x67, 0xd3, 0xd3, 0xfe, 0xf6, 0x49, 0x42, - 0x1c, 0x13, 0x32, 0x2f, + 0x4a, 0x61, 0xd4, 0x32, 0x0d, 0x12, 0xdd, 0x47, 0xa6, 0xc2, 0x2d, 0x00, 0xd8, 0xb0, + 0x52, 0xb4, 0x83, 0xd0, 0x40, 0xda, 0xd3, 0x79, 0xbb, 0x29, 0x0b, 0x40, 0xd5, 0x0d, + 0x36, 0x71, 0xcd, 0x0c, ], ivk: [ - 0xe5, 0xe7, 0xaf, 0x47, 0xbe, 0x07, 0x6f, 0xf1, 0xc6, 0x5b, 0x2e, 0xd3, 0x2c, 0xcc, - 0xab, 0xad, 0x90, 0xd6, 0x7e, 0xff, 0x93, 0x5c, 0xcc, 0x29, 0xb1, 0x42, 0xe2, 0xd6, - 0x88, 0x01, 0x8e, 0x0c, + 0x2c, 0x2b, 0x90, 0xc8, 0x3c, 0x30, 0xc2, 0x71, 0x64, 0xce, 0x4d, 0xd9, 0x14, 0xe6, + 0xb8, 0x9e, 0x99, 0x50, 0xe4, 0xf9, 0xa7, 0xa2, 0x4a, 0xfb, 0xcf, 0x11, 0xfe, 0x0d, + 0x86, 0xb1, 0x36, 0x1d, ], ovk: [ - 0xb4, 0x08, 0x5e, 0xe4, 0xeb, 0xd2, 0xd2, 0x80, 0xd5, 0xbf, 0x29, 0x35, 0xfb, 0xb1, - 0x6c, 0x8c, 0xa1, 0x29, 0x25, 0x4b, 0x92, 0x87, 0x2a, 0x1d, 0x12, 0x4a, 0xbb, 0x85, - 0x34, 0x8b, 0x1a, 0x88, + 0x30, 0xe0, 0xa4, 0x48, 0xa6, 0x1e, 0x75, 0xa2, 0x5b, 0xd5, 0x89, 0x61, 0x12, 0x5a, + 0x8e, 0xae, 0x84, 0x45, 0x24, 0xde, 0x0d, 0x91, 0x22, 0xa1, 0x2a, 0x4d, 0x59, 0x6c, + 0xfe, 0xdf, 0xab, 0xc1, ], dk: [ - 0xb3, 0xa5, 0x2b, 0xdc, 0x62, 0xaa, 0xfa, 0xda, 0x4c, 0x40, 0xb4, 0xa6, 0xcd, 0x09, - 0x07, 0x09, 0x83, 0x35, 0xfc, 0xb7, 0x9a, 0x6f, 0xd6, 0xd3, 0x10, 0xc7, 0x26, 0xc0, - 0x1b, 0x39, 0xb3, 0x9d, + 0x33, 0xe4, 0x2c, 0x50, 0xa6, 0x37, 0xe9, 0xdb, 0x68, 0xbe, 0x33, 0x11, 0xbf, 0x5d, + 0x7f, 0xc4, 0x77, 0x4b, 0xe6, 0x19, 0x26, 0xc8, 0x7e, 0xe4, 0xc7, 0xef, 0x36, 0xf1, + 0x87, 0xbb, 0x8c, 0xea, ], default_d: [ - 0xd8, 0x4c, 0x41, 0xf7, 0xb6, 0xb4, 0x33, 0x93, 0x65, 0xe3, 0x41, + 0xc8, 0xa8, 0x3e, 0x75, 0xb1, 0x29, 0x1e, 0x29, 0x59, 0x00, 0xa5, ], default_pk_d: [ - 0x0b, 0x85, 0x8b, 0x0e, 0x24, 0x56, 0x8b, 0x98, 0x4d, 0xa8, 0x96, 0xb3, 0xfb, 0x46, - 0xbe, 0xe7, 0x32, 0xac, 0x8c, 0x3d, 0xde, 0x34, 0xe7, 0x6b, 0xe7, 0x59, 0x90, 0xc8, - 0xd7, 0xc9, 0xc5, 0x04, + 0xc5, 0xc1, 0x1c, 0x61, 0x37, 0xce, 0x83, 0x92, 0x69, 0xee, 0x46, 0xc7, 0x97, 0xeb, + 0xc4, 0x6c, 0x10, 0x53, 0x1c, 0x11, 0xc7, 0x51, 0xa7, 0xda, 0xab, 0xa6, 0x62, 0x2a, + 0x43, 0xe5, 0xaf, 0x35, ], internal_rivk: [ - 0xad, 0x13, 0x65, 0x45, 0x09, 0xf3, 0x0a, 0x80, 0xa3, 0x2f, 0xcd, 0xb9, 0x78, 0x93, - 0xaa, 0x32, 0x7c, 0x3e, 0x56, 0x7f, 0x67, 0xb4, 0x40, 0x45, 0x5f, 0x0d, 0xeb, 0x68, - 0xc3, 0x24, 0xb6, 0x39, + 0x69, 0xa9, 0x4e, 0x8c, 0x99, 0x82, 0x59, 0xfe, 0x6e, 0x54, 0x6c, 0x83, 0x32, 0x8b, + 0x72, 0xf6, 0xf8, 0x3e, 0x80, 0x11, 0x70, 0x6a, 0x5e, 0x31, 0xc2, 0x0c, 0xf8, 0x85, + 0x1e, 0x13, 0x94, 0x37, ], internal_ivk: [ - 0xfa, 0xb6, 0xa5, 0x05, 0xa6, 0xee, 0x92, 0x55, 0x0d, 0xf5, 0xd5, 0xce, 0xbc, 0x37, - 0x9c, 0xd6, 0x24, 0x6c, 0xd2, 0xcc, 0x17, 0x43, 0xa8, 0x1f, 0xb5, 0xf9, 0x8a, 0xa0, - 0xf5, 0xea, 0x8f, 0x0d, + 0x14, 0xb4, 0xf4, 0x27, 0xd3, 0x39, 0xd1, 0xba, 0x26, 0xae, 0xcd, 0x57, 0x6f, 0x65, + 0x60, 0x9f, 0x18, 0xd9, 0xfc, 0x35, 0xb5, 0xf6, 0xdb, 0x5a, 0xf4, 0xc2, 0xa4, 0x32, + 0x09, 0x5b, 0x88, 0x28, ], internal_ovk: [ - 0x8d, 0x08, 0x28, 0xa8, 0x3a, 0xc9, 0x94, 0x33, 0x8a, 0x87, 0xe9, 0x72, 0x68, 0xd4, - 0xaf, 0x0a, 0x87, 0x3b, 0x7c, 0x5b, 0x68, 0xec, 0x60, 0x13, 0x38, 0x51, 0x51, 0xf0, - 0x2d, 0xb1, 0x06, 0x1b, + 0x01, 0xdb, 0x0e, 0x1d, 0x57, 0x47, 0x62, 0xfd, 0xf3, 0x18, 0xa4, 0xf0, 0x48, 0x57, + 0xcf, 0x3b, 0x35, 0x7e, 0xeb, 0xd7, 0xad, 0x92, 0x9e, 0xb9, 0xf8, 0xf1, 0x37, 0x33, + 0xda, 0x8f, 0x2d, 0x69, ], internal_dk: [ - 0x31, 0xe2, 0x98, 0x37, 0xcc, 0x3d, 0xdd, 0x80, 0xdd, 0x80, 0x97, 0x19, 0x7b, 0xfa, - 0x66, 0x46, 0x67, 0x96, 0x2b, 0x09, 0x05, 0x5e, 0x50, 0x7f, 0x39, 0x7d, 0x94, 0xae, - 0xad, 0x84, 0xd8, 0x48, + 0xf7, 0x6c, 0xb8, 0x2a, 0x6f, 0xe2, 0x49, 0xaf, 0xda, 0x87, 0xa7, 0xb5, 0xd8, 0xf7, + 0x7c, 0x4f, 0xba, 0x4d, 0x62, 0x73, 0xd8, 0x0e, 0xe4, 0x5a, 0x3d, 0xd5, 0xb6, 0x37, + 0xa4, 0x30, 0x5f, 0xdb, ], asset: [ - 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, - 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, - 0x78, 0xa2, 0x69, 0x16, + 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, + 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, + 0xcd, 0xdb, 0x41, 0x87, ], - note_v: 12104108071547302835, + note_v: 3250512694054592767, note_rho: [ - 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, 0x28, 0x48, 0xcc, 0xbd, - 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, 0xff, 0xa0, 0x05, 0xc3, - 0x12, 0x24, 0x1c, 0x2d, + 0xbd, 0xf9, 0x55, 0x59, 0x48, 0xcb, 0xd5, 0xa3, 0x32, 0xd0, 0x45, 0xde, 0x6b, 0xa6, + 0xbf, 0x44, 0x90, 0xad, 0xfe, 0x74, 0x44, 0xcd, 0x46, 0x7a, 0x09, 0x07, 0x54, 0x17, + 0xfc, 0xc0, 0x06, 0x2e, ], note_rseed: [ - 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, - 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, - 0xcd, 0xdb, 0x41, 0x87, + 0x49, 0xf0, 0x08, 0xc5, 0x1a, 0xd4, 0x22, 0x74, 0x39, 0xc1, 0xb4, 0x47, 0x6c, 0xcd, + 0x8e, 0x97, 0x86, 0x2d, 0xab, 0x7b, 0xe1, 0xe8, 0xd3, 0x99, 0xc0, 0x5e, 0xf2, 0x7c, + 0x6e, 0x22, 0xee, 0x27, ], note_cmx: [ - 0xea, 0xf9, 0x49, 0x1c, 0xab, 0xca, 0x20, 0x07, 0xba, 0x91, 0xea, 0xc9, 0xb3, 0xc0, - 0xa1, 0x1c, 0x58, 0xef, 0x5f, 0xe0, 0x71, 0x86, 0x8c, 0x66, 0xf1, 0xc5, 0xf5, 0x9c, - 0x7c, 0x99, 0x25, 0x14, + 0x83, 0xc0, 0x41, 0xba, 0x80, 0x64, 0x27, 0x9b, 0x24, 0x02, 0xae, 0x1e, 0x60, 0x30, + 0xcb, 0x89, 0xc5, 0x0d, 0x96, 0x6e, 0x03, 0x93, 0x73, 0x5c, 0x45, 0x81, 0xd4, 0x98, + 0x11, 0x38, 0x8d, 0x01, ], note_nf: [ - 0x3a, 0xbc, 0x17, 0xad, 0xee, 0x2a, 0xa8, 0x8d, 0xf8, 0x93, 0x99, 0x4f, 0x1a, 0xf2, - 0x71, 0x51, 0xc1, 0x8b, 0xa6, 0xa9, 0x89, 0xc4, 0xbf, 0xfb, 0xb9, 0xa9, 0x18, 0xd5, - 0x50, 0x71, 0x95, 0x02, + 0x1c, 0xe7, 0x2d, 0x48, 0x1c, 0xd5, 0x9e, 0x6c, 0x89, 0x5d, 0x2c, 0x65, 0x85, 0xe9, + 0x77, 0x27, 0x9d, 0x99, 0x27, 0x2e, 0x66, 0xa6, 0xda, 0xa4, 0x74, 0x20, 0xed, 0xbb, + 0xa7, 0xf8, 0x9f, 0x27, ], }, TestVector { sk: [ - 0x2c, 0xfc, 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, - 0xf9, 0x30, 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, - 0x33, 0x92, 0xde, 0xb8, + 0x3e, 0x15, 0x78, 0x6e, 0x39, 0x4c, 0x8f, 0x1b, 0xe3, 0x16, 0x82, 0xa3, 0x01, 0x47, + 0x96, 0x3a, 0xc8, 0xda, 0x8d, 0x41, 0xd8, 0x04, 0x25, 0x84, 0x26, 0xa3, 0xf7, 0x02, + 0x89, 0xb8, 0xad, 0x19, ], ask: [ - 0x33, 0x4c, 0x49, 0x70, 0x7d, 0x93, 0x52, 0x5e, 0x70, 0x45, 0x5d, 0xd2, 0xc0, 0xdd, - 0xb4, 0x2d, 0x49, 0xc9, 0x39, 0x9f, 0x96, 0x14, 0x7f, 0xc0, 0x5e, 0x79, 0xec, 0x49, - 0x1b, 0xd9, 0xad, 0x07, + 0xd4, 0x21, 0xad, 0x5b, 0x18, 0x0c, 0x34, 0x4b, 0x93, 0xb4, 0xcf, 0x3c, 0xe9, 0x55, + 0x49, 0x1e, 0x00, 0x58, 0x45, 0xd9, 0x2e, 0x6f, 0xd6, 0xe9, 0xeb, 0x27, 0x6d, 0xfd, + 0xe6, 0xea, 0x89, 0x0c, ], ak: [ - 0xd3, 0xc0, 0xa4, 0xdc, 0x7e, 0x33, 0x47, 0xa5, 0x0b, 0xf0, 0x58, 0x44, 0xe0, 0xcb, - 0xfc, 0xd4, 0x41, 0x4a, 0x80, 0x9c, 0x0c, 0x30, 0xb1, 0x43, 0xbc, 0xe4, 0xa7, 0xc6, - 0x5c, 0xf0, 0x7f, 0x36, + 0x91, 0x34, 0xed, 0x63, 0xae, 0xe1, 0x94, 0xb4, 0xb5, 0x58, 0xf5, 0xf6, 0x55, 0xba, + 0xb5, 0x39, 0x39, 0x6b, 0x99, 0x67, 0x8e, 0xf9, 0x1f, 0x44, 0x5b, 0x51, 0x7c, 0x79, + 0xc5, 0x82, 0x18, 0x0e, ], isk: [ - 0xb3, 0x72, 0x5b, 0x89, 0x31, 0xc4, 0x93, 0xdb, 0x21, 0x97, 0xe2, 0x87, 0x8e, 0xd3, - 0x62, 0x67, 0x0a, 0x18, 0xb9, 0x29, 0x31, 0x2e, 0xdd, 0x64, 0x4d, 0x74, 0xf9, 0xf3, - 0x23, 0xc6, 0x5e, 0x14, + 0xd8, 0xde, 0x13, 0xbe, 0x4e, 0xeb, 0xe3, 0xbd, 0x4c, 0x8a, 0x6f, 0x55, 0xd6, 0xe0, + 0xc3, 0x73, 0xd4, 0x56, 0x85, 0x18, 0x79, 0xf5, 0xfb, 0xc2, 0x82, 0xdb, 0x9e, 0x13, + 0x48, 0x06, 0xbf, 0xf7, ], ik: [ - 0xc5, 0x12, 0x36, 0x0c, 0x13, 0x59, 0xa6, 0x4f, 0x2a, 0xbb, 0x9e, 0xb3, 0xab, 0x43, - 0xe4, 0x99, 0x8e, 0xd6, 0xd5, 0x1d, 0x17, 0xbd, 0x9d, 0x70, 0x64, 0xa3, 0x91, 0x67, - 0x41, 0x98, 0xea, 0x1a, + 0xb7, 0x47, 0x4b, 0x65, 0x52, 0xdf, 0xc5, 0xe1, 0xe2, 0x57, 0xca, 0xbf, 0xee, 0x40, + 0xe6, 0x08, 0x85, 0x7a, 0x2f, 0xbd, 0x48, 0xfd, 0xa6, 0x6e, 0x9c, 0x71, 0x31, 0x17, + 0x11, 0x58, 0x24, 0xa8, ], nk: [ - 0xc6, 0xb5, 0xe9, 0x28, 0x83, 0x73, 0x52, 0x14, 0x90, 0x20, 0xcc, 0x1f, 0x68, 0xf0, - 0xfb, 0xf8, 0x6a, 0x79, 0x89, 0xcb, 0x4e, 0x09, 0xb3, 0xb5, 0x44, 0x87, 0xb5, 0xcf, - 0x59, 0x00, 0x7c, 0x38, + 0x1b, 0x7d, 0x9f, 0x63, 0x24, 0x9b, 0x96, 0xe7, 0xde, 0x1e, 0xe9, 0xfc, 0xf9, 0x3b, + 0xbd, 0xa4, 0xeb, 0xe7, 0xe8, 0xe4, 0xc2, 0x1a, 0x6f, 0xe4, 0x24, 0xe9, 0x0b, 0x1d, + 0x72, 0x4f, 0x58, 0x39, ], rivk: [ - 0xe9, 0x38, 0xcf, 0x40, 0xc9, 0x83, 0x1a, 0x1a, 0x28, 0x48, 0xbc, 0x80, 0x22, 0x03, - 0x10, 0x81, 0x0b, 0x8f, 0x6a, 0xfd, 0xe1, 0x6c, 0xdd, 0x1e, 0xa1, 0x29, 0x98, 0xd3, - 0x74, 0xd1, 0xbb, 0x08, + 0x60, 0x2b, 0x39, 0xb7, 0xca, 0xff, 0x4e, 0x65, 0x6d, 0x1e, 0x2e, 0x50, 0x87, 0xbf, + 0x19, 0xec, 0x40, 0x93, 0x92, 0x5b, 0x99, 0x36, 0xb2, 0x72, 0x70, 0x74, 0x8e, 0x1b, + 0x16, 0xe0, 0x2f, 0x05, ], ivk: [ - 0x80, 0x78, 0xd4, 0x95, 0x71, 0x1d, 0xc8, 0xc9, 0xba, 0xea, 0xdf, 0x84, 0xee, 0xfa, - 0x78, 0x26, 0xe5, 0x74, 0x3c, 0x5f, 0x92, 0x26, 0x99, 0xf3, 0xfa, 0x56, 0xeb, 0xa3, - 0xe0, 0xe0, 0x77, 0x3c, + 0x5c, 0xb0, 0x1e, 0x28, 0x3d, 0x8b, 0x9e, 0xb1, 0x39, 0xe7, 0x4d, 0x4a, 0x72, 0xca, + 0x45, 0x14, 0x6b, 0xa7, 0xdd, 0x5e, 0x33, 0xe2, 0x79, 0xd3, 0x59, 0xd0, 0xc2, 0x75, + 0x01, 0x5a, 0xc1, 0x18, ], ovk: [ - 0x6c, 0xc7, 0xf9, 0xdc, 0xb8, 0x16, 0x9c, 0x38, 0x90, 0x97, 0x2f, 0xd3, 0x51, 0x04, - 0x13, 0x60, 0x4d, 0x0d, 0xdf, 0x82, 0xff, 0xfa, 0x0d, 0xc4, 0x58, 0xef, 0x5c, 0xd6, - 0xbb, 0x2f, 0x0d, 0x89, + 0x92, 0x13, 0x53, 0x2c, 0x80, 0xac, 0x0c, 0x31, 0x00, 0x1c, 0x08, 0x29, 0x67, 0x89, + 0x8c, 0xe1, 0x5e, 0xc6, 0x7e, 0xd5, 0xe6, 0x89, 0x65, 0x34, 0xb3, 0x3f, 0xc3, 0x4a, + 0x80, 0xda, 0x82, 0x83, ], dk: [ - 0xf8, 0xa0, 0x79, 0x29, 0x1e, 0x32, 0xce, 0x94, 0x4f, 0x0f, 0xfe, 0x65, 0x8e, 0xd8, - 0xfb, 0xdb, 0xfd, 0xb9, 0xa2, 0xd6, 0x96, 0x86, 0xe7, 0x44, 0xa5, 0xf7, 0xb5, 0x96, - 0xf1, 0x22, 0x57, 0xee, + 0x54, 0x72, 0xf9, 0x27, 0x27, 0x9e, 0xd7, 0xce, 0xc0, 0x9e, 0x60, 0xe7, 0x13, 0xd9, + 0xaf, 0x82, 0xe6, 0x79, 0x6f, 0x60, 0x9b, 0x83, 0xe7, 0xff, 0xdf, 0x2e, 0xbf, 0x16, + 0x4a, 0xd8, 0xa2, 0xb6, ], default_d: [ - 0x5c, 0x1b, 0x2f, 0x77, 0x6e, 0x19, 0x81, 0x35, 0xd0, 0xfd, 0x1f, + 0xac, 0xfb, 0x8d, 0xbc, 0x78, 0x27, 0x95, 0xb0, 0x21, 0xa1, 0xaf, ], default_pk_d: [ - 0x2a, 0x91, 0x7a, 0xe2, 0x42, 0x40, 0xb1, 0xa6, 0xaa, 0x67, 0x5b, 0x83, 0xa3, 0x78, - 0x25, 0x03, 0xeb, 0x71, 0x26, 0xd9, 0x99, 0x04, 0x9f, 0xb5, 0x7c, 0x70, 0x5e, 0xbc, - 0x01, 0x4e, 0x6b, 0x8f, + 0x5c, 0x9e, 0xac, 0x4a, 0x26, 0x36, 0xef, 0x27, 0x0b, 0xd8, 0x98, 0x6b, 0x72, 0xb7, + 0x01, 0x45, 0x5d, 0x40, 0x14, 0xbb, 0x83, 0xe8, 0x31, 0xa7, 0x04, 0x01, 0x75, 0x3d, + 0xc7, 0xf5, 0x58, 0x3b, ], internal_rivk: [ - 0xcd, 0x1d, 0xd3, 0x5e, 0xb9, 0xfa, 0xd9, 0x42, 0xb8, 0x69, 0xc8, 0x6f, 0xa1, 0x31, - 0x09, 0x83, 0x04, 0x78, 0x59, 0xfa, 0xe9, 0x09, 0xae, 0x97, 0x69, 0x7d, 0xa7, 0x0f, - 0xd5, 0x72, 0xa3, 0x16, + 0x52, 0x22, 0xd7, 0x35, 0x07, 0x6e, 0x53, 0x15, 0x2a, 0x3d, 0x00, 0x33, 0x19, 0x6e, + 0xe7, 0x3c, 0x7f, 0x6b, 0xf6, 0x08, 0xce, 0x1a, 0x7d, 0x54, 0xac, 0xfc, 0x04, 0x54, + 0x91, 0x87, 0xe7, 0x02, ], internal_ivk: [ - 0xa3, 0x36, 0xaa, 0x7a, 0xe3, 0xf6, 0xb5, 0x98, 0x3d, 0xad, 0xf0, 0x54, 0x93, 0xd5, - 0x76, 0xbe, 0x17, 0x31, 0x89, 0x7d, 0x36, 0x44, 0x83, 0x2b, 0x91, 0x81, 0xdd, 0xa1, - 0xbf, 0x7e, 0x1d, 0x17, + 0x44, 0xff, 0x25, 0xf6, 0xbd, 0x3e, 0xfc, 0xc1, 0x4a, 0x12, 0xdb, 0x7e, 0x2d, 0x2a, + 0xdd, 0xce, 0xe4, 0x84, 0x86, 0x22, 0xa9, 0x98, 0xb7, 0x83, 0x60, 0x88, 0x78, 0x36, + 0x0a, 0xb8, 0xd7, 0x24, ], internal_ovk: [ - 0x9f, 0xa3, 0xc3, 0xb0, 0x3a, 0xf8, 0xc3, 0xf7, 0x87, 0x44, 0x1a, 0x8c, 0x34, 0x07, - 0x8f, 0x6f, 0x36, 0xbb, 0xdc, 0xfc, 0x9b, 0x11, 0x0d, 0x3e, 0x27, 0x59, 0x57, 0xc4, - 0x43, 0x9a, 0x25, 0x48, + 0x21, 0x1d, 0x5c, 0x4e, 0x72, 0x3f, 0x62, 0xfc, 0xdd, 0x7f, 0x90, 0xe9, 0x54, 0xd1, + 0xba, 0x14, 0xe5, 0x9f, 0xb6, 0x0c, 0xdd, 0x7e, 0x44, 0xb7, 0xb9, 0x4a, 0x58, 0xcc, + 0x48, 0xfa, 0x96, 0x67, ], internal_dk: [ - 0x0c, 0xac, 0x83, 0xbf, 0x12, 0xf9, 0xc0, 0x56, 0x68, 0xa8, 0x3d, 0x27, 0x3d, 0x44, - 0x13, 0x85, 0x30, 0xd7, 0xa7, 0xf8, 0x76, 0x60, 0x21, 0xc5, 0x5b, 0x65, 0x03, 0xb1, - 0xda, 0xcc, 0xe5, 0x92, + 0xa6, 0xc2, 0x25, 0xd5, 0xac, 0xd0, 0x8e, 0x27, 0xb9, 0x46, 0x80, 0x71, 0x19, 0xc5, + 0xb0, 0x46, 0xb6, 0x97, 0x5c, 0xb1, 0xa0, 0x3a, 0xac, 0xf0, 0x89, 0x76, 0x39, 0xb0, + 0x65, 0x4c, 0x7e, 0x20, ], asset: [ - 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, - 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, 0x40, 0x50, 0xaf, 0xd8, 0xfe, 0x94, - 0xe9, 0x7d, 0x2e, 0x9e, + 0x0c, 0x15, 0x13, 0xad, 0x47, 0xca, 0x61, 0xc6, 0x59, 0xcc, 0x5d, 0x32, 0x5b, 0x44, + 0x0f, 0x6b, 0x9f, 0x59, 0xaf, 0xf6, 0x68, 0x79, 0xbb, 0x66, 0x88, 0xfd, 0x28, 0x59, + 0x36, 0x2b, 0x18, 0x2f, ], - note_v: 17139625070743016316, + note_v: 7844555504117092638, note_rho: [ - 0x6c, 0x0b, 0x38, 0x99, 0xd4, 0x12, 0x22, 0xba, 0xce, 0x76, 0x0e, 0xe9, 0xc8, 0x81, - 0x8d, 0xed, 0x59, 0x9e, 0x34, 0xc5, 0x6d, 0x73, 0x72, 0xaf, 0x1e, 0xb8, 0x68, 0x52, - 0xf2, 0xa7, 0x32, 0x10, + 0xf3, 0x7b, 0xf6, 0xf3, 0xac, 0x2d, 0x26, 0xb8, 0x46, 0x86, 0xe5, 0x69, 0xd5, 0x8d, + 0x99, 0xc1, 0x38, 0x35, 0x97, 0xfa, 0xd8, 0x11, 0x93, 0xc4, 0xc1, 0xb1, 0x6e, 0x6a, + 0x90, 0xe2, 0xd5, 0x07, ], note_rseed: [ - 0x4b, 0xdb, 0x75, 0x07, 0x39, 0xde, 0x6c, 0x2c, 0x6e, 0x0f, 0x9e, 0xb7, 0xcb, 0x17, - 0xf1, 0x94, 0x2b, 0xfc, 0x9f, 0x4f, 0xd6, 0xeb, 0xb6, 0xb4, 0xcd, 0xd4, 0xda, 0x2b, - 0xca, 0x26, 0xfa, 0xc4, + 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, 0x00, 0xfb, + 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, 0xbf, 0xee, + 0x76, 0xaf, 0x61, 0x66, ], note_cmx: [ - 0x22, 0x0c, 0xf6, 0xb7, 0xbd, 0x7d, 0xf1, 0x1a, 0xeb, 0x46, 0xb8, 0xf6, 0x52, 0x19, - 0x71, 0xe4, 0xf5, 0xce, 0xc6, 0x0e, 0x2c, 0x3a, 0xd1, 0x9e, 0x3b, 0x3f, 0x40, 0x7e, - 0x69, 0x4b, 0xe8, 0x01, + 0x2e, 0xc3, 0xc2, 0x5f, 0xed, 0x4b, 0x55, 0xf2, 0x3a, 0xef, 0xd4, 0x2a, 0x69, 0x61, + 0x59, 0x72, 0x69, 0x87, 0x74, 0xe6, 0x6c, 0xe2, 0x7f, 0x1b, 0x25, 0x6a, 0xce, 0x16, + 0x51, 0x7f, 0xc0, 0x3c, ], note_nf: [ - 0x0d, 0x35, 0x9b, 0x02, 0xf6, 0x2d, 0x72, 0x18, 0xc8, 0x93, 0xd0, 0x4e, 0xc0, 0xed, - 0xd4, 0x89, 0xb2, 0x33, 0xa3, 0xc6, 0x60, 0x15, 0xaf, 0x93, 0x93, 0x0b, 0x23, 0x30, - 0x35, 0x82, 0x07, 0x3f, + 0xaf, 0x67, 0xf7, 0xdf, 0x55, 0x93, 0xc3, 0x90, 0x80, 0x60, 0xb0, 0x50, 0x35, 0x96, + 0xef, 0x32, 0x0b, 0xad, 0x21, 0x30, 0x20, 0xa8, 0x44, 0x7b, 0x69, 0x38, 0x81, 0xf2, + 0xfd, 0x35, 0x9f, 0x11, ], }, ] diff --git a/src/value.rs b/src/value.rs index f575e2d31..ae3862726 100644 --- a/src/value.rs +++ b/src/value.rs @@ -462,7 +462,7 @@ pub mod testing { #[cfg(test)] mod tests { - use crate::note::asset_base::testing::{arb_asset_id, native_asset_id}; + use crate::note::asset_base::testing::{arb_asset_base, native_asset_base}; use crate::note::AssetBase; use proptest::prelude::*; @@ -532,17 +532,17 @@ mod tests { fn bsk_consistent_with_bvk_native_with_zsa_transfer_and_burning( native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_id()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_base()), n_values) ) ), (asset_values, neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| (arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_id()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_base()), n_values) ), prop::collection::vec(arb_trapdoor(), n_values)) ), burn_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64) - .prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_id()), n_values)) + .prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_base()), n_values)) ) ) { check_binding_signature(&native_values, &[], &[], &[]); diff --git a/tests/zsa.rs b/tests/zsa.rs index dec5dcc1f..40b75f80c 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -58,7 +58,7 @@ fn prepare_keys() -> Keychain { let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); - let isk = IssuanceAuthorizingKey::from_bytes([0; 32]).unwrap(); + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); let ik = IssuanceValidatingKey::from(&isk); Keychain { pk, @@ -73,12 +73,11 @@ fn prepare_keys() -> Keychain { fn sign_issue_bundle( unauthorized: IssueBundle, - rng: OsRng, isk: &IssuanceAuthorizingKey, ) -> IssueBundle { let sighash = unauthorized.commitment().into(); let proven = unauthorized.prepare(sighash); - proven.sign(rng, isk).unwrap() + proven.sign(isk).unwrap() } fn build_and_sign_bundle( @@ -161,7 +160,7 @@ fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { ) .is_ok()); - let issue_bundle = sign_issue_bundle(unauthorized, rng, keys.isk()); + let issue_bundle = sign_issue_bundle(unauthorized, keys.isk()); // Take notes from first action let notes = issue_bundle.get_all_notes(); From f3d945997f13155bcf28257992079c85d8657583 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Wed, 24 Apr 2024 11:24:37 +0200 Subject: [PATCH 55/67] Fix compilation errors after the merge (there're still several complilation errors in tests) --- Cargo.lock | 807 ++++++++++++++++++-------------------- src/builder.rs | 166 ++++++-- src/circuit.rs | 19 +- src/issuance.rs | 22 +- src/keys.rs | 13 +- src/note.rs | 4 +- src/note/nullifier.rs | 2 +- src/note_encryption_v3.rs | 38 +- src/zip32.rs | 2 +- 9 files changed, 576 insertions(+), 497 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c13f09fe..e2e8971ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,9 +29,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -40,21 +40,22 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -82,9 +83,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "arrayref" @@ -111,15 +112,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -171,9 +172,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -229,21 +230,21 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cast" @@ -262,12 +263,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" @@ -301,23 +299,23 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.5", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -326,18 +324,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 1.8.2", + "half", ] [[package]] @@ -359,7 +357,7 @@ checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags 1.3.2", "clap_lex", - "indexmap", + "indexmap 1.9.3", "textwrap", ] @@ -372,15 +370,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -407,9 +396,9 @@ checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -417,9 +406,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" @@ -436,9 +425,9 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -468,18 +457,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -522,46 +511,37 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -633,7 +613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -753,9 +733,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "elliptic-curve" @@ -777,35 +757,30 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.3" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys", ] [[package]] name = "exr" -version = "1.7.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e481eb11a482815d3e9d618db8c42a93207134662873809335a92327440c18" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", - "half 2.2.1", + "half", "lebe", "miniz_oxide", "rayon-core", @@ -815,15 +790,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -853,9 +828,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -869,14 +844,10 @@ checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" [[package]] name = "flume" -version = "0.10.14" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", "spin 0.9.8", ] @@ -942,9 +913,9 @@ dependencies = [ [[package]] name = "freetype" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee38378a9e3db1cc693b4f88d166ae375338a0ff75cb8263e1c601d51f35dc6" +checksum = "efc8599a3078adf8edeb86c71e9f8fa7d88af5ca31e806a867756081f90f5d83" dependencies = [ "freetype-sys", "libc", @@ -952,11 +923,11 @@ dependencies = [ [[package]] name = "freetype-sys" -version = "0.13.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" +checksum = "66ee28c39a43d89fbed8b4798fb4ba56722cfd2b5af81f9326c27614ba88ecd5" dependencies = [ - "cmake", + "cc", "libc", "pkg-config", ] @@ -967,18 +938,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - [[package]] name = "generic-array" version = "0.14.7" @@ -992,22 +951,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] name = "gif" -version = "0.11.4" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" dependencies = [ "color_quant", "weezl", @@ -1015,9 +972,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -1025,9 +982,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "group" @@ -1041,12 +998,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - [[package]] name = "half" version = "2.2.1" @@ -1105,9 +1056,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hermit-abi" @@ -1120,9 +1071,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1141,16 +1092,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1170,31 +1121,32 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.4" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8e4fb07cf672b1642304e731ef8a6a4c7891d67bb4fd4f5ce58cd6ed86803c" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", - "gif 0.11.4", + "gif 0.13.1", "jpeg-decoder", - "num-rational", "num-traits", "png", - "scoped_threadpool", + "qoi", "tiff", ] [[package]] name = "incrementalmerkletree" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361c467824d4d9d4f284be4b2608800839419dccc4d4608f28345237fe354623" +checksum = "eb1872810fb725b06b8c153dde9e86f3ec26747b9b60096da7a869883b549cbe" dependencies = [ "either", "proptest", + "rand", + "rand_core", ] [[package]] @@ -1207,22 +1159,31 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "inferno" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e66fa9bb3c52f40d05c11b78919ff2f18993c2305bd8a62556d20cb3e9606f" +checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" dependencies = [ "ahash", - "atty", "crossbeam-channel", "crossbeam-utils", "dashmap", - "indexmap", + "indexmap 2.2.6", + "is-terminal", "itoa", "log", "num-format", - "num_cpus", "once_cell", "quick-xml", "rgb", @@ -1238,6 +1199,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1249,24 +1221,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jpeg-decoder" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1316,37 +1288,47 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-sys", + "windows-targets 0.52.5", ] [[package]] name = "libm" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1354,9 +1336,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "maybe-rayon" @@ -1370,9 +1352,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.3" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap2" @@ -1383,15 +1365,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "memuse" version = "0.2.1" @@ -1403,23 +1376,14 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", "simd-adler32", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "nix" version = "0.26.4" @@ -1460,50 +1424,28 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -1522,9 +1464,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "orchard" @@ -1564,9 +1506,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "parking_lot" @@ -1580,15 +1522,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1618,49 +1560,18 @@ dependencies = [ [[package]] name = "pathfinder_simd" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff" +checksum = "ebf45976c56919841273f2a0fc684c28437e2f304e264557d9c72be5d5a718be" dependencies = [ "rustc_version", ] -[[package]] -name = "pest" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pkcs8" @@ -1674,9 +1585,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" @@ -1726,9 +1637,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.10" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1778,33 +1689,42 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.5.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax", "rusty-fork", "tempfile", "unarray", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1822,9 +1742,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1876,9 +1796,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1886,14 +1806,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -1916,67 +1834,52 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.5" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.7.5", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rfc6979" @@ -1990,9 +1893,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.36" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" dependencies = [ "bytemuck", ] @@ -2005,20 +1908,20 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.11" +version = "0.38.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" +checksum = "e3cc72858054fcff6d7dea32df2aeaee6a7c24227366d7ea429aada2f26b16ad" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -2039,9 +1942,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -2052,12 +1955,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" version = "1.2.0" @@ -2080,47 +1977,35 @@ dependencies = [ [[package]] name = "semver" -version = "0.11.0" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -2156,9 +2041,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spin" @@ -2251,9 +2136,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.31" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -2279,48 +2164,47 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", "rustix", "windows-sys", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "tiff" -version = "0.7.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f71e422515e83e3ab8a03d4781d05ebf864fc61f4546e6ecffa58cbd34181a0" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -2339,11 +2223,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2351,20 +2234,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -2377,15 +2260,9 @@ checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" [[package]] name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.6" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uint" @@ -2407,9 +2284,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -2423,9 +2300,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" [[package]] name = "version_check" @@ -2444,9 +2321,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -2460,9 +2337,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2470,24 +2347,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2495,28 +2372,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -2524,9 +2401,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "winapi" @@ -2546,9 +2423,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -2560,21 +2437,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.5", ] [[package]] @@ -2583,13 +2460,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -2598,42 +2491,90 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + [[package]] name = "wio" version = "0.2.2" @@ -2667,7 +2608,7 @@ dependencies = [ [[package]] name = "zcash_note_encryption" version = "0.4.0" -source = "git+https://github.com/QED-it/zcash_note_encryption?branch=zsa1#e14dab6945177815f2b13fbee9c61e12caa96e5a" +source = "git+https://github.com/QED-it/zcash_note_encryption?branch=zsa1#8b6b31dcea4a883a606425c4b644fca213e78b3b" dependencies = [ "chacha20", "chacha20poly1305", @@ -2685,6 +2626,26 @@ dependencies = [ "blake2b_simd", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "zeroize" version = "1.7.0" @@ -2702,14 +2663,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "zip32" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d724a63be4dfb50b7f3617e542984e22e4b4a5b8ca5de91f55613152885e6b22" +checksum = "4226d0aee9c9407c27064dfeec9d7b281c917de3374e1e5a2e2cfad9e09de19e" dependencies = [ "blake2b_simd", "memuse", diff --git a/src/builder.rs b/src/builder.rs index 44db4fec7..b5bf6031b 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -10,7 +10,6 @@ use nonempty::NonEmpty; use pasta_curves::pallas; use rand::{prelude::SliceRandom, CryptoRng, RngCore}; -use crate::note::AssetBase; use crate::{ action::Action, address::Address, @@ -20,7 +19,7 @@ use crate::{ FullViewingKey, OutgoingViewingKey, Scope, SpendAuthorizingKey, SpendValidatingKey, SpendingKey, }, - note::{Note, Rho, TransmittedNoteCiphertext}, + note::{AssetBase, Note, Rho, TransmittedNoteCiphertext}, note_encryption_v3::OrchardNoteEncryption, primitives::redpallas::{self, Binding, SpendAuth}, tree::{Anchor, MerklePath}, @@ -54,7 +53,7 @@ impl BundleType { bundle_required: false, }; - // FIXME: add doc + /// FIXME: add doc pub const DEFAULT_ZSA: BundleType = BundleType::Transactional { flags: Flags::ENABLED_ZSA, bundle_required: false, @@ -67,6 +66,12 @@ impl BundleType { bundle_required: false, }; + /// FIXME: add doc + pub const ZSA_DISABLED: BundleType = BundleType::Transactional { + flags: Flags::from_parts(true, true, false), + bundle_required: false, + }; + /// Returns the number of logical actions that builder will produce in constructing a bundle /// of this type, given the specified numbers of spends and outputs. /// @@ -299,7 +304,7 @@ impl SpendInfo { } /// Information about a specific output to receive funds in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct OutputInfo { ovk: Option, recipient: Address, @@ -532,7 +537,7 @@ impl Builder { return Err(SpendError::SpendsDisabled); } - let spend = SpendInfo::new(fvk, note, merkle_path).ok_or(SpendError::FvkMismatch)?; + let spend = SpendInfo::new(fvk, note, merkle_path, false).ok_or(SpendError::FvkMismatch)?; // Consistency check: all anchors must be equal. if !spend.has_matching_anchor(&self.anchor) { @@ -621,7 +626,7 @@ impl Builder { /// /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. - pub fn build>( + pub fn build + TryFrom>( self, rng: impl RngCore, ) -> Result, BundleMetadata)>, BuildError> { @@ -631,20 +636,85 @@ impl Builder { self.bundle_type, self.spends, self.outputs, + self.burn, ) } } +/// Partition a list of spends and recipients by note types. +/// Method creates single dummy ZEC note if spends and recipients are both empty. +fn partition_by_asset( + spends: &[SpendInfo], + outputs: &[OutputInfo], + rng: &mut impl RngCore, +) -> HashMap< + AssetBase, + ( + Vec<(Option, SpendInfo)>, + Vec<(Option, OutputInfo)>, + ), +> { + let mut hm: HashMap< + AssetBase, + ( + Vec<(Option, SpendInfo)>, + Vec<(Option, OutputInfo)>, + ), + > = HashMap::new(); + + for (i, s) in spends.into_iter().enumerate() { + hm.entry(s.note.asset()) + .or_insert((vec![], vec![])) + .0 + .push((Some(i), s.clone())); + } + + for (i, o) in outputs.into_iter().enumerate() { + hm.entry(o.asset) + .or_insert((vec![], vec![])) + .1 + .push((Some(i), o.clone())); + } + + if hm.is_empty() { + let dummy_spend = SpendInfo::dummy(AssetBase::native(), rng); + hm.insert( + dummy_spend.note.asset(), + (vec![(None, dummy_spend)], vec![]), + ); + } + + hm +} + +/// Returns a dummy/split notes to extend the spends. +fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) -> SpendInfo { + if asset.is_native().into() { + // For native asset, extends with dummy notes + SpendInfo::dummy(asset, &mut rng) + } else { + // For ZSA asset, extends with + // - dummy notes if first spend is empty + // - split notes otherwise. + let dummy = SpendInfo::dummy(asset, &mut rng); + spend.map_or_else(|| dummy, |s| s.create_split_spend(&mut rng)) + } +} + +// FIXME: the order of the arguments doesn't correspond the order of the fields of the Builder +// struct - is that okay? + /// Builds a bundle containing the given spent notes and outputs. /// /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. -pub fn bundle>( +pub fn bundle + TryFrom>( mut rng: impl RngCore, anchor: Anchor, bundle_type: BundleType, spends: Vec, outputs: Vec, + burn: HashMap, ) -> Result, BundleMetadata)>, BuildError> { let flags = bundle_type.flags(); @@ -670,39 +740,51 @@ pub fn bundle>( // Pair up the spends and outputs, extending with dummy values as necessary. let (pre_actions, bundle_meta) = { - let mut indexed_spends = spends - .into_iter() - .chain(iter::repeat_with(|| SpendInfo::dummy(&mut rng))) - .enumerate() - .take(num_actions) - .collect::>(); + let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); - let mut indexed_outputs = outputs + let pre_actions = partition_by_asset(&spends, &outputs, &mut rng) .into_iter() - .chain(iter::repeat_with(|| OutputInfo::dummy(&mut rng))) - .enumerate() - .take(num_actions) - .collect::>(); - - // Shuffle the spends and outputs, so that learning the position of a - // specific spent note or output note doesn't reveal anything on its own about - // the meaning of that note in the transaction context. - indexed_spends.shuffle(&mut rng); - indexed_outputs.shuffle(&mut rng); - - let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); - let pre_actions = indexed_spends + .flat_map(|(asset, (spends, outputs))| { + let first_spend = spends.first().map(|(_, s)| s).cloned(); + + let mut indexed_spends = spends + .into_iter() + .chain(iter::repeat_with(|| { + (None, pad_spend(first_spend.as_ref(), asset, &mut rng)) + })) + .take(num_actions) + .collect::>(); + + let mut indexed_outputs = outputs + .into_iter() + .chain(iter::repeat_with(|| { + (None, OutputInfo::dummy(&mut rng, asset)) + })) + .take(num_actions) + .collect::>(); + + // Shuffle the spends and outputs, so that learning the position of a + // specific spent note or output note doesn't reveal anything on its own about + // the meaning of that note in the transaction context. + indexed_spends.shuffle(&mut rng); + indexed_outputs.shuffle(&mut rng); + + indexed_spends.into_iter().zip(indexed_outputs.into_iter()) + }) + // FIXME: this collect is used to release the borrow of rng + // - try to find another way to do that, as there's the second + // collect below - two collects don't look good + .collect::>() .into_iter() - .zip(indexed_outputs.into_iter()) .enumerate() .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { // Record the post-randomization spend location - if spend_idx < num_requested_spends { + if let Some(spend_idx) = spend_idx { bundle_meta.spend_indices[spend_idx] = action_idx; } // Record the post-randomization output location - if out_idx < num_requested_outputs { + if let Some(out_idx) = out_idx { bundle_meta.output_indices[out_idx] = action_idx; } @@ -736,18 +818,18 @@ pub fn bundle>( let (actions, circuits): (Vec<_>, Vec<_>) = pre_actions.into_iter().map(|a| a.build(&mut rng)).unzip(); - // Verify that bsk and bvk are consistent. - let bvk = (actions.iter().map(|a| a.cv_net()).sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) - .into_bvk(); - assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + let burn = burn + .into_iter() + .map(|(asset, value)| Ok((asset, value.into()?))) + .collect::>()?; - Ok(NonEmpty::from_vec(actions).map(|actions| { + let bundle = NonEmpty::from_vec(actions).map(|actions| { ( Bundle::from_parts( actions, flags, result_value_balance, + burn, anchor, InProgress { proof: Unproven { circuits }, @@ -756,7 +838,17 @@ pub fn bundle>( ), bundle_meta, ) - })) + }); + + // Verify that bsk and bvk are consistent. + if let Some((bundle, _)) = &bundle { + assert_eq!( + redpallas::VerificationKey::from(&bundle.authorization().sigs.bsk), + bundle.binding_validating_key() + ) + } + + Ok(bundle) } /// Marker trait representing bundle signatures in the process of being created. diff --git a/src/circuit.rs b/src/circuit.rs index 5473fef41..0baf1bdc3 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1210,12 +1210,17 @@ mod tests { let nk = *fvk.nk(); let rivk = fvk.rivk(fvk.scope_for_address(&spent_note.recipient()).unwrap()); let nf_old = spent_note.nullifier(&fvk); - let rho = Rho::from_nf_old(nf_old); + // FIXME: why it became unused? + //let rho = Rho::from_nf_old(nf_old); let ak: SpendValidatingKey = fvk.into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), AssetBase::native()); + let (_, _, output_note) = Note::dummy( + &mut rng, + Some(Rho::from_nf_old(nf_old)), + AssetBase::native(), + ); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); @@ -1495,7 +1500,7 @@ mod tests { let sk = SpendingKey::random(&mut rng); let fvk: FullViewingKey = (&sk).into(); let sender_address = fvk.address_at(0u32, Scope::External); - let rho_old = Nullifier::dummy(&mut rng); + let rho_old = Rho::from_nf_old(Nullifier::dummy(&mut rng)); let note = Note::new( sender_address, NoteValue::from_raw(40), @@ -1539,7 +1544,13 @@ mod tests { let fvk: FullViewingKey = (&sk).into(); let sender_address = fvk.address_at(0u32, Scope::External); - Note::new(sender_address, output_value, asset_base, nf_old, &mut rng) + Note::new( + sender_address, + output_value, + asset_base, + Rho::from_nf_old(nf_old), + &mut rng, + ) }; let cmx = output_note.commitment().into(); diff --git a/src/issuance.rs b/src/issuance.rs index f2eec90c6..4fade4b74 100644 --- a/src/issuance.rs +++ b/src/issuance.rs @@ -15,7 +15,7 @@ use crate::issuance::Error::{ }; use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; use crate::note::asset_base::is_asset_desc_of_valid_size; -use crate::note::{AssetBase, Nullifier}; +use crate::note::{AssetBase, Nullifier, Rho}; use crate::value::{NoteValue, ValueSum}; use crate::{Address, Note}; @@ -287,7 +287,7 @@ impl IssueBundle { issue_info.recipient, issue_info.value, asset, - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -335,7 +335,7 @@ impl IssueBundle { recipient, value, asset, - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -597,7 +597,7 @@ mod tests { use crate::keys::{ FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, }; - use crate::note::{AssetBase, Nullifier}; + use crate::note::{AssetBase, Nullifier, Rho}; use crate::value::{NoteValue, ValueSum}; use crate::{Address, Note}; use group::{Group, GroupEncoding}; @@ -644,7 +644,7 @@ mod tests { recipient, NoteValue::from_raw(note1_value), asset, - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -652,7 +652,7 @@ mod tests { recipient, NoteValue::from_raw(note2_value), note2_asset, - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -679,7 +679,7 @@ mod tests { recipient, NoteValue::from_raw(note1_value), identity_point(), - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -687,7 +687,7 @@ mod tests { recipient, NoteValue::from_raw(note2_value), identity_point(), - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -963,7 +963,7 @@ mod tests { recipient, NoteValue::from_raw(5), AssetBase::derive(bundle.ik(), "zsa_asset"), - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); bundle.actions.first_mut().notes.push(note); @@ -1226,7 +1226,7 @@ mod tests { recipient, NoteValue::from_raw(5), AssetBase::derive(signed.ik(), "zsa_asset"), - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); @@ -1267,7 +1267,7 @@ mod tests { recipient, NoteValue::from_raw(55), AssetBase::derive(&incorrect_ik, asset_description), - Nullifier::dummy(&mut rng), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), &mut rng, ); diff --git a/src/keys.rs b/src/keys.rs index 3777e915d..eddd4dcc4 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,6 +1,5 @@ //! Key structures for Orchard. -use core::mem; use std::{ fmt::{Debug, Formatter}, io::{self, Read, Write}, @@ -26,7 +25,7 @@ use pasta_curves::{pallas, pallas::Scalar}; use rand::{rngs::OsRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zcash_note_encryption_zsa::EphemeralKeyBytes; -use zip32::{AccountId, ChildIndex}; +//use zip32::{AccountId, ChildIndex}; use crate::{ address::Address, @@ -37,12 +36,12 @@ use crate::{ PreparedNonIdentityBase, PreparedNonZeroScalar, PrfExpand, }, zip32::{ - self, ChildIndex, ExtendedSpendingKey, ZIP32_ORCHARD_PERSONALIZATION, + self, ExtendedSpendingKey, ZIP32_ORCHARD_PERSONALIZATION, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE, }, }; -pub use zip32::{DiversifierIndex, Scope}; +pub use ::zip32::{AccountId, ChildIndex, DiversifierIndex, Scope}; const KDF_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_OrchardKDF"; const ZIP32_PURPOSE: u32 = 32; @@ -278,9 +277,9 @@ impl IssuanceAuthorizingKey { ) -> Result { // Call zip32 logic let path = &[ - ChildIndex::try_from(ZIP32_PURPOSE_FOR_ISSUANCE)?, - ChildIndex::try_from(coin_type)?, - ChildIndex::try_from(account)?, + ChildIndex::hardened(ZIP32_PURPOSE_FOR_ISSUANCE), + ChildIndex::hardened(coin_type), + ChildIndex::hardened(account), ]; // we are reusing zip32 logic for deriving the key, zip32 should be updated as discussed diff --git a/src/note.rs b/src/note.rs index f79015e7a..bc036dfa2 100644 --- a/src/note.rs +++ b/src/note.rs @@ -416,7 +416,7 @@ pub mod testing { pub fn arb_native_note()( recipient in arb_address(), value in arb_note_value(), - rho in arb_nullifier(), + rho in arb_nullifier().prop_map(Rho::from_nf_old), rseed in arb_rseed(), ) -> Note { Note { @@ -435,7 +435,7 @@ pub mod testing { pub fn arb_zsa_note(asset: AssetBase)( recipient in arb_address(), value in arb_note_value(), - rho in arb_nullifier(), + rho in arb_nullifier().prop_map(Rho::from_nf_old), rseed in arb_rseed(), ) -> Note { Note { diff --git a/src/note/nullifier.rs b/src/note/nullifier.rs index 0c81f7bea..6c41a87a2 100644 --- a/src/note/nullifier.rs +++ b/src/note/nullifier.rs @@ -3,7 +3,7 @@ use halo2_proofs::arithmetic::CurveExt; use memuse::DynamicUsage; use pasta_curves::pallas; use rand::RngCore; -use subtle::{Choice, ConstantTimeEq, CtOption}; +use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use super::NoteCommitment; use crate::{ diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs index ceff0cbe2..8fb68dbd0 100644 --- a/src/note_encryption_v3.rs +++ b/src/note_encryption_v3.rs @@ -15,7 +15,7 @@ use crate::{ DiversifiedTransmissionKey, Diversifier, EphemeralPublicKey, EphemeralSecretKey, OutgoingViewingKey, PreparedEphemeralPublicKey, PreparedIncomingViewingKey, SharedSecret, }, - note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, + note::{ExtractedNoteCommitment, Nullifier, RandomSeed, Rho}, value::{NoteValue, ValueCommitment}, Address, Note, }; @@ -75,6 +75,18 @@ impl AsRef<[u8]> for NoteCiphertextBytes { } } +impl AsMut<[u8]> for NoteCiphertextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<(&[u8], &[u8])> for NoteCiphertextBytes { + fn from(s: (&[u8], &[u8])) -> Self { + Self([s.0, s.1].concat().try_into().unwrap()) + } +} + impl From<&[u8]> for NoteCiphertextBytes { fn from(s: &[u8]) -> Self where @@ -177,20 +189,18 @@ where /// Orchard-specific note encryption logic. #[derive(Debug)] pub struct OrchardDomainV3 { - rho: Nullifier, + rho: Rho, } impl OrchardDomainV3 { /// Constructs a domain that can be used to trial-decrypt this action's output note. pub fn for_action(act: &Action) -> Self { - OrchardDomainV3 { - rho: *act.nullifier(), - } + Self { rho: act.rho() } } - /// Constructs a domain from a nullifier. - pub fn for_nullifier(nullifier: Nullifier) -> Self { - OrchardDomainV3 { rho: nullifier } + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_compact_action(act: &CompactAction) -> Self { + Self { rho: act.rho() } } } @@ -443,6 +453,11 @@ impl CompactAction { pub fn nullifier(&self) -> Nullifier { self.nullifier } + + /// Obtains the [`Rho`] value that was used to construct the new note being created. + pub fn rho(&self) -> Rho { + Rho::from_nf_old(self.nullifier) + } } #[cfg(test)] @@ -465,7 +480,7 @@ mod tests { OutgoingViewingKey, PreparedIncomingViewingKey, }, note::{ - testing::arb_note, AssetBase, ExtractedNoteCommitment, Nullifier, RandomSeed, + testing::arb_note, AssetBase, ExtractedNoteCommitment, Nullifier, RandomSeed, Rho, TransmittedNoteCiphertext, }, primitives::redpallas, @@ -522,7 +537,8 @@ mod tests { // Received Action let cv_net = ValueCommitment::from_bytes(&tv.cv_net).unwrap(); - let rho = Nullifier::from_bytes(&tv.rho).unwrap(); + let nf_old = Nullifier::from_bytes(&tv.rho).unwrap(); + let rho = Rho::from_nf_old(nf_old); let cmx = ExtractedNoteCommitment::from_bytes(&tv.cmx).unwrap(); let esk = EphemeralSecretKey::from_bytes(&tv.esk).unwrap(); @@ -554,7 +570,7 @@ mod tests { let action = Action::from_parts( // rho is the nullifier in the receiving Action. - rho, + nf_old, // We don't need a valid rk for this test. redpallas::VerificationKey::dummy(), cmx, diff --git a/src/zip32.rs b/src/zip32.rs index 6636ca69d..2a036ec9b 100644 --- a/src/zip32.rs +++ b/src/zip32.rs @@ -280,7 +280,7 @@ mod tests { assert!(bool::from( ExtendedSpendingKey::from_path( &seed, - &[ChildIndex::hardened(5), ChildIndex::hardened(7)] + &[ChildIndex::hardened(5), ChildIndex::hardened(7)], ZIP32_ORCHARD_PERSONALIZATION ) .unwrap() From 0f56f526b7dde6d16a5861feb9af0b2fa0707ec3 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 25 Apr 2024 09:07:21 +0200 Subject: [PATCH 56/67] Fix compilation errors in tests --- src/builder.rs | 105 ++++++++++++++++++++++--------------------------- tests/zsa.rs | 15 ++++--- 2 files changed, 54 insertions(+), 66 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index b5bf6031b..9d1232708 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -643,45 +643,31 @@ impl Builder { /// Partition a list of spends and recipients by note types. /// Method creates single dummy ZEC note if spends and recipients are both empty. +#[allow(clippy::type_complexity)] fn partition_by_asset( spends: &[SpendInfo], outputs: &[OutputInfo], rng: &mut impl RngCore, -) -> HashMap< - AssetBase, - ( - Vec<(Option, SpendInfo)>, - Vec<(Option, OutputInfo)>, - ), -> { - let mut hm: HashMap< - AssetBase, - ( - Vec<(Option, SpendInfo)>, - Vec<(Option, OutputInfo)>, - ), - > = HashMap::new(); +) -> HashMap, Vec<(usize, OutputInfo)>)> { + let mut hm = HashMap::new(); - for (i, s) in spends.into_iter().enumerate() { + for (i, s) in spends.iter().enumerate() { hm.entry(s.note.asset()) .or_insert((vec![], vec![])) .0 - .push((Some(i), s.clone())); + .push((i, s.clone())); } - for (i, o) in outputs.into_iter().enumerate() { + for (i, o) in outputs.iter().enumerate() { hm.entry(o.asset) .or_insert((vec![], vec![])) .1 - .push((Some(i), o.clone())); + .push((i, o.clone())); } if hm.is_empty() { let dummy_spend = SpendInfo::dummy(AssetBase::native(), rng); - hm.insert( - dummy_spend.note.asset(), - (vec![(None, dummy_spend)], vec![]), - ); + hm.insert(dummy_spend.note.asset(), (vec![(0, dummy_spend)], vec![])); } hm @@ -739,52 +725,55 @@ pub fn bundle + TryFrom>( .map_err(|_| BuildError::BundleTypeNotSatisfiable)?; // Pair up the spends and outputs, extending with dummy values as necessary. + // FIXME: cargo clippy suggests to avoid using collect for spends + // but the direct fix causes compilation error (bacause of rbg borrowing) + #[allow(clippy::needless_collect)] let (pre_actions, bundle_meta) = { - let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); + let (mut indexed_spends, mut indexed_outputs): (Vec<_>, Vec<_>) = + partition_by_asset(&spends, &outputs, &mut rng) + .into_iter() + .flat_map(|(asset, (spends, outputs))| { + let first_spend = spends.first().map(|(_, s)| s.clone()); + + let indexed_spends = spends + .into_iter() + .chain(iter::repeat_with(|| { + (0, pad_spend(first_spend.as_ref(), asset, &mut rng)) + })) + .take(num_actions) + .collect::>(); + + let indexed_outputs = outputs + .into_iter() + .chain(iter::repeat_with(|| { + (0, OutputInfo::dummy(&mut rng, asset)) + })) + .take(num_actions) + .collect::>(); + + indexed_spends.into_iter().zip(indexed_outputs) + }) + .unzip(); - let pre_actions = partition_by_asset(&spends, &outputs, &mut rng) - .into_iter() - .flat_map(|(asset, (spends, outputs))| { - let first_spend = spends.first().map(|(_, s)| s).cloned(); - - let mut indexed_spends = spends - .into_iter() - .chain(iter::repeat_with(|| { - (None, pad_spend(first_spend.as_ref(), asset, &mut rng)) - })) - .take(num_actions) - .collect::>(); - - let mut indexed_outputs = outputs - .into_iter() - .chain(iter::repeat_with(|| { - (None, OutputInfo::dummy(&mut rng, asset)) - })) - .take(num_actions) - .collect::>(); - - // Shuffle the spends and outputs, so that learning the position of a - // specific spent note or output note doesn't reveal anything on its own about - // the meaning of that note in the transaction context. - indexed_spends.shuffle(&mut rng); - indexed_outputs.shuffle(&mut rng); - - indexed_spends.into_iter().zip(indexed_outputs.into_iter()) - }) - // FIXME: this collect is used to release the borrow of rng - // - try to find another way to do that, as there's the second - // collect below - two collects don't look good - .collect::>() + // Shuffle the spends and outputs, so that learning the position of a + // specific spent note or output note doesn't reveal anything on its own about + // the meaning of that note in the transaction context. + indexed_spends.shuffle(&mut rng); + indexed_outputs.shuffle(&mut rng); + + let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); + let pre_actions = indexed_spends .into_iter() + .zip(indexed_outputs.into_iter()) .enumerate() .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { // Record the post-randomization spend location - if let Some(spend_idx) = spend_idx { + if spend_idx < num_requested_spends { bundle_meta.spend_indices[spend_idx] = action_idx; } // Record the post-randomization output location - if let Some(out_idx) = out_idx { + if out_idx < num_requested_outputs { bundle_meta.output_indices[out_idx] = action_idx; } diff --git a/tests/zsa.rs b/tests/zsa.rs index 40b75f80c..4d6826b08 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -10,8 +10,7 @@ use orchard::note::{AssetBase, ExtractedNoteCommitment}; use orchard::note_encryption_v3::OrchardDomainV3; use orchard::tree::{MerkleHashOrchard, MerklePath}; use orchard::{ - builder::Builder, - bundle::Flags, + builder::{Builder, BundleType}, circuit::{ProvingKey, VerifyingKey}, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, value::NoteValue, @@ -86,7 +85,7 @@ fn build_and_sign_bundle( pk: &ProvingKey, sk: &SpendingKey, ) -> Bundle { - let unauthorized = builder.build(&mut rng).unwrap(); + let unauthorized = builder.build(&mut rng).unwrap().unwrap().0; let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(pk, &mut rng).unwrap(); proven @@ -184,9 +183,9 @@ fn create_native_note(keys: &Keychain) -> Note { // Use the empty tree. let anchor = MerkleHashOrchard::empty_root(32.into()).into(); - let mut builder = Builder::new(Flags::from_parts(false, true, false), anchor); + let mut builder = Builder::new(BundleType::Coinbase, anchor); assert_eq!( - builder.add_recipient( + builder.add_output( None, keys.recipient, NoteValue::from_raw(100), @@ -195,7 +194,7 @@ fn create_native_note(keys: &Keychain) -> Note { ), Ok(()) ); - let unauthorized = builder.build(&mut rng).unwrap(); + let unauthorized = builder.build(&mut rng).unwrap().unwrap().0; let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(keys.pk(), &mut rng).unwrap(); proven.apply_signatures(rng, sighash, &[]).unwrap() @@ -239,7 +238,7 @@ fn build_and_verify_bundle( ) -> Result<(), String> { let rng = OsRng; let shielded_bundle: Bundle<_, i64> = { - let mut builder = Builder::new(Flags::from_parts(true, true, true), anchor); + let mut builder = Builder::new(BundleType::DEFAULT_ZSA, anchor); spends .iter() @@ -250,7 +249,7 @@ fn build_and_verify_bundle( outputs .iter() .try_for_each(|output| { - builder.add_recipient(None, keys.recipient, output.value, output.asset, None) + builder.add_output(None, keys.recipient, output.value, output.asset, None) }) .map_err(|err| err.to_string())?; assets_to_burn From 149827dd6ffa269e9813279600bd42cca026d7d5 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 25 Apr 2024 10:51:59 +0200 Subject: [PATCH 57/67] Fix cargo doc issues --- src/note.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/note.rs b/src/note.rs index bc036dfa2..f5b8d30a0 100644 --- a/src/note.rs +++ b/src/note.rs @@ -36,7 +36,7 @@ impl Rho { /// value otherwise. /// /// [`Action::rho`]: crate::action::Action::rho - /// [`CompactAction::rho`]: crate::note_encryption::CompactAction::rho + /// [`CompactAction::rho`]: crate::note_encryption_v3::CompactAction::rho pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { pallas::Base::from_repr(*bytes).map(Rho) } From c8c84aa02f123c7e86295c10f005f41a2ec13876 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 29 Apr 2024 10:40:27 +0200 Subject: [PATCH 58/67] Fix Builder::bundle function to pass unit tests from tests folder correctly --- src/builder.rs | 194 ++++++++++++++++++++++++------------------------- 1 file changed, 95 insertions(+), 99 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 9d1232708..3e2b8c972 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -667,7 +667,10 @@ fn partition_by_asset( if hm.is_empty() { let dummy_spend = SpendInfo::dummy(AssetBase::native(), rng); - hm.insert(dummy_spend.note.asset(), (vec![(0, dummy_spend)], vec![])); + hm.insert( + dummy_spend.note.asset(), + (vec![(usize::MAX, dummy_spend)], vec![]), + ); } hm @@ -720,81 +723,86 @@ pub fn bundle + TryFrom>( return Err(BuildError::OutputsDisabled); } - let num_actions = bundle_type - .num_actions(num_requested_spends, num_requested_outputs) - .map_err(|_| BuildError::BundleTypeNotSatisfiable)?; + // The number of actions to add to this bundle in order to contain at least MIN_ACTION actions. + let num_missing_actions = MIN_ACTIONS.saturating_sub(spends.len().max(outputs.len())); // Pair up the spends and outputs, extending with dummy values as necessary. - // FIXME: cargo clippy suggests to avoid using collect for spends - // but the direct fix causes compilation error (bacause of rbg borrowing) - #[allow(clippy::needless_collect)] - let (pre_actions, bundle_meta) = { - let (mut indexed_spends, mut indexed_outputs): (Vec<_>, Vec<_>) = - partition_by_asset(&spends, &outputs, &mut rng) - .into_iter() - .flat_map(|(asset, (spends, outputs))| { - let first_spend = spends.first().map(|(_, s)| s.clone()); - - let indexed_spends = spends - .into_iter() - .chain(iter::repeat_with(|| { - (0, pad_spend(first_spend.as_ref(), asset, &mut rng)) - })) - .take(num_actions) - .collect::>(); - - let indexed_outputs = outputs - .into_iter() - .chain(iter::repeat_with(|| { - (0, OutputInfo::dummy(&mut rng, asset)) - })) - .take(num_actions) - .collect::>(); - - indexed_spends.into_iter().zip(indexed_outputs) - }) - .unzip(); - - // Shuffle the spends and outputs, so that learning the position of a - // specific spent note or output note doesn't reveal anything on its own about - // the meaning of that note in the transaction context. - indexed_spends.shuffle(&mut rng); - indexed_outputs.shuffle(&mut rng); - - let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); - let pre_actions = indexed_spends - .into_iter() - .zip(indexed_outputs.into_iter()) - .enumerate() - .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { - // Record the post-randomization spend location - if spend_idx < num_requested_spends { - bundle_meta.spend_indices[spend_idx] = action_idx; - } - - // Record the post-randomization output location - if out_idx < num_requested_outputs { - bundle_meta.output_indices[out_idx] = action_idx; - } - - ActionInfo::new(spend, output, &mut rng) - }) - .collect::>(); - - (pre_actions, bundle_meta) - }; + let (pre_actions, bundle_meta, _) = partition_by_asset(&spends, &outputs, &mut rng) + .into_iter() + .fold( + ( + Vec::new(), + BundleMetadata::new(num_requested_spends, num_requested_outputs), + // We might have to add dummy/split actions only for the first asset to reach MIN_ACTIONS. + num_missing_actions, + ), + |(mut pre_actions, mut bundle_meta, num_missing_actions), + (asset, (spends, outputs))| { + let num_actions = spends.len().max(outputs.len()) + num_missing_actions; + + let first_spend = spends.first().map(|(_, s)| s.clone()); + + let mut indexed_spends = spends + .into_iter() + .chain(iter::repeat_with(|| { + (usize::MAX, pad_spend(first_spend.as_ref(), asset, &mut rng)) + })) + .take(num_actions) + .collect::>(); + + let mut indexed_outputs = outputs + .into_iter() + .chain(iter::repeat_with(|| { + (usize::MAX, OutputInfo::dummy(&mut rng, asset)) + })) + .take(num_actions) + .collect::>(); + + // Shuffle the spends and outputs, so that learning the position of a + // specific spent note or output note doesn't reveal anything on its own about + // the meaning of that note in the transaction context. + indexed_spends.shuffle(&mut rng); + indexed_outputs.shuffle(&mut rng); + + assert_eq!(indexed_spends.len(), indexed_outputs.len()); + + let pre_actions_len = pre_actions.len(); + + let new_actions = indexed_spends + .into_iter() + .zip(indexed_outputs.into_iter()) + .enumerate() + .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { + let action_idx = action_idx + pre_actions_len; + + // Record the post-randomization spend location + if spend_idx < num_requested_spends { + bundle_meta.spend_indices[spend_idx] = action_idx; + } + + // Record the post-randomization output location + if out_idx < num_requested_outputs { + bundle_meta.output_indices[out_idx] = action_idx; + } + + ActionInfo::new(spend, output, &mut rng) + }); + + pre_actions.extend(new_actions); + + (pre_actions, bundle_meta, 0) + }, + ); // Determine the value balance for this bundle, ensuring it is valid. - let value_balance = pre_actions + let native_value_balance: V = pre_actions .iter() + .filter(|action| action.spend.note.asset().is_native().into()) .fold(Some(ValueSum::zero()), |acc, action| { acc? + action.value_sum() }) - .ok_or(OverflowError)?; - - let result_value_balance: V = i64::try_from(value_balance) - .map_err(BuildError::ValueSum) - .and_then(|i| V::try_from(i).map_err(|_| BuildError::ValueSum(value::OverflowError)))?; + .ok_or(OverflowError)? + .into()?; // Compute the transaction binding signing key. let bsk = pre_actions @@ -807,37 +815,25 @@ pub fn bundle + TryFrom>( let (actions, circuits): (Vec<_>, Vec<_>) = pre_actions.into_iter().map(|a| a.build(&mut rng)).unzip(); - let burn = burn - .into_iter() - .map(|(asset, value)| Ok((asset, value.into()?))) - .collect::>()?; - - let bundle = NonEmpty::from_vec(actions).map(|actions| { - ( - Bundle::from_parts( - actions, - flags, - result_value_balance, - burn, - anchor, - InProgress { - proof: Unproven { circuits }, - sigs: Unauthorized { bsk }, - }, - ), - bundle_meta, - ) - }); - - // Verify that bsk and bvk are consistent. - if let Some((bundle, _)) = &bundle { - assert_eq!( - redpallas::VerificationKey::from(&bundle.authorization().sigs.bsk), - bundle.binding_validating_key() - ) - } - - Ok(bundle) + let bundle = Bundle::from_parts( + NonEmpty::from_vec(actions).unwrap(), + flags, + native_value_balance, + burn.into_iter() + .map(|(asset, value)| Ok((asset, value.into()?))) + .collect::>()?, + anchor, + InProgress { + proof: Unproven { circuits }, + sigs: Unauthorized { bsk }, + }, + ); + + assert_eq!( + redpallas::VerificationKey::from(&bundle.authorization().sigs.bsk), + bundle.binding_validating_key() + ); + Ok(Some((bundle, bundle_meta))) } /// Marker trait representing bundle signatures in the process of being created. From ac371f0ce29385c771e95b3a5c6f2847375dfd00 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 30 Apr 2024 09:19:26 +0200 Subject: [PATCH 59/67] Fix several comments, rename some flag constants --- src/builder.rs | 30 ++++++++++++----------------- src/bundle.rs | 10 ++++------ src/circuit.rs | 2 -- src/test_vectors/note_encryption.rs | 20 +++++++++---------- tests/builder.rs | 2 +- tests/zsa.rs | 2 +- 6 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 3e2b8c972..d2119f817 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -46,29 +46,23 @@ pub enum BundleType { } impl BundleType { - /// The default bundle type has all flags enabled, and does not require a bundle to be produced - /// if no spends or outputs have been added to the bundle. - pub const DEFAULT_VANILLA: BundleType = BundleType::Transactional { - flags: Flags::ENABLED_VANILLA, + /// The default bundle type has all flags enabled but ZSA disabled, and does not require a bundle + /// to be produced if no spends or outputs have been added to the bundle. + pub const DEFAULT_WITHOUT_ZSA: BundleType = BundleType::Transactional { + flags: Flags::ENABLED_WITHOUT_ZSA, bundle_required: false, }; - /// FIXME: add doc - pub const DEFAULT_ZSA: BundleType = BundleType::Transactional { - flags: Flags::ENABLED_ZSA, + /// The default bundle with all flags enabled, including ZSA. + pub const DEFAULT_WITH_ZSA: BundleType = BundleType::Transactional { + flags: Flags::ENABLED_WITH_ZSA, bundle_required: false, }; /// The DISABLED bundle type does not permit any bundle to be produced, and when used in the /// builder will prevent any spends or outputs from being added. pub const DISABLED: BundleType = BundleType::Transactional { - flags: Flags::from_parts(false, false, false), // FIXME: is this correct? - bundle_required: false, - }; - - /// FIXME: add doc - pub const ZSA_DISABLED: BundleType = BundleType::Transactional { - flags: Flags::from_parts(true, true, false), + flags: Flags::from_parts(false, false, false), // FIXME: is `false` value for ZSA flag correct here? bundle_required: false, }; @@ -690,8 +684,8 @@ fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) } } -// FIXME: the order of the arguments doesn't correspond the order of the fields of the Builder -// struct - is that okay? +// FIXME: the order of the arguments of the `bundle` function doesn't correspond the order +// of the fields of the `Builder` struct - is that okay? /// Builds a bundle containing the given spent notes and outputs. /// @@ -1171,7 +1165,7 @@ pub mod testing { /// Create a bundle from the set of arbitrary bundle inputs. fn into_bundle + Copy + Into>(mut self) -> Bundle { let fvk = FullViewingKey::from(&self.sk); - let mut builder = Builder::new(BundleType::DEFAULT_ZSA, self.anchor); + let mut builder = Builder::new(BundleType::DEFAULT_WITH_ZSA, self.anchor); for (note, path) in self.notes.into_iter() { builder.add_spend(fvk.clone(), note, path).unwrap(); @@ -1294,7 +1288,7 @@ mod tests { let recipient = fvk.address_at(0u32, Scope::External); let mut builder = Builder::new( - BundleType::ZSA_DISABLED, + BundleType::DEFAULT_WITHOUT_ZSA, EMPTY_ROOTS[MERKLE_DEPTH_ORCHARD].into(), ); diff --git a/src/bundle.rs b/src/bundle.rs index b53fd0416..1a119a786 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -85,17 +85,15 @@ impl Flags { } } - /// The flag set with both spends and outputs enabled. - // FIXME: mention id doc that zsa is disabled? - pub const ENABLED_VANILLA: Flags = Flags { + /// The flag set with both spends and outputs enabled and ZSA disabled. + pub const ENABLED_WITHOUT_ZSA: Flags = Flags { spends_enabled: true, outputs_enabled: true, zsa_enabled: false, }; - /// The flag set with both spends and outputs enabled. - // FIXME: mention id doc that zsa is enabled? - pub const ENABLED_ZSA: Flags = Flags { + /// The flag set with both spends and outputs enabled and ZSA enabled. + pub const ENABLED_WITH_ZSA: Flags = Flags { spends_enabled: true, outputs_enabled: true, zsa_enabled: true, diff --git a/src/circuit.rs b/src/circuit.rs index 0baf1bdc3..bfa78dce9 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1210,8 +1210,6 @@ mod tests { let nk = *fvk.nk(); let rivk = fvk.rivk(fvk.scope_for_address(&spent_note.recipient()).unwrap()); let nf_old = spent_note.nullifier(&fvk); - // FIXME: why it became unused? - //let rho = Rho::from_nf_old(nf_old); let ak: SpendValidatingKey = fvk.into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index c3100b80c..b4a1f3137 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -95,7 +95,7 @@ pub(crate) fn test_vectors() -> Vec { 0x42, 0xc2, 0x38, 0x51, 0x38, 0x15, 0x30, 0x2d, 0xf0, 0xf4, 0x83, 0x04, 0x21, 0xa6, 0xc1, 0x3e, 0x71, 0x01, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xc5, 0x96, 0xfb, 0xd3, 0x2e, 0xbb, 0xcb, 0xad, 0xae, 0x60, 0xd2, 0x85, 0xc7, 0xd7, 0x5f, 0xa8, 0x36, 0xf9, 0xd2, 0xfa, 0x86, 0x10, 0x0a, 0xb8, 0x58, 0xea, 0x2d, 0xe1, @@ -305,7 +305,7 @@ pub(crate) fn test_vectors() -> Vec { 0xa2, 0x17, 0x64, 0x10, 0x4a, 0x23, 0xea, 0xf6, 0xba, 0x49, 0x6c, 0xb9, 0xb8, 0xe8, 0x25, 0x7a, 0xd8, 0xb3, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x33, 0x88, 0xda, 0x05, 0x06, 0xda, 0x9e, 0xa2, 0xd5, 0x16, 0x73, 0x9b, 0x95, 0x1c, 0x7c, 0xc0, 0x58, 0x53, 0x36, 0xb4, 0x4d, 0xf9, 0xb3, 0xb5, 0x0e, 0x48, 0x93, 0xe4, @@ -515,7 +515,7 @@ pub(crate) fn test_vectors() -> Vec { 0x9d, 0x5e, 0x64, 0x07, 0x19, 0xbc, 0xa5, 0xc8, 0xed, 0x49, 0x99, 0x97, 0x34, 0xe6, 0xc5, 0xb3, 0x73, 0x3e, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xbe, 0xf8, 0xcf, 0x16, 0x98, 0xe4, 0x78, 0x47, 0xd3, 0x8e, 0x1a, 0xaa, 0x88, 0x86, 0x10, 0x77, 0xcd, 0xb5, 0xad, 0x4c, 0xf6, 0x6f, 0xe4, 0x2f, 0xd6, 0x52, 0x57, 0x81, @@ -725,7 +725,7 @@ pub(crate) fn test_vectors() -> Vec { 0xfa, 0xde, 0x94, 0xfa, 0x0b, 0x46, 0xe3, 0xb1, 0xa5, 0x73, 0x34, 0x99, 0x34, 0xe2, 0x32, 0xb5, 0x0e, 0x96, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x18, 0x89, 0x8e, 0x75, 0x21, 0x7b, 0x32, 0x9b, 0x3a, 0x56, 0x7b, 0x09, 0x37, 0x89, 0xa4, 0xd8, 0x19, 0xcd, 0xb0, 0x34, 0x88, 0xb8, 0x10, 0xda, 0x22, 0x0c, 0x3f, 0x59, @@ -935,7 +935,7 @@ pub(crate) fn test_vectors() -> Vec { 0x72, 0x95, 0x89, 0xbe, 0x69, 0xd8, 0x28, 0xbe, 0x54, 0x30, 0x69, 0x16, 0x41, 0x3c, 0xd2, 0x50, 0x21, 0x17, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x23, 0x39, 0xa8, 0x95, 0x29, 0xcf, 0x35, 0x7b, 0x06, 0x7d, 0xd2, 0x8b, 0xe4, 0x06, 0x6e, 0x16, 0x23, 0x6d, 0xc5, 0xd7, 0x87, 0x06, 0x14, 0x9a, 0x72, 0x8c, 0x3e, 0x3d, @@ -1145,7 +1145,7 @@ pub(crate) fn test_vectors() -> Vec { 0x6e, 0x62, 0xe4, 0xed, 0xc7, 0x86, 0xd9, 0xe0, 0xb2, 0x7d, 0x26, 0x62, 0x8b, 0x79, 0xda, 0x6b, 0x15, 0x14, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xe5, 0xd0, 0x8c, 0x40, 0x26, 0x3e, 0x4a, 0x2a, 0x56, 0x96, 0xda, 0x21, 0x0d, 0x8e, 0x9a, 0x77, 0xf0, 0xaf, 0xc4, 0xc6, 0x8a, 0x6d, 0xda, 0x38, 0xe2, 0x85, 0xf4, 0xe3, @@ -1355,7 +1355,7 @@ pub(crate) fn test_vectors() -> Vec { 0x0a, 0x12, 0x01, 0x2d, 0x63, 0xc0, 0x09, 0xc6, 0x77, 0x44, 0xba, 0xe0, 0xd5, 0x83, 0x88, 0xff, 0xee, 0x2f, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xe9, 0x16, 0x93, 0xc3, 0x7d, 0x04, 0x37, 0x5e, 0x67, 0xc5, 0x71, 0x5a, 0x39, 0xc9, 0x79, 0x4a, 0x4e, 0xcd, 0x08, 0x38, 0xe2, 0x35, 0x1f, 0xd7, 0xcd, 0x93, 0xa1, 0x55, @@ -1565,7 +1565,7 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0x51, 0x00, 0x89, 0x08, 0xa6, 0xcd, 0xd0, 0xaa, 0x02, 0x1b, 0x88, 0x8b, 0x98, 0xe2, 0x3c, 0x39, 0x11, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x35, 0x6f, 0xc7, 0x2e, 0x1b, 0xf1, 0xe3, 0xa2, 0xa5, 0x9a, 0xa9, 0xe4, 0x75, 0x15, 0x5c, 0xf7, 0x43, 0xf8, 0xfd, 0xf0, 0xd1, 0x5b, 0x4c, 0xc4, 0x02, 0x60, 0xd0, 0xd0, @@ -1775,7 +1775,7 @@ pub(crate) fn test_vectors() -> Vec { 0x7e, 0xed, 0xd2, 0xa7, 0x06, 0x44, 0x07, 0x34, 0x78, 0x41, 0x01, 0xae, 0x2d, 0x8e, 0x87, 0xe5, 0x05, 0xad, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x32, 0x91, 0x87, 0x35, 0x66, 0x3f, 0x34, 0xad, 0xa0, 0x22, 0x8a, 0xea, 0x4a, 0xcc, 0x19, 0x2a, 0x12, 0x3f, 0xcf, 0xa0, 0x60, 0x46, 0x89, 0xf9, 0x1a, 0xcb, 0xe9, 0x38, @@ -1985,7 +1985,7 @@ pub(crate) fn test_vectors() -> Vec { 0xbd, 0xb9, 0x6f, 0x1c, 0xe0, 0x57, 0xc3, 0x30, 0xd1, 0xcc, 0xba, 0x2f, 0x7d, 0xa8, 0x71, 0x55, 0x00, 0xb5, ], - // FIXME: used instead of rho, which was possiblu modified in zsa1 version + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x3b, 0x37, 0x96, 0x78, 0x0c, 0x0a, 0xec, 0x14, 0xed, 0x28, 0x74, 0xb5, 0x23, 0x06, 0xe1, 0xc3, 0xd5, 0xde, 0x45, 0x93, 0xc6, 0x69, 0xaf, 0x1c, 0xaf, 0x11, 0xbc, 0xb4, diff --git a/tests/builder.rs b/tests/builder.rs index 845fa2367..07347b73d 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -110,7 +110,7 @@ fn bundle_chain() { let (merkle_path, anchor) = build_merkle_path(¬e); - let mut builder = Builder::new(BundleType::DEFAULT_VANILLA, anchor); + let mut builder = Builder::new(BundleType::DEFAULT_WITHOUT_ZSA, anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( builder.add_output( diff --git a/tests/zsa.rs b/tests/zsa.rs index 4d6826b08..44850e23d 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -238,7 +238,7 @@ fn build_and_verify_bundle( ) -> Result<(), String> { let rng = OsRng; let shielded_bundle: Bundle<_, i64> = { - let mut builder = Builder::new(BundleType::DEFAULT_ZSA, anchor); + let mut builder = Builder::new(BundleType::DEFAULT_WITH_ZSA, anchor); spends .iter() From 7969b9ec78a92e9ba8ddea6b8cba4cb34211a628 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 30 Apr 2024 09:29:54 +0200 Subject: [PATCH 60/67] Fix flag names after renaming --- benches/circuit.rs | 2 +- benches/note_decryption.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benches/circuit.rs b/benches/circuit.rs index 080411607..bf2401af8 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -27,7 +27,7 @@ fn criterion_benchmark(c: &mut Criterion) { let create_bundle = |num_recipients| { let mut builder = Builder::new( - BundleType::DEFAULT_VANILLA, + BundleType::DEFAULT_WITHOUT_ZSA, Anchor::from_bytes([0; 32]).unwrap(), ); for _ in 0..num_recipients { diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 577cc20a0..fe3acb03c 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -46,7 +46,7 @@ fn bench_note_decryption(c: &mut Criterion) { let bundle = { let mut builder = Builder::new( - BundleType::DEFAULT_VANILLA, + BundleType::DEFAULT_WITHIOUT_ZSA, Anchor::from_bytes([0; 32]).unwrap(), ); // The builder pads to two actions, and shuffles their order. Add two recipients From 47f7aaeff839908b765e93fa5ec7e8804727e99c Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 30 Apr 2024 10:00:56 +0200 Subject: [PATCH 61/67] Disable rustfmt for one line in keys.rs module to prevent removing double column in the use of external zip32 crate --- src/keys.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/keys.rs b/src/keys.rs index eddd4dcc4..123d9ef17 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -25,7 +25,6 @@ use pasta_curves::{pallas, pallas::Scalar}; use rand::{rngs::OsRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zcash_note_encryption_zsa::EphemeralKeyBytes; -//use zip32::{AccountId, ChildIndex}; use crate::{ address::Address, @@ -41,6 +40,9 @@ use crate::{ }, }; +// Disable rustfmt to preserve '::' which specifies the external 'zip32' crate, +// avoiding confusion with a local module of the same name. +#[rustfmt::skip] pub use ::zip32::{AccountId, ChildIndex, DiversifierIndex, Scope}; const KDF_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_OrchardKDF"; From bb9e03b4d814cc289c5f7d73ce42b9bdbb0e6d1b Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 30 Apr 2024 10:20:52 +0200 Subject: [PATCH 62/67] Fix typo in constant name --- benches/note_decryption.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index fe3acb03c..5f6d9bf50 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -46,7 +46,7 @@ fn bench_note_decryption(c: &mut Criterion) { let bundle = { let mut builder = Builder::new( - BundleType::DEFAULT_WITHIOUT_ZSA, + BundleType::DEFAULT_WITHOUT_ZSA, Anchor::from_bytes([0; 32]).unwrap(), ); // The builder pads to two actions, and shuffles their order. Add two recipients From dd956b8251e4c56c335a06b20b5c32ef64616ea7 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Wed, 1 May 2024 22:00:16 +0200 Subject: [PATCH 63/67] Fix comments, rename DEFAULT_WITH(OUT)_ZSA to DEVAULT_VANILLA(ZSA) --- benches/circuit.rs | 2 +- benches/note_decryption.rs | 2 +- src/builder.rs | 22 +++++++++------------- src/bundle.rs | 2 +- src/keys.rs | 3 +-- tests/builder.rs | 2 +- tests/zsa.rs | 2 +- 7 files changed, 15 insertions(+), 20 deletions(-) diff --git a/benches/circuit.rs b/benches/circuit.rs index bf2401af8..080411607 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -27,7 +27,7 @@ fn criterion_benchmark(c: &mut Criterion) { let create_bundle = |num_recipients| { let mut builder = Builder::new( - BundleType::DEFAULT_WITHOUT_ZSA, + BundleType::DEFAULT_VANILLA, Anchor::from_bytes([0; 32]).unwrap(), ); for _ in 0..num_recipients { diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 5f6d9bf50..577cc20a0 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -46,7 +46,7 @@ fn bench_note_decryption(c: &mut Criterion) { let bundle = { let mut builder = Builder::new( - BundleType::DEFAULT_WITHOUT_ZSA, + BundleType::DEFAULT_VANILLA, Anchor::from_bytes([0; 32]).unwrap(), ); // The builder pads to two actions, and shuffles their order. Add two recipients diff --git a/src/builder.rs b/src/builder.rs index d2119f817..f1cacb863 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -46,15 +46,15 @@ pub enum BundleType { } impl BundleType { - /// The default bundle type has all flags enabled but ZSA disabled, and does not require a bundle - /// to be produced if no spends or outputs have been added to the bundle. - pub const DEFAULT_WITHOUT_ZSA: BundleType = BundleType::Transactional { + /// The default bundle type has all flags enabled, ZSA disabled, and does not require a bundle + /// to be produced. + pub const DEFAULT_VANILLA: BundleType = BundleType::Transactional { flags: Flags::ENABLED_WITHOUT_ZSA, bundle_required: false, }; /// The default bundle with all flags enabled, including ZSA. - pub const DEFAULT_WITH_ZSA: BundleType = BundleType::Transactional { + pub const DEFAULT_ZSA: BundleType = BundleType::Transactional { flags: Flags::ENABLED_WITH_ZSA, bundle_required: false, }; @@ -62,7 +62,7 @@ impl BundleType { /// The DISABLED bundle type does not permit any bundle to be produced, and when used in the /// builder will prevent any spends or outputs from being added. pub const DISABLED: BundleType = BundleType::Transactional { - flags: Flags::from_parts(false, false, false), // FIXME: is `false` value for ZSA flag correct here? + flags: Flags::from_parts(false, false, false), bundle_required: false, }; @@ -670,23 +670,20 @@ fn partition_by_asset( hm } -/// Returns a dummy/split notes to extend the spends. +/// Returns the appropriate SpendInfo for padding. fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) -> SpendInfo { if asset.is_native().into() { // For native asset, extends with dummy notes SpendInfo::dummy(asset, &mut rng) } else { // For ZSA asset, extends with - // - dummy notes if first spend is empty + // - dummy note if SpendInfo is None // - split notes otherwise. let dummy = SpendInfo::dummy(asset, &mut rng); spend.map_or_else(|| dummy, |s| s.create_split_spend(&mut rng)) } } -// FIXME: the order of the arguments of the `bundle` function doesn't correspond the order -// of the fields of the `Builder` struct - is that okay? - /// Builds a bundle containing the given spent notes and outputs. /// /// The returned bundle will have no proof or signatures; these can be applied with @@ -717,7 +714,6 @@ pub fn bundle + TryFrom>( return Err(BuildError::OutputsDisabled); } - // The number of actions to add to this bundle in order to contain at least MIN_ACTION actions. let num_missing_actions = MIN_ACTIONS.saturating_sub(spends.len().max(outputs.len())); // Pair up the spends and outputs, extending with dummy values as necessary. @@ -1165,7 +1161,7 @@ pub mod testing { /// Create a bundle from the set of arbitrary bundle inputs. fn into_bundle + Copy + Into>(mut self) -> Bundle { let fvk = FullViewingKey::from(&self.sk); - let mut builder = Builder::new(BundleType::DEFAULT_WITH_ZSA, self.anchor); + let mut builder = Builder::new(BundleType::DEFAULT_ZSA, self.anchor); for (note, path) in self.notes.into_iter() { builder.add_spend(fvk.clone(), note, path).unwrap(); @@ -1288,7 +1284,7 @@ mod tests { let recipient = fvk.address_at(0u32, Scope::External); let mut builder = Builder::new( - BundleType::DEFAULT_WITHOUT_ZSA, + BundleType::DEFAULT_VANILLA, EMPTY_ROOTS[MERKLE_DEPTH_ORCHARD].into(), ); diff --git a/src/bundle.rs b/src/bundle.rs index 1a119a786..475dc2332 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -92,7 +92,7 @@ impl Flags { zsa_enabled: false, }; - /// The flag set with both spends and outputs enabled and ZSA enabled. + /// The flags set with spends, outputs and ZSA enabled. pub const ENABLED_WITH_ZSA: Flags = Flags { spends_enabled: true, outputs_enabled: true, diff --git a/src/keys.rs b/src/keys.rs index 123d9ef17..3c76a73f6 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -40,8 +40,7 @@ use crate::{ }, }; -// Disable rustfmt to preserve '::' which specifies the external 'zip32' crate, -// avoiding confusion with a local module of the same name. +// Preserve '::' which specifies the EXTERNAL 'zip32' crate #[rustfmt::skip] pub use ::zip32::{AccountId, ChildIndex, DiversifierIndex, Scope}; diff --git a/tests/builder.rs b/tests/builder.rs index 07347b73d..845fa2367 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -110,7 +110,7 @@ fn bundle_chain() { let (merkle_path, anchor) = build_merkle_path(¬e); - let mut builder = Builder::new(BundleType::DEFAULT_WITHOUT_ZSA, anchor); + let mut builder = Builder::new(BundleType::DEFAULT_VANILLA, anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( builder.add_output( diff --git a/tests/zsa.rs b/tests/zsa.rs index 44850e23d..4d6826b08 100644 --- a/tests/zsa.rs +++ b/tests/zsa.rs @@ -238,7 +238,7 @@ fn build_and_verify_bundle( ) -> Result<(), String> { let rng = OsRng; let shielded_bundle: Bundle<_, i64> = { - let mut builder = Builder::new(BundleType::DEFAULT_WITH_ZSA, anchor); + let mut builder = Builder::new(BundleType::DEFAULT_ZSA, anchor); spends .iter() From 123b60988a5b0afa9029b8e22e04642edd170ad8 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 2 May 2024 15:38:05 +0200 Subject: [PATCH 64/67] 1) Use Option instead of usize::MAX in builder::partition_by_asset function. 2) Refactor builder::bundle function (pre-action genetation), to split 'fold' into three parts --- src/builder.rs | 159 +++++++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 72 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index f1cacb863..6e38201f6 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -642,28 +642,34 @@ fn partition_by_asset( spends: &[SpendInfo], outputs: &[OutputInfo], rng: &mut impl RngCore, -) -> HashMap, Vec<(usize, OutputInfo)>)> { +) -> HashMap< + AssetBase, + ( + Vec<(Option, SpendInfo)>, + Vec<(Option, OutputInfo)>, + ), +> { let mut hm = HashMap::new(); for (i, s) in spends.iter().enumerate() { hm.entry(s.note.asset()) .or_insert((vec![], vec![])) .0 - .push((i, s.clone())); + .push((Some(i), s.clone())); } for (i, o) in outputs.iter().enumerate() { hm.entry(o.asset) .or_insert((vec![], vec![])) .1 - .push((i, o.clone())); + .push((Some(i), o.clone())); } if hm.is_empty() { - let dummy_spend = SpendInfo::dummy(AssetBase::native(), rng); + let dummy_spend = pad_spend(None, AssetBase::native(), rng); hm.insert( dummy_spend.note.asset(), - (vec![(usize::MAX, dummy_spend)], vec![]), + (vec![(None, dummy_spend)], vec![]), ); } @@ -714,76 +720,85 @@ pub fn bundle + TryFrom>( return Err(BuildError::OutputsDisabled); } - let num_missing_actions = MIN_ACTIONS.saturating_sub(spends.len().max(outputs.len())); - // Pair up the spends and outputs, extending with dummy values as necessary. - let (pre_actions, bundle_meta, _) = partition_by_asset(&spends, &outputs, &mut rng) - .into_iter() - .fold( - ( - Vec::new(), - BundleMetadata::new(num_requested_spends, num_requested_outputs), - // We might have to add dummy/split actions only for the first asset to reach MIN_ACTIONS. - num_missing_actions, - ), - |(mut pre_actions, mut bundle_meta, num_missing_actions), - (asset, (spends, outputs))| { - let num_actions = spends.len().max(outputs.len()) + num_missing_actions; - - let first_spend = spends.first().map(|(_, s)| s.clone()); - - let mut indexed_spends = spends - .into_iter() - .chain(iter::repeat_with(|| { - (usize::MAX, pad_spend(first_spend.as_ref(), asset, &mut rng)) - })) - .take(num_actions) - .collect::>(); - - let mut indexed_outputs = outputs - .into_iter() - .chain(iter::repeat_with(|| { - (usize::MAX, OutputInfo::dummy(&mut rng, asset)) - })) - .take(num_actions) - .collect::>(); - - // Shuffle the spends and outputs, so that learning the position of a - // specific spent note or output note doesn't reveal anything on its own about - // the meaning of that note in the transaction context. - indexed_spends.shuffle(&mut rng); - indexed_outputs.shuffle(&mut rng); - - assert_eq!(indexed_spends.len(), indexed_outputs.len()); - - let pre_actions_len = pre_actions.len(); - - let new_actions = indexed_spends - .into_iter() - .zip(indexed_outputs.into_iter()) - .enumerate() - .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { - let action_idx = action_idx + pre_actions_len; - - // Record the post-randomization spend location - if spend_idx < num_requested_spends { - bundle_meta.spend_indices[spend_idx] = action_idx; - } - - // Record the post-randomization output location - if out_idx < num_requested_outputs { - bundle_meta.output_indices[out_idx] = action_idx; - } - - ActionInfo::new(spend, output, &mut rng) - }); - - pre_actions.extend(new_actions); - - (pre_actions, bundle_meta, 0) - }, + let (pre_actions, bundle_meta) = { + // FIXME: use Vec::with_capacity().extend(...) instead of ...collect() as we can estimate + // the size of the resulting vector beforehand. Rust can't do that autimatically in this + // particular case, and possibly realloicates the vector during the collecting. + // Moreover, even if we use "colect" intstead of the first "extend", we still have to make + // the vector mutable and then potentially extend it with missing dummy elements to pad to + // MIN_ACTIONS elements. + let mut indexed_spends_outputs = + Vec::with_capacity(spends.len().max(outputs.len()).max(MIN_ACTIONS)); + + indexed_spends_outputs.extend( + partition_by_asset(&spends, &outputs, &mut rng) + .into_iter() + .flat_map(|(asset, (spends, outputs))| { + let num_asset_pre_actions = spends.len().max(outputs.len()); + + let first_spend = spends.first().map(|(_, s)| s.clone()); + + let mut indexed_spends = spends + .into_iter() + .chain(iter::repeat_with(|| { + (None, pad_spend(first_spend.as_ref(), asset, &mut rng)) + })) + .take(num_asset_pre_actions) + .collect::>(); + + let mut indexed_outputs = outputs + .into_iter() + .chain(iter::repeat_with(|| { + (None, OutputInfo::dummy(&mut rng, asset)) + })) + .take(num_asset_pre_actions) + .collect::>(); + + // Shuffle the spends and outputs, so that learning the position of a + // specific spent note or output note doesn't reveal anything on its own about + // the meaning of that note in the transaction context. + indexed_spends.shuffle(&mut rng); + indexed_outputs.shuffle(&mut rng); + + assert_eq!(indexed_spends.len(), indexed_outputs.len()); + + indexed_spends.into_iter().zip(indexed_outputs) + }), ); + indexed_spends_outputs.extend( + iter::repeat_with(|| { + ( + (None, pad_spend(None, AssetBase::native(), &mut rng)), + (None, OutputInfo::dummy(&mut rng, AssetBase::native())), + ) + }) + .take(MIN_ACTIONS.saturating_sub(indexed_spends_outputs.len())), + ); + + let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); + let pre_actions = indexed_spends_outputs + .into_iter() + .enumerate() + .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { + // Record the post-randomization spend location + if let Some(spend_idx) = spend_idx { + bundle_meta.spend_indices[spend_idx] = action_idx; + } + + // Record the post-randomization output location + if let Some(out_idx) = out_idx { + bundle_meta.output_indices[out_idx] = action_idx; + } + + ActionInfo::new(spend, output, &mut rng) + }) + .collect::>(); + + (pre_actions, bundle_meta) + }; + // Determine the value balance for this bundle, ensuring it is valid. let native_value_balance: V = pre_actions .iter() From ee89541af6ad516ea708ad8d56b5e893ecbf5a06 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 7 May 2024 15:04:09 +0200 Subject: [PATCH 65/67] Refactor build function to remove `Copy + Into` constraints - Introduce `derive_bvk` function for streamlined calculation of `bvk` - Use `derive_bvk` in `bundle.binding_validating_key()` to avoid duplication - Adjust `native_value_balance` calculation to an `i64` and convert to `V` - Optimize calculations with iterators to reduce memory usage --- src/builder.rs | 54 +++++++++++++++++++++++++++++++------------------- src/bundle.rs | 52 ++++++++++++++++++++++++++---------------------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 6e38201f6..80cad82e2 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -13,7 +13,7 @@ use rand::{prelude::SliceRandom, CryptoRng, RngCore}; use crate::{ action::Action, address::Address, - bundle::{Authorization, Authorized, Bundle, Flags}, + bundle::{derive_bvk, Authorization, Authorized, Bundle, Flags}, circuit::{Circuit, Instance, Proof, ProvingKey}, keys::{ FullViewingKey, OutgoingViewingKey, Scope, SpendAuthorizingKey, SpendValidatingKey, @@ -620,7 +620,7 @@ impl Builder { /// /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. - pub fn build + TryFrom>( + pub fn build>( self, rng: impl RngCore, ) -> Result, BundleMetadata)>, BuildError> { @@ -694,7 +694,7 @@ fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) /// /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. -pub fn bundle + TryFrom>( +pub fn bundle>( mut rng: impl RngCore, anchor: Anchor, bundle_type: BundleType, @@ -800,7 +800,7 @@ pub fn bundle + TryFrom>( }; // Determine the value balance for this bundle, ensuring it is valid. - let native_value_balance: V = pre_actions + let native_value_balance: i64 = pre_actions .iter() .filter(|action| action.spend.note.asset().is_native().into()) .fold(Some(ValueSum::zero()), |acc, action| { @@ -809,6 +809,9 @@ pub fn bundle + TryFrom>( .ok_or(OverflowError)? .into()?; + let result_value_balance = V::try_from(native_value_balance) + .map_err(|_| BuildError::ValueSum(value::OverflowError))?; + // Compute the transaction binding signing key. let bsk = pre_actions .iter() @@ -820,25 +823,36 @@ pub fn bundle + TryFrom>( let (actions, circuits): (Vec<_>, Vec<_>) = pre_actions.into_iter().map(|a| a.build(&mut rng)).unzip(); - let bundle = Bundle::from_parts( - NonEmpty::from_vec(actions).unwrap(), - flags, + // Verify that bsk and bvk are consistent. + let bvk = derive_bvk( + &actions, native_value_balance, - burn.into_iter() - .map(|(asset, value)| Ok((asset, value.into()?))) - .collect::>()?, - anchor, - InProgress { - proof: Unproven { circuits }, - sigs: Unauthorized { bsk }, - }, + burn.iter() + .flat_map(|(asset, value)| -> Result<_, BuildError> { Ok((*asset, (*value).into()?)) }), ); + assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); - assert_eq!( - redpallas::VerificationKey::from(&bundle.authorization().sigs.bsk), - bundle.binding_validating_key() - ); - Ok(Some((bundle, bundle_meta))) + let burn = burn + .into_iter() + .map(|(asset, value)| Ok((asset, value.into()?))) + .collect::, BuildError>>()?; + + Ok(NonEmpty::from_vec(actions).map(|actions| { + ( + Bundle::from_parts( + actions, + flags, + result_value_balance, + burn, + anchor, + InProgress { + proof: Unproven { circuits }, + sigs: Unauthorized { bsk }, + }, + ), + bundle_meta, + ) + })) } /// Marker trait representing bundle signatures in the process of being created. diff --git a/src/bundle.rs b/src/bundle.rs index 475dc2332..a4e87bac0 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -435,6 +435,33 @@ impl Bundle { } } +pub(crate) fn derive_bvk<'a, A: 'a, V: Clone + Into>( + actions: impl IntoIterator>, //&NonEmpty>, + value_balance: V, + burn: impl Iterator, +) -> redpallas::VerificationKey { + // https://p.z.cash/TCR:bad-txns-orchard-binding-signature-invalid?partial + (actions + .into_iter() + .map(|a| a.cv_net()) + .sum::() + - ValueCommitment::derive( + ValueSum::from_raw(value_balance.into()), + ValueCommitTrapdoor::zero(), + AssetBase::native(), + ) + - burn + .map(|(asset, value)| { + ValueCommitment::derive( + ValueSum::from_raw(value.into()), + ValueCommitTrapdoor::zero(), + asset, + ) + }) + .sum::()) + .into_bvk() +} + impl> Bundle { /// Computes a commitment to the effects of this bundle, suitable for inclusion within /// a transaction ID. @@ -447,30 +474,7 @@ impl> Bundle { /// This can be used to validate the [`Authorized::binding_signature`] returned from /// [`Bundle::authorization`]. pub fn binding_validating_key(&self) -> redpallas::VerificationKey { - // https://p.z.cash/TCR:bad-txns-orchard-binding-signature-invalid?partial - (self - .actions - .iter() - .map(|a| a.cv_net()) - .sum::() - - ValueCommitment::derive( - ValueSum::from_raw(self.value_balance.into()), - ValueCommitTrapdoor::zero(), - AssetBase::native(), - ) - - self - .burn - .clone() - .into_iter() - .map(|(asset, value)| { - ValueCommitment::derive( - ValueSum::from_raw(value.into()), - ValueCommitTrapdoor::zero(), - asset, - ) - }) - .sum::()) - .into_bvk() + derive_bvk(&self.actions, self.value_balance, self.burn.iter().cloned()) } } From 73218b089b7121e226afa1ded4bf5eb3e236d5f6 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Tue, 7 May 2024 18:38:15 +0200 Subject: [PATCH 66/67] Remove extra comment --- src/bundle.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bundle.rs b/src/bundle.rs index a4e87bac0..8f9e8af79 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -436,7 +436,7 @@ impl Bundle { } pub(crate) fn derive_bvk<'a, A: 'a, V: Clone + Into>( - actions: impl IntoIterator>, //&NonEmpty>, + actions: impl IntoIterator>, value_balance: V, burn: impl Iterator, ) -> redpallas::VerificationKey { From 50c6310f8ac3ba6aa087424ff16f08a3a79029c6 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 9 May 2024 11:10:56 +0200 Subject: [PATCH 67/67] Fix comments, indroduce and use MatadataIdx type in the builder --- src/builder.rs | 36 +++++++++++++++++++----------------- src/bundle.rs | 4 ++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 80cad82e2..ff3459012 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -635,6 +635,11 @@ impl Builder { } } +/// The index of the attached spend or output in the bundle. +/// None indicates a dummy note. +/// The index is used to track the position of the note in the bundle. +type MetadataIdx = Option; + /// Partition a list of spends and recipients by note types. /// Method creates single dummy ZEC note if spends and recipients are both empty. #[allow(clippy::type_complexity)] @@ -645,8 +650,8 @@ fn partition_by_asset( ) -> HashMap< AssetBase, ( - Vec<(Option, SpendInfo)>, - Vec<(Option, OutputInfo)>, + Vec<(SpendInfo, MetadataIdx)>, + Vec<(OutputInfo, MetadataIdx)>, ), > { let mut hm = HashMap::new(); @@ -655,21 +660,22 @@ fn partition_by_asset( hm.entry(s.note.asset()) .or_insert((vec![], vec![])) .0 - .push((Some(i), s.clone())); + .push((s.clone(), Some(i))); } for (i, o) in outputs.iter().enumerate() { hm.entry(o.asset) .or_insert((vec![], vec![])) .1 - .push((Some(i), o.clone())); + .push((o.clone(), Some(i))); } if hm.is_empty() { let dummy_spend = pad_spend(None, AssetBase::native(), rng); + // dummy_spend should not be included in the indexing and marked as None. hm.insert( dummy_spend.note.asset(), - (vec![(None, dummy_spend)], vec![]), + (vec![(dummy_spend, None)], vec![]), ); } @@ -722,12 +728,8 @@ pub fn bundle>( // Pair up the spends and outputs, extending with dummy values as necessary. let (pre_actions, bundle_meta) = { - // FIXME: use Vec::with_capacity().extend(...) instead of ...collect() as we can estimate - // the size of the resulting vector beforehand. Rust can't do that autimatically in this - // particular case, and possibly realloicates the vector during the collecting. - // Moreover, even if we use "colect" intstead of the first "extend", we still have to make - // the vector mutable and then potentially extend it with missing dummy elements to pad to - // MIN_ACTIONS elements. + // Use Vec::with_capacity().extend(...) instead of .collect() to avoid reallocations, + // as we can estimate the vector size beforehand. let mut indexed_spends_outputs = Vec::with_capacity(spends.len().max(outputs.len()).max(MIN_ACTIONS)); @@ -737,12 +739,12 @@ pub fn bundle>( .flat_map(|(asset, (spends, outputs))| { let num_asset_pre_actions = spends.len().max(outputs.len()); - let first_spend = spends.first().map(|(_, s)| s.clone()); + let first_spend = spends.first().map(|(s, _)| s.clone()); let mut indexed_spends = spends .into_iter() .chain(iter::repeat_with(|| { - (None, pad_spend(first_spend.as_ref(), asset, &mut rng)) + (pad_spend(first_spend.as_ref(), asset, &mut rng), None) })) .take(num_asset_pre_actions) .collect::>(); @@ -750,7 +752,7 @@ pub fn bundle>( let mut indexed_outputs = outputs .into_iter() .chain(iter::repeat_with(|| { - (None, OutputInfo::dummy(&mut rng, asset)) + (OutputInfo::dummy(&mut rng, asset), None) })) .take(num_asset_pre_actions) .collect::>(); @@ -770,8 +772,8 @@ pub fn bundle>( indexed_spends_outputs.extend( iter::repeat_with(|| { ( - (None, pad_spend(None, AssetBase::native(), &mut rng)), - (None, OutputInfo::dummy(&mut rng, AssetBase::native())), + (pad_spend(None, AssetBase::native(), &mut rng), None), + (OutputInfo::dummy(&mut rng, AssetBase::native()), None), ) }) .take(MIN_ACTIONS.saturating_sub(indexed_spends_outputs.len())), @@ -781,7 +783,7 @@ pub fn bundle>( let pre_actions = indexed_spends_outputs .into_iter() .enumerate() - .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { + .map(|(action_idx, ((spend, spend_idx), (output, out_idx)))| { // Record the post-randomization spend location if let Some(spend_idx) = spend_idx { bundle_meta.spend_indices[spend_idx] = action_idx; diff --git a/src/bundle.rs b/src/bundle.rs index 8f9e8af79..385e5fec1 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -103,14 +103,14 @@ impl Flags { pub const SPENDS_DISABLED: Flags = Flags { spends_enabled: false, outputs_enabled: true, - zsa_enabled: false, // FIXME: is this correct? + zsa_enabled: false, }; /// The flag set with outputs disabled. pub const OUTPUTS_DISABLED: Flags = Flags { spends_enabled: true, outputs_enabled: false, - zsa_enabled: false, // FIXME: is this correct? + zsa_enabled: false, }; /// Flag denoting whether Orchard spends are enabled in the transaction.