diff --git a/Cargo.lock b/Cargo.lock index 6db90da..1b7ea43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -699,8 +699,6 @@ dependencies = [ [[package]] name = "hal-simplicity" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a540615bef9124e283bbd087e007af922c9f6cfac210412bda4d1c34b2a74d" dependencies = [ "clap 2.33.3", "elements", @@ -1730,8 +1728,6 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simplicity-lang" version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e57bd4d84853974a212eab24ed89da54f49fbccf5e33e93bcd29f0a6591cd5" dependencies = [ "bitcoin", "bitcoin_hashes", @@ -1749,8 +1745,6 @@ dependencies = [ [[package]] name = "simplicity-sys" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bcb4e5bfc15080d67e0ce2c17d1c31bfb7521d65c86ea26ed0de72d5119d119" dependencies = [ "bitcoin_hashes", "cc", @@ -2744,3 +2738,8 @@ name = "zmij" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9747e91771f56fd7893e1164abd78febd14a670ceec257caad15e051de35f06" + +[[patch.unused]] +name = "simplicity-lang" +version = "0.7.0" +source = "git+https://github.com/topologoanatom/rust-simplicity.git?branch=refactor%2Fbit-iter-clone#f84b09d407d2c7712cd0cef23295cf0e59b1336a" diff --git a/Cargo.toml b/Cargo.toml index 27b0553..7071877 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,9 +7,12 @@ members = [ ] [workspace.dependencies] -hal-simplicity = "0.2.0" +hal-simplicity = {path = "../hal-unchained"} clap = { version = "4.5.53", features = ["derive"] } hex = "0.4" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "2.0.17" + +[patch.crates-io] +simplicity = { git = "https://github.com/topologoanatom/rust-simplicity.git", branch = "refactor/bit-iter-clone", package = "simplicity-lang", features = [ "base64", "serde" ] } diff --git a/core/src/jets/bitcoin.rs b/core/src/jets/bitcoin.rs index 09a7aaa..dd3e9d4 100644 --- a/core/src/jets/bitcoin.rs +++ b/core/src/jets/bitcoin.rs @@ -482,7 +482,9 @@ impl Jet for CoreExtension { w.write_bits_be(n, len) } - fn decode>(bits: &mut BitIter) -> Result { + fn decode>( + bits: &mut BitIter, + ) -> Result { decode_bits!(bits, { 0 => { 0 => {CoreExtension::Core(Core::Verify)}, diff --git a/core/src/jets/elements.rs b/core/src/jets/elements.rs index 9ba2050..f726aaf 100644 --- a/core/src/jets/elements.rs +++ b/core/src/jets/elements.rs @@ -1,4 +1,5 @@ use std::io::Write; +use std::mem::MaybeUninit; use std::sync::Arc; use hal_simplicity::simplicity::Cmr; @@ -38,481 +39,52 @@ pub enum ElementsExtension { } impl ElementsExtension { - pub const ALL: [Self; 473] = [ - Self::Elements(Elements::Add16), - Self::Elements(Elements::Add32), - Self::Elements(Elements::Add64), - Self::Elements(Elements::Add8), - Self::Elements(Elements::All16), - Self::Elements(Elements::All32), - Self::Elements(Elements::All64), - Self::Elements(Elements::All8), - Self::Elements(Elements::And1), - Self::Elements(Elements::And16), - Self::Elements(Elements::And32), - Self::Elements(Elements::And64), - Self::Elements(Elements::And8), - Self::Elements(Elements::AnnexHash), - Self::Elements(Elements::AssetAmountHash), - Self::Elements(Elements::Bip0340Verify), - Self::Elements(Elements::BuildTapbranch), - Self::Elements(Elements::BuildTapleafSimplicity), - Self::Elements(Elements::BuildTaptweak), - Self::Elements(Elements::CalculateAsset), - Self::Elements(Elements::CalculateConfidentialToken), - Self::Elements(Elements::CalculateExplicitToken), - Self::Elements(Elements::CalculateIssuanceEntropy), - Self::Elements(Elements::Ch1), - Self::Elements(Elements::Ch16), - Self::Elements(Elements::Ch32), - Self::Elements(Elements::Ch64), - Self::Elements(Elements::Ch8), - Self::Elements(Elements::CheckLockDistance), - Self::Elements(Elements::CheckLockDuration), - Self::Elements(Elements::CheckLockHeight), - Self::Elements(Elements::CheckLockTime), - Self::Elements(Elements::CheckSigVerify), - Self::Elements(Elements::Complement1), - Self::Elements(Elements::Complement16), - Self::Elements(Elements::Complement32), - Self::Elements(Elements::Complement64), - Self::Elements(Elements::Complement8), - Self::Elements(Elements::CurrentAmount), - Self::Elements(Elements::CurrentAnnexHash), - Self::Elements(Elements::CurrentAsset), - Self::Elements(Elements::CurrentIndex), - Self::Elements(Elements::CurrentIssuanceAssetAmount), - Self::Elements(Elements::CurrentIssuanceAssetProof), - Self::Elements(Elements::CurrentIssuanceTokenAmount), - Self::Elements(Elements::CurrentIssuanceTokenProof), - Self::Elements(Elements::CurrentNewIssuanceContract), - Self::Elements(Elements::CurrentPegin), - Self::Elements(Elements::CurrentPrevOutpoint), - Self::Elements(Elements::CurrentReissuanceBlinding), - Self::Elements(Elements::CurrentReissuanceEntropy), - Self::Elements(Elements::CurrentScriptHash), - Self::Elements(Elements::CurrentScriptSigHash), - Self::Elements(Elements::CurrentSequence), - Self::Elements(Elements::Decompress), - Self::Elements(Elements::Decrement16), - Self::Elements(Elements::Decrement32), - Self::Elements(Elements::Decrement64), - Self::Elements(Elements::Decrement8), - Self::Elements(Elements::DivMod128_64), - Self::Elements(Elements::DivMod16), - Self::Elements(Elements::DivMod32), - Self::Elements(Elements::DivMod64), - Self::Elements(Elements::DivMod8), - Self::Elements(Elements::Divide16), - Self::Elements(Elements::Divide32), - Self::Elements(Elements::Divide64), - Self::Elements(Elements::Divide8), - Self::Elements(Elements::Divides16), - Self::Elements(Elements::Divides32), - Self::Elements(Elements::Divides64), - Self::Elements(Elements::Divides8), - Self::Elements(Elements::Eq1), - Self::Elements(Elements::Eq16), - Self::Elements(Elements::Eq256), - Self::Elements(Elements::Eq32), - Self::Elements(Elements::Eq64), - Self::Elements(Elements::Eq8), - Self::Elements(Elements::FeAdd), - Self::Elements(Elements::FeInvert), - Self::Elements(Elements::FeIsOdd), - Self::Elements(Elements::FeIsZero), - Self::Elements(Elements::FeMultiply), - Self::Elements(Elements::FeMultiplyBeta), - Self::Elements(Elements::FeNegate), - Self::Elements(Elements::FeNormalize), - Self::Elements(Elements::FeSquare), - Self::Elements(Elements::FeSquareRoot), - Self::Elements(Elements::FullAdd16), - Self::Elements(Elements::FullAdd32), - Self::Elements(Elements::FullAdd64), - Self::Elements(Elements::FullAdd8), - Self::Elements(Elements::FullDecrement16), - Self::Elements(Elements::FullDecrement32), - Self::Elements(Elements::FullDecrement64), - Self::Elements(Elements::FullDecrement8), - Self::Elements(Elements::FullIncrement16), - Self::Elements(Elements::FullIncrement32), - Self::Elements(Elements::FullIncrement64), - Self::Elements(Elements::FullIncrement8), - Self::Elements(Elements::FullLeftShift16_1), - Self::Elements(Elements::FullLeftShift16_2), - Self::Elements(Elements::FullLeftShift16_4), - Self::Elements(Elements::FullLeftShift16_8), - Self::Elements(Elements::FullLeftShift32_1), - Self::Elements(Elements::FullLeftShift32_16), - Self::Elements(Elements::FullLeftShift32_2), - Self::Elements(Elements::FullLeftShift32_4), - Self::Elements(Elements::FullLeftShift32_8), - Self::Elements(Elements::FullLeftShift64_1), - Self::Elements(Elements::FullLeftShift64_16), - Self::Elements(Elements::FullLeftShift64_2), - Self::Elements(Elements::FullLeftShift64_32), - Self::Elements(Elements::FullLeftShift64_4), - Self::Elements(Elements::FullLeftShift64_8), - Self::Elements(Elements::FullLeftShift8_1), - Self::Elements(Elements::FullLeftShift8_2), - Self::Elements(Elements::FullLeftShift8_4), - Self::Elements(Elements::FullMultiply16), - Self::Elements(Elements::FullMultiply32), - Self::Elements(Elements::FullMultiply64), - Self::Elements(Elements::FullMultiply8), - Self::Elements(Elements::FullRightShift16_1), - Self::Elements(Elements::FullRightShift16_2), - Self::Elements(Elements::FullRightShift16_4), - Self::Elements(Elements::FullRightShift16_8), - Self::Elements(Elements::FullRightShift32_1), - Self::Elements(Elements::FullRightShift32_16), - Self::Elements(Elements::FullRightShift32_2), - Self::Elements(Elements::FullRightShift32_4), - Self::Elements(Elements::FullRightShift32_8), - Self::Elements(Elements::FullRightShift64_1), - Self::Elements(Elements::FullRightShift64_16), - Self::Elements(Elements::FullRightShift64_2), - Self::Elements(Elements::FullRightShift64_32), - Self::Elements(Elements::FullRightShift64_4), - Self::Elements(Elements::FullRightShift64_8), - Self::Elements(Elements::FullRightShift8_1), - Self::Elements(Elements::FullRightShift8_2), - Self::Elements(Elements::FullRightShift8_4), - Self::Elements(Elements::FullSubtract16), - Self::Elements(Elements::FullSubtract32), - Self::Elements(Elements::FullSubtract64), - Self::Elements(Elements::FullSubtract8), - Self::Elements(Elements::GeIsOnCurve), - Self::Elements(Elements::GeNegate), - Self::Elements(Elements::GejAdd), - Self::Elements(Elements::GejDouble), - Self::Elements(Elements::GejEquiv), - Self::Elements(Elements::GejGeAdd), - Self::Elements(Elements::GejGeAddEx), - Self::Elements(Elements::GejGeEquiv), - Self::Elements(Elements::GejInfinity), - Self::Elements(Elements::GejIsInfinity), - Self::Elements(Elements::GejIsOnCurve), - Self::Elements(Elements::GejNegate), - Self::Elements(Elements::GejNormalize), - Self::Elements(Elements::GejRescale), - Self::Elements(Elements::GejXEquiv), - Self::Elements(Elements::GejYIsOdd), - Self::Elements(Elements::Generate), - Self::Elements(Elements::GenesisBlockHash), - Self::Elements(Elements::HashToCurve), - Self::Elements(Elements::High1), - Self::Elements(Elements::High16), - Self::Elements(Elements::High32), - Self::Elements(Elements::High64), - Self::Elements(Elements::High8), - Self::Elements(Elements::Increment16), - Self::Elements(Elements::Increment32), - Self::Elements(Elements::Increment64), - Self::Elements(Elements::Increment8), - Self::Elements(Elements::InputAmount), - Self::Elements(Elements::InputAmountsHash), - Self::Elements(Elements::InputAnnexHash), - Self::Elements(Elements::InputAnnexesHash), - Self::Elements(Elements::InputAsset), - Self::Elements(Elements::InputHash), - Self::Elements(Elements::InputOutpointsHash), - Self::Elements(Elements::InputPegin), - Self::Elements(Elements::InputPrevOutpoint), - Self::Elements(Elements::InputScriptHash), - Self::Elements(Elements::InputScriptSigHash), - Self::Elements(Elements::InputScriptSigsHash), - Self::Elements(Elements::InputScriptsHash), - Self::Elements(Elements::InputSequence), - Self::Elements(Elements::InputSequencesHash), - Self::Elements(Elements::InputUtxoHash), - Self::Elements(Elements::InputUtxosHash), - Self::Elements(Elements::InputsHash), - Self::Elements(Elements::InternalKey), - Self::Elements(Elements::IsOne16), - Self::Elements(Elements::IsOne32), - Self::Elements(Elements::IsOne64), - Self::Elements(Elements::IsOne8), - Self::Elements(Elements::IsZero16), - Self::Elements(Elements::IsZero32), - Self::Elements(Elements::IsZero64), - Self::Elements(Elements::IsZero8), - Self::Elements(Elements::Issuance), - Self::Elements(Elements::IssuanceAsset), - Self::Elements(Elements::IssuanceAssetAmount), - Self::Elements(Elements::IssuanceAssetAmountsHash), - Self::Elements(Elements::IssuanceAssetProof), - Self::Elements(Elements::IssuanceBlindingEntropyHash), - Self::Elements(Elements::IssuanceEntropy), - Self::Elements(Elements::IssuanceHash), - Self::Elements(Elements::IssuanceRangeProofsHash), - Self::Elements(Elements::IssuanceToken), - Self::Elements(Elements::IssuanceTokenAmount), - Self::Elements(Elements::IssuanceTokenAmountsHash), - Self::Elements(Elements::IssuanceTokenProof), - Self::Elements(Elements::IssuancesHash), - Self::Elements(Elements::LbtcAsset), - Self::Elements(Elements::Le16), - Self::Elements(Elements::Le32), - Self::Elements(Elements::Le64), - Self::Elements(Elements::Le8), - Self::Elements(Elements::LeftExtend16_32), - Self::Elements(Elements::LeftExtend16_64), - Self::Elements(Elements::LeftExtend1_16), - Self::Elements(Elements::LeftExtend1_32), - Self::Elements(Elements::LeftExtend1_64), - Self::Elements(Elements::LeftExtend1_8), - Self::Elements(Elements::LeftExtend32_64), - Self::Elements(Elements::LeftExtend8_16), - Self::Elements(Elements::LeftExtend8_32), - Self::Elements(Elements::LeftExtend8_64), - Self::Elements(Elements::LeftPadHigh16_32), - Self::Elements(Elements::LeftPadHigh16_64), - Self::Elements(Elements::LeftPadHigh1_16), - Self::Elements(Elements::LeftPadHigh1_32), - Self::Elements(Elements::LeftPadHigh1_64), - Self::Elements(Elements::LeftPadHigh1_8), - Self::Elements(Elements::LeftPadHigh32_64), - Self::Elements(Elements::LeftPadHigh8_16), - Self::Elements(Elements::LeftPadHigh8_32), - Self::Elements(Elements::LeftPadHigh8_64), - Self::Elements(Elements::LeftPadLow16_32), - Self::Elements(Elements::LeftPadLow16_64), - Self::Elements(Elements::LeftPadLow1_16), - Self::Elements(Elements::LeftPadLow1_32), - Self::Elements(Elements::LeftPadLow1_64), - Self::Elements(Elements::LeftPadLow1_8), - Self::Elements(Elements::LeftPadLow32_64), - Self::Elements(Elements::LeftPadLow8_16), - Self::Elements(Elements::LeftPadLow8_32), - Self::Elements(Elements::LeftPadLow8_64), - Self::Elements(Elements::LeftRotate16), - Self::Elements(Elements::LeftRotate32), - Self::Elements(Elements::LeftRotate64), - Self::Elements(Elements::LeftRotate8), - Self::Elements(Elements::LeftShift16), - Self::Elements(Elements::LeftShift32), - Self::Elements(Elements::LeftShift64), - Self::Elements(Elements::LeftShift8), - Self::Elements(Elements::LeftShiftWith16), - Self::Elements(Elements::LeftShiftWith32), - Self::Elements(Elements::LeftShiftWith64), - Self::Elements(Elements::LeftShiftWith8), - Self::Elements(Elements::Leftmost16_1), - Self::Elements(Elements::Leftmost16_2), - Self::Elements(Elements::Leftmost16_4), - Self::Elements(Elements::Leftmost16_8), - Self::Elements(Elements::Leftmost32_1), - Self::Elements(Elements::Leftmost32_16), - Self::Elements(Elements::Leftmost32_2), - Self::Elements(Elements::Leftmost32_4), - Self::Elements(Elements::Leftmost32_8), - Self::Elements(Elements::Leftmost64_1), - Self::Elements(Elements::Leftmost64_16), - Self::Elements(Elements::Leftmost64_2), - Self::Elements(Elements::Leftmost64_32), - Self::Elements(Elements::Leftmost64_4), - Self::Elements(Elements::Leftmost64_8), - Self::Elements(Elements::Leftmost8_1), - Self::Elements(Elements::Leftmost8_2), - Self::Elements(Elements::Leftmost8_4), - Self::Elements(Elements::LinearCombination1), - Self::Elements(Elements::LinearVerify1), - Self::Elements(Elements::LockTime), - Self::Elements(Elements::Low1), - Self::Elements(Elements::Low16), - Self::Elements(Elements::Low32), - Self::Elements(Elements::Low64), - Self::Elements(Elements::Low8), - Self::Elements(Elements::Lt16), - Self::Elements(Elements::Lt32), - Self::Elements(Elements::Lt64), - Self::Elements(Elements::Lt8), - Self::Elements(Elements::Maj1), - Self::Elements(Elements::Maj16), - Self::Elements(Elements::Maj32), - Self::Elements(Elements::Maj64), - Self::Elements(Elements::Maj8), - Self::Elements(Elements::Max16), - Self::Elements(Elements::Max32), - Self::Elements(Elements::Max64), - Self::Elements(Elements::Max8), - Self::Elements(Elements::Median16), - Self::Elements(Elements::Median32), - Self::Elements(Elements::Median64), - Self::Elements(Elements::Median8), - Self::Elements(Elements::Min16), - Self::Elements(Elements::Min32), - Self::Elements(Elements::Min64), - Self::Elements(Elements::Min8), - Self::Elements(Elements::Modulo16), - Self::Elements(Elements::Modulo32), - Self::Elements(Elements::Modulo64), - Self::Elements(Elements::Modulo8), - Self::Elements(Elements::Multiply16), - Self::Elements(Elements::Multiply32), - Self::Elements(Elements::Multiply64), - Self::Elements(Elements::Multiply8), - Self::Elements(Elements::Negate16), - Self::Elements(Elements::Negate32), - Self::Elements(Elements::Negate64), - Self::Elements(Elements::Negate8), - Self::Elements(Elements::NewIssuanceContract), - Self::Elements(Elements::NonceHash), - Self::Elements(Elements::NumInputs), - Self::Elements(Elements::NumOutputs), - Self::Elements(Elements::One16), - Self::Elements(Elements::One32), - Self::Elements(Elements::One64), - Self::Elements(Elements::One8), - Self::Elements(Elements::Or1), - Self::Elements(Elements::Or16), - Self::Elements(Elements::Or32), - Self::Elements(Elements::Or64), - Self::Elements(Elements::Or8), - Self::Elements(Elements::OutpointHash), - Self::Elements(Elements::OutputAmount), - Self::Elements(Elements::OutputAmountsHash), - Self::Elements(Elements::OutputAsset), - Self::Elements(Elements::OutputHash), - Self::Elements(Elements::OutputIsFee), - Self::Elements(Elements::OutputNonce), - Self::Elements(Elements::OutputNoncesHash), - Self::Elements(Elements::OutputNullDatum), - Self::Elements(Elements::OutputRangeProof), - Self::Elements(Elements::OutputRangeProofsHash), - Self::Elements(Elements::OutputScriptHash), - Self::Elements(Elements::OutputScriptsHash), - Self::Elements(Elements::OutputSurjectionProof), - Self::Elements(Elements::OutputSurjectionProofsHash), - Self::Elements(Elements::OutputsHash), - Self::Elements(Elements::ParseLock), - Self::Elements(Elements::ParseSequence), - Self::Elements(Elements::PointVerify1), - Self::Elements(Elements::ReissuanceBlinding), - Self::Elements(Elements::ReissuanceEntropy), - Self::Elements(Elements::RightExtend16_32), - Self::Elements(Elements::RightExtend16_64), - Self::Elements(Elements::RightExtend32_64), - Self::Elements(Elements::RightExtend8_16), - Self::Elements(Elements::RightExtend8_32), - Self::Elements(Elements::RightExtend8_64), - Self::Elements(Elements::RightPadHigh16_32), - Self::Elements(Elements::RightPadHigh16_64), - Self::Elements(Elements::RightPadHigh1_16), - Self::Elements(Elements::RightPadHigh1_32), - Self::Elements(Elements::RightPadHigh1_64), - Self::Elements(Elements::RightPadHigh1_8), - Self::Elements(Elements::RightPadHigh32_64), - Self::Elements(Elements::RightPadHigh8_16), - Self::Elements(Elements::RightPadHigh8_32), - Self::Elements(Elements::RightPadHigh8_64), - Self::Elements(Elements::RightPadLow16_32), - Self::Elements(Elements::RightPadLow16_64), - Self::Elements(Elements::RightPadLow1_16), - Self::Elements(Elements::RightPadLow1_32), - Self::Elements(Elements::RightPadLow1_64), - Self::Elements(Elements::RightPadLow1_8), - Self::Elements(Elements::RightPadLow32_64), - Self::Elements(Elements::RightPadLow8_16), - Self::Elements(Elements::RightPadLow8_32), - Self::Elements(Elements::RightPadLow8_64), - Self::Elements(Elements::RightRotate16), - Self::Elements(Elements::RightRotate32), - Self::Elements(Elements::RightRotate64), - Self::Elements(Elements::RightRotate8), - Self::Elements(Elements::RightShift16), - Self::Elements(Elements::RightShift32), - Self::Elements(Elements::RightShift64), - Self::Elements(Elements::RightShift8), - Self::Elements(Elements::RightShiftWith16), - Self::Elements(Elements::RightShiftWith32), - Self::Elements(Elements::RightShiftWith64), - Self::Elements(Elements::RightShiftWith8), - Self::Elements(Elements::Rightmost16_1), - Self::Elements(Elements::Rightmost16_2), - Self::Elements(Elements::Rightmost16_4), - Self::Elements(Elements::Rightmost16_8), - Self::Elements(Elements::Rightmost32_1), - Self::Elements(Elements::Rightmost32_16), - Self::Elements(Elements::Rightmost32_2), - Self::Elements(Elements::Rightmost32_4), - Self::Elements(Elements::Rightmost32_8), - Self::Elements(Elements::Rightmost64_1), - Self::Elements(Elements::Rightmost64_16), - Self::Elements(Elements::Rightmost64_2), - Self::Elements(Elements::Rightmost64_32), - Self::Elements(Elements::Rightmost64_4), - Self::Elements(Elements::Rightmost64_8), - Self::Elements(Elements::Rightmost8_1), - Self::Elements(Elements::Rightmost8_2), - Self::Elements(Elements::Rightmost8_4), - Self::Elements(Elements::ScalarAdd), - Self::Elements(Elements::ScalarInvert), - Self::Elements(Elements::ScalarIsZero), - Self::Elements(Elements::ScalarMultiply), - Self::Elements(Elements::ScalarMultiplyLambda), - Self::Elements(Elements::ScalarNegate), - Self::Elements(Elements::ScalarNormalize), - Self::Elements(Elements::ScalarSquare), - Self::Elements(Elements::Scale), - Self::Elements(Elements::ScriptCMR), - Self::Elements(Elements::Sha256Block), - Self::Elements(Elements::Sha256Ctx8Add1), - Self::Elements(Elements::Sha256Ctx8Add128), - Self::Elements(Elements::Sha256Ctx8Add16), - Self::Elements(Elements::Sha256Ctx8Add2), - Self::Elements(Elements::Sha256Ctx8Add256), - Self::Elements(Elements::Sha256Ctx8Add32), - Self::Elements(Elements::Sha256Ctx8Add4), - Self::Elements(Elements::Sha256Ctx8Add512), - Self::Elements(Elements::Sha256Ctx8Add64), - Self::Elements(Elements::Sha256Ctx8Add8), - Self::Elements(Elements::Sha256Ctx8AddBuffer511), - Self::Elements(Elements::Sha256Ctx8Finalize), - Self::Elements(Elements::Sha256Ctx8Init), - Self::Elements(Elements::Sha256Iv), - Self::Elements(Elements::SigAllHash), - Self::Elements(Elements::Some1), - Self::Elements(Elements::Some16), - Self::Elements(Elements::Some32), - Self::Elements(Elements::Some64), - Self::Elements(Elements::Some8), - Self::Elements(Elements::Subtract16), - Self::Elements(Elements::Subtract32), - Self::Elements(Elements::Subtract64), - Self::Elements(Elements::Subtract8), - Self::Elements(Elements::Swu), - Self::Elements(Elements::TapEnvHash), - Self::Elements(Elements::TapdataInit), - Self::Elements(Elements::TapleafHash), - Self::Elements(Elements::TapleafVersion), - Self::Elements(Elements::Tappath), - Self::Elements(Elements::TappathHash), - Self::Elements(Elements::TotalFee), - Self::Elements(Elements::TransactionId), - Self::Elements(Elements::TxHash), - Self::Elements(Elements::TxIsFinal), - Self::Elements(Elements::TxLockDistance), - Self::Elements(Elements::TxLockDuration), - Self::Elements(Elements::TxLockHeight), - Self::Elements(Elements::TxLockTime), - Self::Elements(Elements::Verify), - Self::Elements(Elements::Version), - Self::Elements(Elements::Xor1), - Self::Elements(Elements::Xor16), - Self::Elements(Elements::Xor32), - Self::Elements(Elements::Xor64), - Self::Elements(Elements::Xor8), - Self::Elements(Elements::XorXor1), - Self::Elements(Elements::XorXor16), - Self::Elements(Elements::XorXor32), - Self::Elements(Elements::XorXor64), - Self::Elements(Elements::XorXor8), - Self::GetOpcodeFromScript, - Self::GetPubkeyFromScript, - ]; + pub const ALL: [Self; Self::ALL_JETS_NUM] = Self::build_all_variants(); + + const ALL_JETS_NUM: usize = Elements::ALL.len() + 2; + + const fn build_all_variants() -> [Self; Self::ALL_JETS_NUM] { + // Maybe worth adding Uninit field to enum or use one of available enum variants to avoid unsafe code + struct AllVariantsBuilder { + data: [MaybeUninit; ElementsExtension::ALL_JETS_NUM], + len: usize, + } + + impl AllVariantsBuilder { + const fn new() -> Self { + Self { + data: [MaybeUninit::uninit(); ElementsExtension::ALL_JETS_NUM], + len: 0, + } + } + + const fn push(&mut self, item: ElementsExtension) { + assert!(self.len < self.data.len()); + + self.data[self.len].write(item); + self.len += 1; + } + + const fn finalize(self) -> [ElementsExtension; ElementsExtension::ALL_JETS_NUM] { + assert!(self.len == ElementsExtension::ALL_JETS_NUM); + + unsafe { std::mem::transmute(self.data) } + } + } + + let mut builder = AllVariantsBuilder::new(); + let mut i = 0; + + while i < Elements::ALL.len() { + builder.push(ElementsExtension::Elements(Elements::ALL[i])); + i += 1; + } + + builder.push(ElementsExtension::GetOpcodeFromScript); + builder.push(ElementsExtension::GetPubkeyFromScript); + + builder.finalize() + } } impl Jet for ElementsExtension { @@ -589,2655 +161,30 @@ impl Jet for ElementsExtension { w.write_bits_be(n, len) } - fn decode>(bits: &mut BitIter) -> Result { - decode_bits!(bits, { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Verify)}, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Low1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Low8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Low16)}, - 1 => {ElementsExtension::Elements(Elements::Low32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Low64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::High1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::High8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::High16)}, - 1 => {ElementsExtension::Elements(Elements::High32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::High64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Complement1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Complement8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Complement16)}, - 1 => {ElementsExtension::Elements(Elements::Complement32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Complement64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::And1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::And8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::And16)}, - 1 => {ElementsExtension::Elements(Elements::And32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::And64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Or1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Or8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Or16)}, - 1 => {ElementsExtension::Elements(Elements::Or32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Or64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Xor1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Xor8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Xor16)}, - 1 => {ElementsExtension::Elements(Elements::Xor32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Xor64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Maj1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Maj8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Maj16)}, - 1 => {ElementsExtension::Elements(Elements::Maj32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Maj64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::XorXor1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::XorXor8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::XorXor16)}, - 1 => {ElementsExtension::Elements(Elements::XorXor32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::XorXor64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Ch1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Ch8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Ch16)}, - 1 => {ElementsExtension::Elements(Elements::Ch32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Ch64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Some1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Some8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Some16)}, - 1 => {ElementsExtension::Elements(Elements::Some32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Some64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::All8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::All16)}, - 1 => {ElementsExtension::Elements(Elements::All32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::All64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Eq1)}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Eq8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Eq16)}, - 1 => {ElementsExtension::Elements(Elements::Eq32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Eq64)}, - 1 => {} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Eq256)}, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift8_1)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift16_1)}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift32_1)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift64_1)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift8_2)}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift16_2)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift32_2)}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift64_2)} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift8_4)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift16_4)}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift32_4)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift64_4)}, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift16_8)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift32_8)}, - 1 => {ElementsExtension::Elements(Elements::FullLeftShift64_8)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift32_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift64_16)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullLeftShift64_32)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift8_1)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift16_1)}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift32_1)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift64_1)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift8_2)}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift16_2)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift32_2)}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift64_2)} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift8_4)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift16_4)}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift32_4)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift64_4)}, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift16_8)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift32_8)}, - 1 => {ElementsExtension::Elements(Elements::FullRightShift64_8)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift32_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift64_16)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullRightShift64_32)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Leftmost8_1)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost16_1)}, - 1 => {ElementsExtension::Elements(Elements::Leftmost32_1)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost64_1)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost8_2)}, - 1 => {ElementsExtension::Elements(Elements::Leftmost16_2)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost32_2)}, - 1 => {ElementsExtension::Elements(Elements::Leftmost64_2)} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost8_4)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost16_4)}, - 1 => {ElementsExtension::Elements(Elements::Leftmost32_4)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost64_4)}, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost16_8)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost32_8)}, - 1 => {ElementsExtension::Elements(Elements::Leftmost64_8)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost32_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost64_16)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Leftmost64_32)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Rightmost8_1)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost16_1)}, - 1 => {ElementsExtension::Elements(Elements::Rightmost32_1)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost64_1)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost8_2)}, - 1 => {ElementsExtension::Elements(Elements::Rightmost16_2)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost32_2)}, - 1 => {ElementsExtension::Elements(Elements::Rightmost64_2)} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost8_4)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost16_4)}, - 1 => {ElementsExtension::Elements(Elements::Rightmost32_4)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost64_4)}, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost16_8)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost32_8)}, - 1 => {ElementsExtension::Elements(Elements::Rightmost64_8)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost32_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost64_16)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Rightmost64_32)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftPadLow1_8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow1_16)}, - 1 => {ElementsExtension::Elements(Elements::LeftPadLow1_32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow1_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow8_32)}, - 1 => {ElementsExtension::Elements(Elements::LeftPadLow8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadLow32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftPadHigh1_8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh1_16)}, - 1 => {ElementsExtension::Elements(Elements::LeftPadHigh1_32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh1_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh8_32)}, - 1 => {ElementsExtension::Elements(Elements::LeftPadHigh8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftPadHigh32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftExtend1_8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend1_16)}, - 1 => {ElementsExtension::Elements(Elements::LeftExtend1_32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend1_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend8_32)}, - 1 => {ElementsExtension::Elements(Elements::LeftExtend8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftExtend32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::RightPadLow1_8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow1_16)}, - 1 => {ElementsExtension::Elements(Elements::RightPadLow1_32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow1_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow8_32)}, - 1 => {ElementsExtension::Elements(Elements::RightPadLow8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadLow32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::RightPadHigh1_8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh1_16)}, - 1 => {ElementsExtension::Elements(Elements::RightPadHigh1_32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh1_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh8_32)}, - 1 => {ElementsExtension::Elements(Elements::RightPadHigh8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightPadHigh32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightExtend8_16)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightExtend8_32)}, - 1 => {ElementsExtension::Elements(Elements::RightExtend8_64)} - }, - 1 => {} - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightExtend16_32)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightExtend16_64)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightExtend32_64)}, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftShiftWith8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftShiftWith16)}, - 1 => {ElementsExtension::Elements(Elements::LeftShiftWith32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftShiftWith64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::RightShiftWith8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightShiftWith16)}, - 1 => {ElementsExtension::Elements(Elements::RightShiftWith32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightShiftWith64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftShift8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftShift16)}, - 1 => {ElementsExtension::Elements(Elements::LeftShift32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftShift64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::RightShift8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightShift16)}, - 1 => {ElementsExtension::Elements(Elements::RightShift32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightShift64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::LeftRotate8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LeftRotate16)}, - 1 => {ElementsExtension::Elements(Elements::LeftRotate32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LeftRotate64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::RightRotate8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::RightRotate16)}, - 1 => {ElementsExtension::Elements(Elements::RightRotate32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::RightRotate64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => {} - } - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::One8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::One16)}, - 1 => {ElementsExtension::Elements(Elements::One32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::One64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullAdd8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullAdd16)}, - 1 => {ElementsExtension::Elements(Elements::FullAdd32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullAdd64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Add8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Add16)}, - 1 => {ElementsExtension::Elements(Elements::Add32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Add64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullIncrement8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullIncrement16)}, - 1 => {ElementsExtension::Elements(Elements::FullIncrement32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullIncrement64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Increment8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Increment16)}, - 1 => {ElementsExtension::Elements(Elements::Increment32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Increment64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullSubtract8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullSubtract16)}, - 1 => {ElementsExtension::Elements(Elements::FullSubtract32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullSubtract64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Subtract8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Subtract16)}, - 1 => {ElementsExtension::Elements(Elements::Subtract32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Subtract64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Negate8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Negate16)}, - 1 => {ElementsExtension::Elements(Elements::Negate32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Negate64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullDecrement8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullDecrement16)}, - 1 => {ElementsExtension::Elements(Elements::FullDecrement32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullDecrement64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Decrement8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Decrement16)}, - 1 => {ElementsExtension::Elements(Elements::Decrement32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Decrement64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FullMultiply8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FullMultiply16)}, - 1 => {ElementsExtension::Elements(Elements::FullMultiply32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FullMultiply64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Multiply8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Multiply16)}, - 1 => {ElementsExtension::Elements(Elements::Multiply32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Multiply64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::IsZero8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IsZero16)}, - 1 => {ElementsExtension::Elements(Elements::IsZero32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::IsZero64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::IsOne8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IsOne16)}, - 1 => {ElementsExtension::Elements(Elements::IsOne32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::IsOne64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Le8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Le16)}, - 1 => {ElementsExtension::Elements(Elements::Le32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Le64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Lt8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Lt16)}, - 1 => {ElementsExtension::Elements(Elements::Lt32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Lt64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Min8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Min16)}, - 1 => {ElementsExtension::Elements(Elements::Min32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Min64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Max8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Max16)}, - 1 => {ElementsExtension::Elements(Elements::Max32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Max64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Median8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Median16)}, - 1 => {ElementsExtension::Elements(Elements::Median32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Median64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => {ElementsExtension::Elements(Elements::DivMod128_64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::DivMod8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::DivMod16)}, - 1 => {ElementsExtension::Elements(Elements::DivMod32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::DivMod64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Divide8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Divide16)}, - 1 => {ElementsExtension::Elements(Elements::Divide32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Divide64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Modulo8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Modulo16)}, - 1 => {ElementsExtension::Elements(Elements::Modulo32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Modulo64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::Divides8)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Divides16)}, - 1 => {ElementsExtension::Elements(Elements::Divides32)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Divides64)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Block)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Iv)}, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add1)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add2)}, - 1 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add4)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add8)}, - 1 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add16)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add32)}, - 1 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add64)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add128)}, - 1 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add256)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Add512)}, - 1 => {} - } - }, - 1 => {} - } - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8AddBuffer511)}, - 1 => {ElementsExtension::Elements(Elements::Sha256Ctx8Finalize)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Sha256Ctx8Init)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => {} - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::PointVerify1)}, - 1 => {} - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Decompress)}, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LinearVerify1)}, - 1 => {} - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::LinearCombination1)}, - 1 => {} - }, - 1 => {ElementsExtension::Elements(Elements::Scale)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Generate)}, - 1 => {ElementsExtension::Elements(Elements::GejInfinity)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::GejNormalize)}, - 1 => {ElementsExtension::Elements(Elements::GejNegate)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::GeNegate)}, - 1 => {ElementsExtension::Elements(Elements::GejDouble)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::GejAdd)}, - 1 => {ElementsExtension::Elements(Elements::GejGeAddEx)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::GejGeAdd)}, - 1 => {ElementsExtension::Elements(Elements::GejRescale)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::GejIsInfinity)}, - 1 => {ElementsExtension::Elements(Elements::GejEquiv)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::GejGeEquiv)}, - 1 => {ElementsExtension::Elements(Elements::GejXEquiv)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::GejYIsOdd)}, - 1 => {ElementsExtension::Elements(Elements::GejIsOnCurve)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::GeIsOnCurve)}, - 1 => {ElementsExtension::Elements(Elements::ScalarNormalize)} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::ScalarNegate)}, - 1 => {ElementsExtension::Elements(Elements::ScalarAdd)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::ScalarSquare)}, - 1 => {ElementsExtension::Elements(Elements::ScalarMultiply)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::ScalarMultiplyLambda)}, - 1 => {ElementsExtension::Elements(Elements::ScalarInvert)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::ScalarIsZero)}, - 1 => {} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {}, - 1 => { - 0 => {}, - 1 => {ElementsExtension::Elements(Elements::FeNormalize)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FeNegate)}, - 1 => {ElementsExtension::Elements(Elements::FeAdd)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FeSquare)}, - 1 => {ElementsExtension::Elements(Elements::FeMultiply)} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FeMultiplyBeta)}, - 1 => {ElementsExtension::Elements(Elements::FeInvert)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::FeSquareRoot)}, - 1 => {ElementsExtension::Elements(Elements::FeIsZero)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::FeIsOdd)}, - 1 => {} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::HashToCurve)}, - 1 => {ElementsExtension::Elements(Elements::Swu)} - } - } - } - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CheckSigVerify)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Bip0340Verify)}, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => { - 0 => {}, - 1 => { - 0 => {ElementsExtension::Elements(Elements::ParseLock)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::ParseSequence)}, - 1 => {ElementsExtension::Elements(Elements::TapdataInit)} - }, - 1 => {} - } - } - } - }, - 1 => {} - }, - 1 => {} - } - } - }, + fn decode + Clone>( + bits: &mut BitIter, + ) -> Result { + let (mut elements_iter, mut custom_iter) = (bits.clone(), bits.clone()); + let bits_read = bits.n_total_read(); + + let try_elements = Elements::decode(&mut elements_iter); + + if let Ok(jet) = try_elements { + for _ in 0..(elements_iter.n_total_read() - bits_read) { + bits.next(); + } + return Ok(ElementsExtension::Elements(jet)); + } + + let custom_iter_ref = &mut custom_iter; + let try_custom = decode_bits!(custom_iter_ref, { + 0 => {}, 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::SigAllHash)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::TxHash)}, - 1 => {ElementsExtension::Elements(Elements::TapEnvHash)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::OutputsHash)}, - 1 => {ElementsExtension::Elements(Elements::InputsHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::IssuancesHash)}, - 1 => {ElementsExtension::Elements(Elements::InputUtxosHash)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::OutputHash)}, - 1 => {ElementsExtension::Elements(Elements::OutputAmountsHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::OutputScriptsHash)}, - 1 => {ElementsExtension::Elements(Elements::OutputNoncesHash)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::OutputRangeProofsHash)}, - 1 => {ElementsExtension::Elements(Elements::OutputSurjectionProofsHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::InputHash)}, - 1 => {ElementsExtension::Elements(Elements::InputOutpointsHash)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::InputSequencesHash)}, - 1 => {ElementsExtension::Elements(Elements::InputAnnexesHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::InputScriptSigsHash)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceHash)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceAssetAmountsHash)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceTokenAmountsHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceRangeProofsHash)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceBlindingEntropyHash)} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::InputUtxoHash)}, - 1 => {ElementsExtension::Elements(Elements::InputAmountsHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::InputScriptsHash)}, - 1 => {ElementsExtension::Elements(Elements::TapleafHash)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::TappathHash)}, - 1 => {ElementsExtension::Elements(Elements::OutpointHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::AssetAmountHash)}, - 1 => {ElementsExtension::Elements(Elements::NonceHash)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::AnnexHash)}, - 1 => {ElementsExtension::Elements(Elements::BuildTapleafSimplicity)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::BuildTapbranch)}, - 1 => {ElementsExtension::Elements(Elements::BuildTaptweak)} - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, + 0 => {}, 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CheckLockHeight)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CheckLockTime)}, - 1 => {ElementsExtension::Elements(Elements::CheckLockDistance)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CheckLockDuration)}, - 1 => {ElementsExtension::Elements(Elements::TxLockHeight)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::TxLockTime)}, - 1 => {ElementsExtension::Elements(Elements::TxLockDistance)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::TxLockDuration)}, - 1 => {ElementsExtension::Elements(Elements::TxIsFinal)} - }, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - } - } - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::Issuance)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceAsset)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceToken)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceEntropy)}, - 1 => {ElementsExtension::Elements(Elements::CalculateIssuanceEntropy)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CalculateAsset)}, - 1 => {ElementsExtension::Elements(Elements::CalculateExplicitToken)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CalculateConfidentialToken)}, - 1 => {ElementsExtension::Elements(Elements::LbtcAsset)} - }, - 1 => {} - }, - 1 => {} - } - }, - 1 => {} - } - } - } - }, + 0 => {}, 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::ScriptCMR)}, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::InternalKey)}, - 1 => {ElementsExtension::Elements(Elements::CurrentIndex)} - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::NumInputs)}, - 1 => {ElementsExtension::Elements(Elements::NumOutputs)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::LockTime)}, - 1 => {ElementsExtension::Elements(Elements::OutputAsset)} - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::OutputAmount)}, - 1 => {ElementsExtension::Elements(Elements::OutputNonce)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::OutputScriptHash)}, - 1 => {ElementsExtension::Elements(Elements::OutputNullDatum)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::OutputIsFee)}, - 1 => {ElementsExtension::Elements(Elements::OutputSurjectionProof)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::OutputRangeProof)}, - 1 => {ElementsExtension::Elements(Elements::TotalFee)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CurrentPegin)}, - 1 => {ElementsExtension::Elements(Elements::CurrentPrevOutpoint)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CurrentAsset)}, - 1 => {ElementsExtension::Elements(Elements::CurrentAmount)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CurrentScriptHash)}, - 1 => {ElementsExtension::Elements(Elements::CurrentSequence)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CurrentAnnexHash)}, - 1 => {ElementsExtension::Elements(Elements::CurrentScriptSigHash)} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CurrentReissuanceBlinding)}, - 1 => {ElementsExtension::Elements(Elements::CurrentNewIssuanceContract)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CurrentReissuanceEntropy)}, - 1 => {ElementsExtension::Elements(Elements::CurrentIssuanceAssetAmount)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::CurrentIssuanceTokenAmount)}, - 1 => {ElementsExtension::Elements(Elements::CurrentIssuanceAssetProof)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::CurrentIssuanceTokenProof)}, - 1 => {ElementsExtension::Elements(Elements::InputPegin)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::InputPrevOutpoint)}, - 1 => {ElementsExtension::Elements(Elements::InputAsset)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::InputAmount)}, - 1 => {ElementsExtension::Elements(Elements::InputScriptHash)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::InputSequence)}, - 1 => {ElementsExtension::Elements(Elements::InputAnnexHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::InputScriptSigHash)}, - 1 => {ElementsExtension::Elements(Elements::ReissuanceBlinding)} - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::NewIssuanceContract)}, - 1 => {ElementsExtension::Elements(Elements::ReissuanceEntropy)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceAssetAmount)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceTokenAmount)} - } - }, - 1 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::IssuanceAssetProof)}, - 1 => {ElementsExtension::Elements(Elements::IssuanceTokenProof)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::TapleafVersion)}, - 1 => {ElementsExtension::Elements(Elements::Tappath)} - } - } - } - }, - 1 => { - 0 => { - 0 => { - 0 => { - 0 => {ElementsExtension::Elements(Elements::Version)}, - 1 => {ElementsExtension::Elements(Elements::GenesisBlockHash)} - }, - 1 => { - 0 => {ElementsExtension::Elements(Elements::TransactionId)}, - 1 => {} - } - }, - 1 => {} - }, - 1 => {} - } - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - } - } - } - }, - 1 => {} - }, - 1 => {} - }, - 1 => {} - }, + 0 => {}, 1 => { 0 => {}, // Free path 1 => { @@ -3251,7 +198,14 @@ impl Jet for ElementsExtension { } } } - }) + }); + + if try_custom.is_ok() { + for _ in 0..(custom_iter.n_total_read() - bits_read) { + bits.next(); + } + } + try_custom } fn c_jet_ptr(&self) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool { @@ -3811,4 +765,4 @@ jet_wrappers! { XorXor32, XorXor64, XorXor8, -} +} \ No newline at end of file