From f53631bbeb6f07515e3e0f83e4b550881f1b0631 Mon Sep 17 00:00:00 2001 From: Adrian Brink Date: Sat, 11 Nov 2023 21:07:58 +0100 Subject: [PATCH 01/11] Starting 0.26.1 From 1b41d0c07bc757f8b0a49c4e3a8eff2d50b07b79 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 14:59:19 +0100 Subject: [PATCH 02/11] Moves masp vp to native --- apps/src/lib/client/rpc.rs | 16 +- apps/src/lib/config/genesis/chain.rs | 4 +- apps/src/lib/node/ledger/shell/init_chain.rs | 7 +- core/src/ledger/gas.rs | 2 + core/src/ledger/ibc/mod.rs | 4 +- core/src/ledger/storage/masp_conversions.rs | 6 +- core/src/ledger/storage/mod.rs | 4 +- core/src/ledger/vp_env.rs | 5 +- core/src/types/address.rs | 21 +- core/src/types/address/raw.rs | 2 + core/src/types/masp.rs | 6 +- core/src/types/token.rs | 4 +- core/src/types/transaction/wrapper.rs | 4 +- sdk/src/masp.rs | 10 +- sdk/src/signing.rs | 25 +- sdk/src/tx.rs | 6 +- shared/src/ledger/native_vp/ibc/context.rs | 4 +- shared/src/ledger/native_vp/masp.rs | 300 +++++++++++++++++++ shared/src/ledger/native_vp/mod.rs | 5 +- shared/src/ledger/protocol/mod.rs | 13 + shared/src/vm/host_env.rs | 38 +-- shared/src/vm/wasm/host_env.rs | 1 - tx_prelude/src/token.rs | 4 +- vm_env/src/lib.rs | 2 - vp_prelude/src/lib.rs | 6 - wasm/wasm_source/Cargo.toml | 1 - wasm/wasm_source/Makefile | 1 - wasm/wasm_source/src/lib.rs | 2 - wasm/wasm_source/src/vp_masp.rs | 252 ---------------- 29 files changed, 387 insertions(+), 368 deletions(-) create mode 100644 shared/src/ledger/native_vp/masp.rs delete mode 100644 wasm/wasm_source/src/vp_masp.rs diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 2cfb817bf6..34e88f7fab 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -39,7 +39,7 @@ use namada::ledger::pos::PosParams; use namada::ledger::queries::RPC; use namada::ledger::storage::ConversionState; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; -use namada::types::address::{masp, Address, InternalAddress}; +use namada::types::address::{Address, InternalAddress, MASP}; use namada::types::hash::Hash; use namada::types::ibc::{is_ibc_denom, IbcTokenHash}; use namada::types::io::Io; @@ -203,7 +203,7 @@ pub async fn query_transfers<'a>( ); // Display the transparent changes first for (account, MaspChange { ref asset, change }) in tfer_delta { - if account != masp() { + if account != MASP { display!(context.io(), " {}:", account); let token_alias = lookup_token_alias(context, asset, &account).await; @@ -230,7 +230,7 @@ pub async fn query_transfers<'a>( display!(context.io(), " {}:", fvk_map[&account]); for (token_addr, val) in masp_change { let token_alias = - lookup_token_alias(context, &token_addr, &masp()).await; + lookup_token_alias(context, &token_addr, &MASP).await; let sign = match val.cmp(&Change::zero()) { Ordering::Greater => "+", Ordering::Less => "-", @@ -528,7 +528,7 @@ pub async fn query_pinned_balance<'a>( .format_amount(token_addr, (*value).into()) .await; let token_alias = - lookup_token_alias(context, token_addr, &masp()).await; + lookup_token_alias(context, token_addr, &MASP).await; display_line!( context.io(), " {}: {}", @@ -821,7 +821,7 @@ pub async fn query_shielded_balance<'a>( // Here the user wants to know the balance for a specific token (Some(base_token), true) => { let tokens = - query_tokens(context, Some(&base_token), Some(&masp())).await; + query_tokens(context, Some(&base_token), Some(&MASP)).await; for (token_alias, token) in tokens { // Query the multi-asset balance at the given spending key let viewing_key = @@ -939,7 +939,7 @@ pub async fn query_shielded_balance<'a>( } for ((fvk, token), token_balance) in balance_map { // Only assets with the current timestamp count - let alias = lookup_token_alias(context, &token, &masp()).await; + let alias = lookup_token_alias(context, &token, &MASP).await; display_line!(context.io(), "Shielded Token {}:", alias); let formatted = context.format_amount(&token, token_balance.into()).await; @@ -1066,7 +1066,7 @@ pub async fn print_decoded_balance<'a>( display_line!( context.io(), "{} : {}", - lookup_token_alias(context, token_addr, &masp()).await, + lookup_token_alias(context, token_addr, &MASP).await, context.format_amount(token_addr, (*amount).into()).await, ); } @@ -2335,7 +2335,7 @@ pub async fn query_conversions<'a>( .wallet() .await .get_addresses_with_vp_type(AddressVpType::Token); - let masp_addr = masp(); + let masp_addr = MASP; let key_prefix: Key = masp_addr.to_db_key().into(); let state_key = key_prefix .push(&(token::CONVERSION_KEY_PREFIX.to_owned())) diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index 0f7b9cdd7e..bab430d4b1 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -5,7 +5,7 @@ use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; use namada::ledger::parameters::EpochDuration; -use namada::types::address::{masp, Address, EstablishedAddressGen}; +use namada::types::address::{Address, EstablishedAddressGen, MASP}; use namada::types::chain::{ChainId, ChainIdPrefix}; use namada::types::dec::Dec; use namada::types::hash::Hash; @@ -410,7 +410,7 @@ impl Finalized { pub fn get_user_address(&self, alias: &Alias) -> Option
{ if alias.to_string() == *"masp" { - return Some(masp()); + return Some(MASP); } let established = self.transactions.established_account.as_ref()?; let validators = self.transactions.validator_account.as_ref()?; diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index e14b74da2d..f33f655a45 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -293,7 +293,7 @@ where .insert(alias, address.clone()); } } - let key_prefix: Key = address::masp().to_db_key().into(); + let key_prefix: Key = address::MASP.to_db_key().into(); // Save the current conversion state let state_key = key_prefix .push(&(token::CONVERSION_KEY_PREFIX.to_owned())) @@ -355,11 +355,6 @@ where genesis: &genesis::chain::Finalized, vp_cache: &mut HashMap>, ) { - let vp_code = self.lookup_vp("vp_masp", genesis, vp_cache); - let code_hash = CodeHash::sha256(&vp_code); - self.wl_storage - .write_bytes(&Key::validity_predicate(&address::masp()), code_hash) - .unwrap(); if let Some(txs) = genesis.transactions.established_account.as_ref() { for FinalizedEstablishedAccountTx { address, diff --git a/core/src/ledger/gas.rs b/core/src/ledger/gas.rs index 0fefccd983..092c0ba3b2 100644 --- a/core/src/ledger/gas.rs +++ b/core/src/ledger/gas.rs @@ -53,6 +53,8 @@ pub const WASM_MEMORY_PAGE_GAS: u32 = pub const IBC_ACTION_VALIDATE_GAS: u64 = 7_511; /// The cost to execute an Ibc action pub const IBC_ACTION_EXECUTE_GAS: u64 = 47_452; +/// The cost to execute a masp tx verification +pub const MASP_VERIFY_SHIELDED_TX_GAS: u64 = 62_381_957; /// Gas module result for functions that may fail pub type Result = std::result::Result; diff --git a/core/src/ledger/ibc/mod.rs b/core/src/ledger/ibc/mod.rs index cf0962cdbd..2a4919100e 100644 --- a/core/src/ledger/ibc/mod.rs +++ b/core/src/ledger/ibc/mod.rs @@ -31,7 +31,7 @@ use crate::ibc::core::ics24_host::identifier::{ use crate::ibc::core::router::ModuleId; use crate::ibc::core::{execute, validate, MsgEnvelope, RouterError}; use crate::ibc_proto::google::protobuf::Any; -use crate::types::address::{masp, Address}; +use crate::types::address::{Address, MASP}; use crate::types::ibc::{ get_shielded_transfer, is_ibc_denom, EVENT_TYPE_DENOM_TRACE, EVENT_TYPE_PACKET, @@ -190,7 +190,7 @@ where .or_else(|_| { // Replace it with MASP address when the receiver is a // payment address - PaymentAddress::from_str(receiver).map(|_| masp()) + PaymentAddress::from_str(receiver).map(|_| MASP) }) .map_err(|_| { Error::Denom(format!( diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index 5cbbca570a..87f9095dcb 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -13,7 +13,7 @@ use crate::ledger::inflation::{RewardsController, ValsToUpdate}; use crate::ledger::parameters; use crate::ledger::storage_api::token::read_denom; use crate::ledger::storage_api::{StorageRead, StorageWrite}; -use crate::types::address::Address; +use crate::types::address::{Address, MASP}; use crate::types::dec::Dec; use crate::types::storage::Epoch; use crate::types::token::MaspDenom; @@ -58,7 +58,7 @@ where // a thousandth of the given asset. let precision = 10u128.pow(std::cmp::max(u32::from(denomination.0), 3) - 3); - let masp_addr = address::masp(); + let masp_addr = MASP; // Query the storage for information //// information about the amount of tokens on the chain @@ -213,7 +213,7 @@ where use crate::types::storage::{self, KeySeg}; // The derived conversions will be placed in MASP address space - let masp_addr = address::masp(); + let masp_addr = MASP; let key_prefix: storage::Key = masp_addr.to_db_key().into(); let tokens = address::tokens(); diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index d12352ee71..999a0cbe93 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -41,7 +41,7 @@ use crate::ledger::storage::merkle_tree::{ }; use crate::tendermint::merkle::proof::ProofOps; use crate::types::address::{ - masp, Address, EstablishedAddressGen, InternalAddress, + Address, EstablishedAddressGen, InternalAddress, MASP, }; use crate::types::chain::{ChainId, CHAIN_ID_LENGTH}; use crate::types::hash::{Error as HashError, Hash}; @@ -491,7 +491,7 @@ where .or_else(|_| self.rebuild_full_merkle_tree(height))?; if self.block.height.0 > 0 { // The derived conversions will be placed in MASP address space - let masp_addr = masp(); + let masp_addr = MASP; let key_prefix: Key = masp_addr.to_db_key().into(); // Load up the conversions currently being given as query // results diff --git a/core/src/ledger/vp_env.rs b/core/src/ledger/vp_env.rs index 1241adfed7..664e030786 100644 --- a/core/src/ledger/vp_env.rs +++ b/core/src/ledger/vp_env.rs @@ -109,7 +109,7 @@ where /// Get the shielded action including the transfer and the masp tx fn get_shielded_action( &self, - tx_data: Tx, + tx_data: &Tx, ) -> Result<(Transfer, Transaction), storage_api::Error> { let signed = tx_data; if let Ok(transfer) = @@ -143,9 +143,6 @@ where }) } - /// Verify a MASP transaction - fn verify_masp(&self, tx: Vec) -> Result; - /// Charge the provided gas for the current vp fn charge_gas(&self, used_gas: u64) -> Result<(), storage_api::Error>; diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 8656ee0598..f865895f80 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -60,6 +60,8 @@ pub const POS_SLASH_POOL: Address = Address::Internal(InternalAddress::PosSlashPool); /// Internal Governance address pub const GOV: Address = Address::Internal(InternalAddress::Governance); +/// Internal MASP address +pub const MASP: Address = Address::Internal(InternalAddress::Masp); /// Error from decoding address from string pub type DecodeError = string_encoding::DecodeError; @@ -121,6 +123,7 @@ impl From> for Address { raw::Discriminant::IbcToken => Address::Internal( InternalAddress::IbcToken(IbcTokenHash(*raw_addr.data())), ), + raw::Discriminant::Masp => Address::Internal(InternalAddress::Masp), } } } @@ -210,6 +213,11 @@ impl<'addr> From<&'addr Address> for raw::Address<'addr, raw::Validated> { .validate() .expect("This raw address is valid") } + Address::Internal(InternalAddress::Masp) => { + raw::Address::from_discriminant(raw::Discriminant::Masp) + .validate() + .expect("This raw address is valid") + } } } } @@ -346,7 +354,7 @@ impl TryFrom for Address { Address::decode(signer.as_ref()).or( match crate::types::masp::PaymentAddress::from_str(signer.as_ref()) { - Ok(_) => Ok(masp()), + Ok(_) => Ok(MASP), Err(_) => Err(DecodeError::InvalidInnerEncoding(format!( "Invalid address for IBC transfer: {signer}" ))), @@ -485,6 +493,8 @@ pub enum InternalAddress { Multitoken, /// Pgf Pgf, + /// Masp + Masp, } impl Display for InternalAddress { @@ -505,6 +515,7 @@ impl Display for InternalAddress { Self::Nut(eth_addr) => format!("Non-usable token: {eth_addr}"), Self::Multitoken => "Multitoken".to_string(), Self::Pgf => "PublicGoodFundings".to_string(), + Self::Masp => "MASP".to_string(), } ) } @@ -566,12 +577,6 @@ pub fn kartoffel() -> Address { .expect("The token address decoding shouldn't fail") } -/// Temporary helper for testing -pub fn masp() -> Address { - Address::decode("tnam1q9lm5pvkxhnw9wwwhu33vkvtylwfkn5kw53xwud8") - .expect("The token address decoding shouldn't fail") -} - /// Sentinel secret key to indicate a MASP source pub fn masp_tx_key() -> crate::types::key::common::SecretKey { use crate::types::key::common; @@ -809,6 +814,7 @@ pub mod testing { InternalAddress::Erc20(_) => {} InternalAddress::Nut(_) => {} InternalAddress::Pgf => {} + InternalAddress::Masp => {} InternalAddress::Multitoken => {} /* Add new addresses in the * `prop_oneof` below. */ }; @@ -825,6 +831,7 @@ pub mod testing { Just(arb_nut()), Just(InternalAddress::Multitoken), Just(InternalAddress::Pgf), + Just(InternalAddress::Masp), ] } diff --git a/core/src/types/address/raw.rs b/core/src/types/address/raw.rs index aade2af3a4..d975d219f9 100644 --- a/core/src/types/address/raw.rs +++ b/core/src/types/address/raw.rs @@ -63,6 +63,8 @@ pub enum Discriminant { Nut = 12, /// IBC token raw address. IbcToken = 13, + /// MASP raw address. + Masp = 14, } /// Raw address representation. diff --git a/core/src/types/masp.rs b/core/src/types/masp.rs index 685394f72c..89994539b2 100644 --- a/core/src/types/masp.rs +++ b/core/src/types/masp.rs @@ -8,7 +8,7 @@ use borsh_ext::BorshSerializeExt; use sha2::{Digest, Sha256}; use crate::impl_display_and_from_str_via_format; -use crate::types::address::{masp, Address, DecodeError, HASH_HEX_LEN}; +use crate::types::address::{Address, DecodeError, HASH_HEX_LEN, MASP}; use crate::types::string_encoding::{ self, MASP_EXT_FULL_VIEWING_KEY_HRP, MASP_EXT_SPENDING_KEY_HRP, MASP_PAYMENT_ADDRESS_HRP, @@ -303,7 +303,7 @@ impl TransferSource { Self::Address(x) => x.clone(), // An ExtendedSpendingKey for a source effectively means that // assets will be drawn from the MASP - Self::ExtendedSpendingKey(_) => masp(), + Self::ExtendedSpendingKey(_) => MASP, } } @@ -349,7 +349,7 @@ impl TransferTarget { Self::Address(x) => x.clone(), // An ExtendedSpendingKey for a source effectively means that // assets will be drawn from the MASP - Self::PaymentAddress(_) => masp(), + Self::PaymentAddress(_) => MASP, } } diff --git a/core/src/types/token.rs b/core/src/types/token.rs index 1b0e7a40d2..fbee830b47 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -18,7 +18,7 @@ use crate::ledger::storage as ledger_storage; use crate::ledger::storage_api::token::read_denom; use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; use crate::types::address::{ - masp, Address, DecodeError as AddressError, InternalAddress, + Address, DecodeError as AddressError, InternalAddress, MASP, }; use crate::types::dec::Dec; use crate::types::hash::Hash; @@ -1123,7 +1123,7 @@ pub fn is_denom_key(token_addr: &Address, key: &Key) -> bool { pub fn is_masp_key(key: &Key) -> bool { matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(key)] - if *addr == masp() + if *addr == MASP && (key == HEAD_TX_KEY || key.starts_with(TX_KEY_PREFIX) || key.starts_with(PIN_KEY_PREFIX))) diff --git a/core/src/types/transaction/wrapper.rs b/core/src/types/transaction/wrapper.rs index 8c4f1fb4a9..f9b032b3f4 100644 --- a/core/src/types/transaction/wrapper.rs +++ b/core/src/types/transaction/wrapper.rs @@ -15,7 +15,7 @@ pub mod wrapper_tx { use thiserror::Error; use crate::proto::{Code, Data, Section, Tx}; - use crate::types::address::{masp, Address}; + use crate::types::address::{Address, MASP}; use crate::types::hash::Hash; use crate::types::key::*; use crate::types::storage::Epoch; @@ -310,7 +310,7 @@ pub mod wrapper_tx { ); let transfer = Transfer { - source: masp(), + source: MASP, target: self.fee_payer(), token: self.fee.token.clone(), amount: DenominatedAmount { diff --git a/sdk/src/masp.rs b/sdk/src/masp.rs index 2ead173e52..68459688e0 100644 --- a/sdk/src/masp.rs +++ b/sdk/src/masp.rs @@ -48,7 +48,7 @@ use masp_proofs::bellman::groth16::PreparedVerifyingKey; use masp_proofs::bls12_381::Bls12; use masp_proofs::prover::LocalTxProver; use masp_proofs::sapling::SaplingVerificationContext; -use namada_core::types::address::{masp, Address}; +use namada_core::types::address::{Address, MASP}; use namada_core::types::masp::{ BalanceOwner, ExtendedViewingKey, PaymentAddress, TransferSource, TransferTarget, @@ -740,7 +740,7 @@ impl ShieldedContext { Error, > { // The address of the MASP account - let masp_addr = masp(); + let masp_addr = MASP; // Construct the key where last transaction pointer is stored let head_tx_key = Key::from(masp_addr.to_db_key()) .push(&HEAD_TX_KEY.to_owned()) @@ -1340,7 +1340,7 @@ impl ShieldedContext { } } // The address of the MASP account - let masp_addr = masp(); + let masp_addr = MASP; // Construct the key for where the transaction ID would be stored let pin_key = Key::from(masp_addr.to_db_key()) .push(&(PIN_KEY_PREFIX.to_owned() + &owner.hash())) @@ -1919,8 +1919,8 @@ impl ShieldedContext { if let Some(transfer) = transfer { // Skip MASP addresses as they are already handled // by ShieldedContext - if transfer.source == masp() - || transfer.target == masp() + if transfer.source == MASP + || transfer.target == MASP { continue; } diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 39120f8261..fb35662017 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -14,7 +14,7 @@ use namada_core::ledger::parameters::storage as parameter_storage; use namada_core::proto::SignatureIndex; use namada_core::types::account::AccountPublicKeysMap; use namada_core::types::address::{ - masp, masp_tx_key, Address, ImplicitAddress, + masp_tx_key, Address, ImplicitAddress, InternalAddress, MASP, }; use namada_core::types::key::*; use namada_core::types::masp::{ExtendedViewingKey, PaymentAddress}; @@ -184,7 +184,7 @@ pub async fn tx_signers<'a>( // Now actually fetch the signing key and apply it match signer { - Some(signer) if signer == masp() => Ok(vec![masp_tx_key().ref_to()]), + Some(signer) if signer == MASP => Ok(vec![masp_tx_key().ref_to()]), Some(signer) => Ok(vec![find_pk(context, &signer).await?]), None => other_err( @@ -348,9 +348,14 @@ pub async fn aux_signing_data<'a>( Some(AccountPublicKeysMap::from_iter(public_keys.clone())), 1u8, ), - Some(owner @ Address::Internal(_)) => { - return Err(Error::from(TxError::InvalidAccount(owner.encode()))); - } + Some(owner @ Address::Internal(internal)) => match internal { + InternalAddress::Masp => (None, 0u8), + _ => { + return Err(Error::from(TxError::InvalidAccount( + owner.encode(), + ))); + } + }, None => (None, 0u8), }; @@ -786,9 +791,9 @@ pub async fn make_ledger_masp_endpoints<'a>( builder: Option<&MaspBuilder>, assets: &HashMap, ) { - if transfer.source != masp() { + if transfer.source != MASP { output.push(format!("Sender : {}", transfer.source)); - if transfer.target == masp() { + if transfer.target == MASP { make_ledger_amount_addr( tokens, output, @@ -813,9 +818,9 @@ pub async fn make_ledger_masp_endpoints<'a>( .await; } } - if transfer.target != masp() { + if transfer.target != MASP { output.push(format!("Destination : {}", transfer.target)); - if transfer.source == masp() { + if transfer.source == MASP { make_ledger_amount_addr( tokens, output, @@ -840,7 +845,7 @@ pub async fn make_ledger_masp_endpoints<'a>( .await; } } - if transfer.source != masp() && transfer.target != masp() { + if transfer.source != MASP && transfer.target != MASP { make_ledger_amount_addr( tokens, output, diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 2e1a786d12..1600f1e493 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -31,7 +31,7 @@ use namada_core::ledger::governance::storage::proposal::ProposalType; use namada_core::ledger::governance::storage::vote::StorageProposalVote; use namada_core::ledger::ibc::storage::channel_key; use namada_core::ledger::pgf::cli::steward::Commission; -use namada_core::types::address::{masp, Address, InternalAddress}; +use namada_core::types::address::{Address, InternalAddress, MASP}; use namada_core::types::dec::Dec; use namada_core::types::hash::Hash; use namada_core::types::ibc::IbcShieldedTransfer; @@ -2212,7 +2212,7 @@ pub async fn build_transfer<'a, N: Namada<'a>>( token: args.token.clone(), }); - let masp_addr = masp(); + let masp_addr = MASP; // For MASP sources, use a special sentinel key recognized by VPs as default // signer. Also, if the transaction is shielded, redact the amount and token @@ -2556,7 +2556,7 @@ pub async fn gen_ibc_shielded_transfer<'a, N: Namada<'a>>( let transfer = token::Transfer { source: source.clone(), - target: masp(), + target: MASP, token: token.clone(), amount: validated_amount, key, diff --git a/shared/src/ledger/native_vp/ibc/context.rs b/shared/src/ledger/native_vp/ibc/context.rs index defdd1a177..ffe2faa2f5 100644 --- a/shared/src/ledger/native_vp/ibc/context.rs +++ b/shared/src/ledger/native_vp/ibc/context.rs @@ -11,7 +11,7 @@ use crate::ledger::native_vp::CtxPreStorageRead; use crate::ledger::storage::write_log::StorageModification; use crate::ledger::storage::{self as ledger_storage, StorageHasher}; use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; -use crate::types::address::{self, Address, InternalAddress}; +use crate::types::address::{Address, InternalAddress, MASP}; use crate::types::ibc::{IbcEvent, IbcShieldedTransfer}; use crate::types::storage::{ BlockHash, BlockHeight, Epoch, Header, Key, KeySeg, TxIndex, @@ -216,7 +216,7 @@ where } fn handle_masp_tx(&mut self, shielded: &IbcShieldedTransfer) -> Result<()> { - let masp_addr = address::masp(); + let masp_addr = MASP; let head_tx_key = Key::from(masp_addr.to_db_key()) .push(&HEAD_TX_KEY.to_owned()) .expect("Cannot obtain a storage key"); diff --git a/shared/src/ledger/native_vp/masp.rs b/shared/src/ledger/native_vp/masp.rs new file mode 100644 index 0000000000..54048f6759 --- /dev/null +++ b/shared/src/ledger/native_vp/masp.rs @@ -0,0 +1,300 @@ +//! MASP native VP + +use std::cmp::Ordering; +use std::collections::BTreeSet; + +use borsh_ext::BorshSerializeExt; +use masp_primitives::asset_type::AssetType; +use masp_primitives::transaction::components::I128Sum; +use namada_core::ledger::gas::MASP_VERIFY_SHIELDED_TX_GAS; +use namada_core::ledger::storage; +use namada_core::ledger::storage_api::OptionExt; +use namada_core::ledger::vp_env::VpEnv; +use namada_core::proto::Tx; +use namada_core::types::address::Address; +use namada_core::types::address::InternalAddress::Masp; +use namada_core::types::storage::{Epoch, Key}; +use namada_core::types::token; +use namada_sdk::masp::verify_shielded_tx; +use ripemd::Digest as RipemdDigest; +use sha2::Digest as Sha2Digest; +use thiserror::Error; + +use crate::ledger::native_vp; +use crate::ledger::native_vp::{Ctx, NativeVp}; +use crate::vm::WasmCacheAccess; + +#[allow(missing_docs)] +#[derive(Error, Debug)] +pub enum Error { + #[error("Native VP error: {0}")] + NativeVpError(native_vp::Error), +} + +/// MASP VP result +pub type Result = std::result::Result; + +/// MASP VP +pub struct MaspVp<'a, DB, H, CA> +where + DB: storage::DB + for<'iter> storage::DBIter<'iter>, + H: storage::StorageHasher, + CA: WasmCacheAccess, +{ + /// Context to interact with the host structures. + pub ctx: Ctx<'a, DB, H, CA>, +} + +/// Generates the current asset type given the current epoch and an +/// unique token address +fn asset_type_from_epoched_address( + epoch: Epoch, + token: &Address, + denom: token::MaspDenom, +) -> AssetType { + // Timestamp the chosen token with the current epoch + let token_bytes = (token, denom, epoch.0).serialize_to_vec(); + // Generate the unique asset identifier from the unique token address + AssetType::new(token_bytes.as_ref()).expect("unable to create asset type") +} + +/// Checks if the asset type matches the expected asset type, Adds a +/// debug log if the values do not match. +fn valid_asset_type( + asset_type: &AssetType, + asset_type_to_test: &AssetType, +) -> bool { + let res = + asset_type.get_identifier() == asset_type_to_test.get_identifier(); + if !res { + tracing::debug!( + "The asset type must be derived from the token address and \ + current epoch" + ); + } + res +} + +/// Checks if the reported transparent amount and the unshielded +/// values agree, if not adds to the debug log +fn valid_transfer_amount( + reporeted_transparent_value: u64, + unshielded_transfer_value: u64, +) -> bool { + let res = reporeted_transparent_value == unshielded_transfer_value; + if !res { + tracing::debug!( + "The unshielded amount {} disagrees with the calculated masp \ + transparented value {}", + unshielded_transfer_value, + reporeted_transparent_value + ); + } + res +} + +/// Convert Namada amount and token type to MASP equivalents +fn convert_amount( + epoch: Epoch, + token: &Address, + val: token::Amount, + denom: token::MaspDenom, +) -> (AssetType, I128Sum) { + let asset_type = asset_type_from_epoched_address(epoch, token, denom); + // Combine the value and unit into one amount + let amount = + I128Sum::from_nonnegative(asset_type, denom.denominate(&val) as i128) + .expect("invalid value or asset type for amount"); + (asset_type, amount) +} + +impl<'a, DB, H, CA> NativeVp for MaspVp<'a, DB, H, CA> +where + DB: 'static + storage::DB + for<'iter> storage::DBIter<'iter>, + H: 'static + storage::StorageHasher, + CA: 'static + WasmCacheAccess, +{ + type Error = Error; + + fn validate_tx( + &self, + tx_data: &Tx, + _keys_changed: &BTreeSet, + _verifiers: &BTreeSet
, + ) -> Result { + let epoch = self.ctx.get_block_epoch()?; + let (transfer, shielded_tx) = self.ctx.get_shielded_action(tx_data)?; + let mut transparent_tx_pool = I128Sum::zero(); + // The Sapling value balance adds to the transparent tx pool + transparent_tx_pool += shielded_tx.sapling_value_balance(); + + if transfer.source != Address::Internal(Masp) { + // Handle transparent input + // Note that the asset type is timestamped so shields + // where the shielded value has an incorrect timestamp + // are automatically rejected + for denom in token::MaspDenom::iter() { + let (_transp_asset, transp_amt) = convert_amount( + epoch, + &transfer.token, + transfer.amount.into(), + denom, + ); + + // Non-masp sources add to transparent tx pool + transparent_tx_pool += transp_amt; + } + } else { + // Handle shielded input + // The following boundary conditions must be satisfied + // 1. Zero transparent input + // 2. the transparent transaction value pool's amount must equal + // the containing wrapper transaction's fee + // amount Satisfies 1. + if let Some(transp_bundle) = shielded_tx.transparent_bundle() { + if !transp_bundle.vin.is_empty() { + tracing::debug!( + "Transparent input to a transaction from the masp \ + must be 0 but is {}", + transp_bundle.vin.len() + ); + return Ok(false); + } + } + } + + if transfer.target != Address::Internal(Masp) { + // Handle transparent output + // The following boundary conditions must be satisfied + // 1. One to 4 transparent outputs + // 2. Asset type must be properly derived + // 3. Value from the output must be the same as the containing + // transfer + // 4. Public key must be the hash of the target + + // Satisfies 1. + let transp_bundle = + shielded_tx.transparent_bundle().ok_or_err_msg( + "Expected transparent outputs in unshielding transaction", + )?; + + let out_length = transp_bundle.vout.len(); + if !(1..=4).contains(&out_length) { + tracing::debug!( + "Transparent output to a transaction to the masp must be \ + beteween 1 and 4 but is {}", + transp_bundle.vout.len() + ); + + return Ok(false); + } + let mut outs = transp_bundle.vout.iter(); + let mut valid_count = 0; + for denom in token::MaspDenom::iter() { + let out = match outs.next() { + Some(out) => out, + None => continue, + }; + + let expected_asset_type: AssetType = + asset_type_from_epoched_address( + epoch, + &transfer.token, + denom, + ); + + // Satisfies 2. and 3. + if !valid_asset_type(&expected_asset_type, &out.asset_type) { + // we don't know which masp denoms are necessary + // apriori. This is encoded via + // the asset types. + continue; + } + if !valid_transfer_amount( + out.value, + denom.denominate(&transfer.amount.amount), + ) { + return Ok(false); + } + + let (_transp_asset, transp_amt) = convert_amount( + epoch, + &transfer.token, + transfer.amount.amount, + denom, + ); + + // Non-masp destinations subtract from transparent tx pool + transparent_tx_pool -= transp_amt; + + // Satisfies 4. + let target_enc = transfer.target.serialize_to_vec(); + + let hash = ripemd::Ripemd160::digest(sha2::Sha256::digest( + &target_enc, + )); + + if <[u8; 20]>::from(hash) != out.address.0 { + tracing::debug!( + "the public key of the output account does not match \ + the transfer target" + ); + return Ok(false); + } + valid_count += 1; + } + // one or more of the denoms in the batch failed to verify + // the asset derivation. + if valid_count != out_length { + return Ok(false); + } + } else { + // Handle shielded output + // The following boundary conditions must be satisfied + // 1. Zero transparent output + + // Satisfies 1. + if let Some(transp_bundle) = shielded_tx.transparent_bundle() { + if !transp_bundle.vout.is_empty() { + tracing::debug!( + "Transparent output to a transaction from the masp \ + must be 0 but is {}", + transp_bundle.vout.len() + ); + return Ok(false); + } + } + } + + match transparent_tx_pool.partial_cmp(&I128Sum::zero()) { + None | Some(Ordering::Less) => { + tracing::debug!( + "Transparent transaction value pool must be nonnegative. \ + Violation may be caused by transaction being constructed \ + in previous epoch. Maybe try again." + ); + // Section 3.4: The remaining value in the transparent + // transaction value pool MUST be nonnegative. + return Ok(false); + } + Some(Ordering::Greater) => { + tracing::debug!( + "Transaction fees cannot be paid inside MASP transaction." + ); + return Ok(false); + } + _ => {} + } + // Verify the proofs and charge the gas for the expensive execution + self.ctx + .charge_gas(MASP_VERIFY_SHIELDED_TX_GAS) + .map_err(Error::NativeVpError)?; + Ok(verify_shielded_tx(&shielded_tx)) + } +} + +impl From for Error { + fn from(err: native_vp::Error) -> Self { + Self::NativeVpError(err) + } +} diff --git a/shared/src/ledger/native_vp/mod.rs b/shared/src/ledger/native_vp/mod.rs index a590a1e433..a18d5f5404 100644 --- a/shared/src/ledger/native_vp/mod.rs +++ b/shared/src/ledger/native_vp/mod.rs @@ -3,6 +3,7 @@ pub mod ethereum_bridge; pub mod ibc; +pub mod masp; pub mod multitoken; pub mod parameters; @@ -564,10 +565,6 @@ where } } - fn verify_masp(&self, _tx: Vec) -> Result { - unimplemented!("no masp native vp") - } - fn charge_gas(&self, used_gas: u64) -> Result<(), storage_api::Error> { self.gas_meter.borrow_mut().consume(used_gas).map_err(|_| { Error::SimpleMessage("Gas limit exceeded in native vp") diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index d142781127..64021faf6b 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -22,6 +22,7 @@ use crate::ledger::native_vp::ethereum_bridge::bridge_pool_vp::BridgePoolVp; use crate::ledger::native_vp::ethereum_bridge::nut::NonUsableTokens; use crate::ledger::native_vp::ethereum_bridge::vp::EthBridge; use crate::ledger::native_vp::ibc::Ibc; +use crate::ledger::native_vp::masp::MaspVp; use crate::ledger::native_vp::multitoken::MultitokenVp; use crate::ledger::native_vp::parameters::{self, ParametersVp}; use crate::ledger::native_vp::{self, NativeVp}; @@ -90,6 +91,8 @@ pub enum Error { BridgePoolNativeVpError(native_vp::ethereum_bridge::bridge_pool_vp::Error), #[error("Non usable tokens native VP error: {0}")] NutNativeVpError(native_vp::ethereum_bridge::nut::Error), + #[error("MASP native VP error: {0}")] + MaspNativeVpError(native_vp::masp::Error), #[error("Access to an internal address {0} is forbidden")] AccessForbidden(InternalAddress), } @@ -1005,6 +1008,16 @@ where ctx.sentinel.into_inner(), ) } + InternalAddress::Masp => { + let masp = MaspVp { ctx }; + let result = masp + .validate_tx(tx, &keys_changed, &verifiers) + .map_err(Error::MaspNativeVpError); + // Take the gas meter and the sentinel back out + // of the context + gas_meter = masp.ctx.gas_meter.into_inner(); + (result, masp.ctx.sentinel.into_inner()) + } }; accepted.map_err(|err| { diff --git a/shared/src/vm/host_env.rs b/shared/src/vm/host_env.rs index 2ea0037f9a..9dd19c1d74 100644 --- a/shared/src/vm/host_env.rs +++ b/shared/src/vm/host_env.rs @@ -10,7 +10,7 @@ use masp_primitives::transaction::Transaction; use namada_core::ledger::gas::{ GasMetering, TxGasMeter, MEMORY_ACCESS_GAS_PER_BYTE, }; -use namada_core::types::address::ESTABLISHED_ADDRESS_BYTES_LEN; +use namada_core::types::address::{ESTABLISHED_ADDRESS_BYTES_LEN, MASP}; use namada_core::types::internal::KeyVal; use namada_core::types::storage::TX_INDEX_LENGTH; use namada_core::types::transaction::TxSentinel; @@ -1945,40 +1945,6 @@ where } } -/// Verify a ShieldedTransaction. -pub fn vp_verify_masp( - env: &VpVmEnv, - tx_ptr: u64, - tx_len: u64, -) -> vp_host_fns::EnvResult -where - MEM: VmMemory, - DB: storage::DB + for<'iter> storage::DBIter<'iter>, - H: StorageHasher, - EVAL: VpEvaluator, - CA: WasmCacheAccess, -{ - let gas_meter = unsafe { env.ctx.gas_meter.get() }; - let sentinel = unsafe { env.ctx.sentinel.get() }; - let (tx_bytes, gas) = env - .memory - .read_bytes(tx_ptr, tx_len as _) - .map_err(|e| vp_host_fns::RuntimeError::MemoryError(Box::new(e)))?; - vp_host_fns::add_gas(gas_meter, gas, sentinel)?; - - let shielded: Transaction = - BorshDeserialize::try_from_slice(tx_bytes.as_slice()) - .map_err(vp_host_fns::RuntimeError::EncodingError)?; - - Ok( - // TODO: once the runtime gas meter is implemented we need to benchmark - // this funcion and charge the gas here. For the moment, the cost of - // this is included in the benchmark of the masp vp - HostEnvResult::from(namada_sdk::masp::verify_shielded_tx(&shielded)) - .to_i64(), - ) -} - /// Log a string from exposed to the wasm VM Tx environment. The message will be /// printed at the [`tracing::Level::INFO`]. This function is for development /// only. @@ -2431,7 +2397,7 @@ where &mut self, shielded: &IbcShieldedTransfer, ) -> Result<(), storage_api::Error> { - let masp_addr = address::masp(); + let masp_addr = MASP; let head_tx_key = Key::from(masp_addr.to_db_key()) .push(&HEAD_TX_KEY.to_owned()) .expect("Cannot obtain a storage key"); diff --git a/shared/src/vm/wasm/host_env.rs b/shared/src/vm/wasm/host_env.rs index a7dc51cc6f..fc5a5d5594 100644 --- a/shared/src/vm/wasm/host_env.rs +++ b/shared/src/vm/wasm/host_env.rs @@ -130,7 +130,6 @@ where "namada_vp_get_block_epoch" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_get_block_epoch), "namada_vp_get_ibc_events" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_get_ibc_events), "namada_vp_verify_tx_section_signature" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_verify_tx_section_signature), - "namada_vp_verify_masp" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_verify_masp), "namada_vp_eval" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_eval), "namada_vp_get_native_token" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_get_native_token), "namada_vp_log_string" => Function::new_native_with_env(wasm_store, env.clone(), host_env::vp_log_string), diff --git a/tx_prelude/src/token.rs b/tx_prelude/src/token.rs index 6067c82a46..009cccb36d 100644 --- a/tx_prelude/src/token.rs +++ b/tx_prelude/src/token.rs @@ -1,5 +1,5 @@ use masp_primitives::transaction::Transaction; -use namada_core::types::address::Address; +use namada_core::types::address::{Address, MASP}; use namada_core::types::storage::KeySeg; use namada_core::types::token; pub use namada_core::types::token::*; @@ -38,7 +38,7 @@ pub fn handle_masp_tx( transfer: &Transfer, shielded: &Transaction, ) -> TxResult { - let masp_addr = address::masp(); + let masp_addr = MASP; ctx.insert_verifier(&masp_addr)?; let head_tx_key = storage::Key::from(masp_addr.to_db_key()) .push(&HEAD_TX_KEY.to_owned()) diff --git a/vm_env/src/lib.rs b/vm_env/src/lib.rs index c3497c5c27..87331ee5ba 100644 --- a/vm_env/src/lib.rs +++ b/vm_env/src/lib.rs @@ -229,8 +229,6 @@ pub mod vp { input_data_len: u64, ) -> i64; - pub fn namada_vp_verify_masp(tx_ptr: u64, tx_len: u64) -> i64; - /// Charge the provided amount of gas for the current vp pub fn namada_vp_charge_gas(used_gas: u64); } diff --git a/vp_prelude/src/lib.rs b/vp_prelude/src/lib.rs index 3c2d4f7b88..abd034236a 100644 --- a/vp_prelude/src/lib.rs +++ b/vp_prelude/src/lib.rs @@ -352,12 +352,6 @@ impl<'view> VpEnv<'view> for Ctx { }) } - fn verify_masp(&self, tx: Vec) -> Result { - let valid = - unsafe { namada_vp_verify_masp(tx.as_ptr() as _, tx.len() as _) }; - Ok(HostEnvResult::is_success(valid)) - } - fn charge_gas(&self, used_gas: u64) -> Result<(), Error> { unsafe { namada_vp_charge_gas(used_gas) }; Ok(()) diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index 8daba98389..e3293b5523 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -35,7 +35,6 @@ tx_withdraw = ["namada_tx_prelude"] tx_update_steward_commission = ["namada_tx_prelude"] tx_resign_steward = ["namada_tx_prelude"] vp_implicit = ["namada_vp_prelude", "once_cell"] -vp_masp = ["namada_vp_prelude", "masp_primitives"] vp_token = ["namada_vp_prelude"] vp_user = ["namada_vp_prelude", "once_cell"] vp_validator = ["namada_vp_prelude", "once_cell"] diff --git a/wasm/wasm_source/Makefile b/wasm/wasm_source/Makefile index ca60559ccc..aa19173bd1 100644 --- a/wasm/wasm_source/Makefile +++ b/wasm/wasm_source/Makefile @@ -27,7 +27,6 @@ wasms += tx_withdraw wasms += tx_update_steward_commission wasms += tx_resign_steward wasms += vp_implicit -wasms += vp_masp wasms += vp_user wasms += vp_validator diff --git a/wasm/wasm_source/src/lib.rs b/wasm/wasm_source/src/lib.rs index c633505e67..15d365484a 100644 --- a/wasm/wasm_source/src/lib.rs +++ b/wasm/wasm_source/src/lib.rs @@ -43,8 +43,6 @@ pub mod tx_withdraw; #[cfg(feature = "vp_implicit")] pub mod vp_implicit; -#[cfg(feature = "vp_masp")] -pub mod vp_masp; #[cfg(feature = "vp_user")] pub mod vp_user; #[cfg(feature = "vp_validator")] diff --git a/wasm/wasm_source/src/vp_masp.rs b/wasm/wasm_source/src/vp_masp.rs deleted file mode 100644 index c04ba1b844..0000000000 --- a/wasm/wasm_source/src/vp_masp.rs +++ /dev/null @@ -1,252 +0,0 @@ -use std::cmp::Ordering; - -use masp_primitives::asset_type::AssetType; -use masp_primitives::transaction::components::I128Sum; -/// Multi-asset shielded pool VP. -use namada_vp_prelude::address::masp; -use namada_vp_prelude::borsh_ext::BorshSerializeExt; -use namada_vp_prelude::storage::Epoch; -use namada_vp_prelude::*; -use ripemd::{Digest, Ripemd160}; - -/// Generates the current asset type given the current epoch and an -/// unique token address -fn asset_type_from_epoched_address( - epoch: Epoch, - token: &Address, - denom: token::MaspDenom, -) -> AssetType { - // Timestamp the chosen token with the current epoch - let token_bytes = (token, denom, epoch.0).serialize_to_vec(); - // Generate the unique asset identifier from the unique token address - AssetType::new(token_bytes.as_ref()).expect("unable to create asset type") -} - -/// Checks if the asset type matches the expected asset type, Adds a -/// debug log if the values do not match. -fn valid_asset_type( - asset_type: &AssetType, - asset_type_to_test: &AssetType, -) -> bool { - let res = - asset_type.get_identifier() == asset_type_to_test.get_identifier(); - if !res { - debug_log!( - "The asset type must be derived from the token address and \ - current epoch" - ); - } - res -} - -/// Checks if the reported transparent amount and the unshielded -/// values agree, if not adds to the debug log -fn valid_transfer_amount( - reporeted_transparent_value: u64, - unshielded_transfer_value: u64, -) -> bool { - let res = reporeted_transparent_value == unshielded_transfer_value; - if !res { - debug_log!( - "The unshielded amount {} disagrees with the calculated masp \ - transparented value {}", - unshielded_transfer_value, - reporeted_transparent_value - ); - } - res -} - -/// Convert Namada amount and token type to MASP equivalents -fn convert_amount( - epoch: Epoch, - token: &Address, - val: token::Amount, - denom: token::MaspDenom, -) -> (AssetType, I128Sum) { - let asset_type = asset_type_from_epoched_address(epoch, token, denom); - // Combine the value and unit into one amount - let amount = - I128Sum::from_nonnegative(asset_type, denom.denominate(&val) as i128) - .expect("invalid value or asset type for amount"); - (asset_type, amount) -} - -#[validity_predicate(gas = 62210635)] -fn validate_tx( - ctx: &Ctx, - tx_data: Tx, - addr: Address, - keys_changed: BTreeSet, - verifiers: BTreeSet
, -) -> VpResult { - debug_log!( - "vp_masp called with {} bytes data, address {}, keys_changed {:?}, \ - verifiers {:?}", - tx_data.data().as_ref().map(|x| x.len()).unwrap_or(0), - addr, - keys_changed, - verifiers, - ); - - let (transfer, shielded_tx) = ctx.get_shielded_action(tx_data)?; - let mut transparent_tx_pool = I128Sum::zero(); - // The Sapling value balance adds to the transparent tx pool - transparent_tx_pool += shielded_tx.sapling_value_balance(); - - if transfer.source != masp() { - // Handle transparent input - // Note that the asset type is timestamped so shields - // where the shielded value has an incorrect timestamp - // are automatically rejected - for denom in token::MaspDenom::iter() { - let (_transp_asset, transp_amt) = convert_amount( - ctx.get_block_epoch().unwrap(), - &transfer.token, - transfer.amount.into(), - denom, - ); - - // Non-masp sources add to transparent tx pool - transparent_tx_pool += transp_amt; - } - } else { - // Handle shielded input - // The following boundary conditions must be satisfied - // 1. Zero transparent input - // 2. the transparent transaction value pool's amount must equal the - // containing wrapper transaction's fee amount - // Satisfies 1. - if let Some(transp_bundle) = shielded_tx.transparent_bundle() { - if !transp_bundle.vin.is_empty() { - debug_log!( - "Transparent input to a transaction from the masp must be \ - 0 but is {}", - transp_bundle.vin.len() - ); - return reject(); - } - } - } - - if transfer.target != masp() { - // Handle transparent output - // The following boundary conditions must be satisfied - // 1. One to 4 transparent outputs - // 2. Asset type must be properly derived - // 3. Value from the output must be the same as the containing - // transfer - // 4. Public key must be the hash of the target - - // Satisfies 1. - let transp_bundle = shielded_tx.transparent_bundle().ok_or_err_msg( - "Expected transparent outputs in unshielding transaction", - )?; - - let out_length = transp_bundle.vout.len(); - if !(1..=4).contains(&out_length) { - debug_log!( - "Transparent output to a transaction to the masp must be \ - beteween 1 and 4 but is {}", - transp_bundle.vout.len() - ); - - return reject(); - } - let mut outs = transp_bundle.vout.iter(); - let mut valid_count = 0; - for denom in token::MaspDenom::iter() { - let out = match outs.next() { - Some(out) => out, - None => continue, - }; - - let expected_asset_type: AssetType = - asset_type_from_epoched_address( - ctx.get_block_epoch().unwrap(), - &transfer.token, - denom, - ); - - // Satisfies 2. and 3. - if !valid_asset_type(&expected_asset_type, &out.asset_type) { - // we don't know which masp denoms are necessary apriori. - // This is encoded via the asset types. - continue; - } - if !valid_transfer_amount( - out.value, - denom.denominate(&transfer.amount.amount), - ) { - return reject(); - } - - let (_transp_asset, transp_amt) = convert_amount( - ctx.get_block_epoch().unwrap(), - &transfer.token, - transfer.amount.amount, - denom, - ); - - // Non-masp destinations subtract from transparent tx pool - transparent_tx_pool -= transp_amt; - - // Satisfies 4. - let target_enc = transfer.target.serialize_to_vec(); - - let hash = Ripemd160::digest(sha256(&target_enc).0.as_slice()); - - if <[u8; 20]>::from(hash) != out.address.0 { - debug_log!( - "the public key of the output account does not match the \ - transfer target" - ); - return reject(); - } - valid_count += 1; - } - // one or more of the denoms in the batch failed to verify - // the asset derivation. - if valid_count != out_length { - return reject(); - } - } else { - // Handle shielded output - // The following boundary conditions must be satisfied - // 1. Zero transparent output - - // Satisfies 1. - if let Some(transp_bundle) = shielded_tx.transparent_bundle() { - if !transp_bundle.vout.is_empty() { - debug_log!( - "Transparent output to a transaction from the masp must \ - be 0 but is {}", - transp_bundle.vout.len() - ); - return reject(); - } - } - } - - match transparent_tx_pool.partial_cmp(&I128Sum::zero()) { - None | Some(Ordering::Less) => { - debug_log!( - "Transparent transaction value pool must be nonnegative. \ - Violation may be caused by transaction being constructed in \ - previous epoch. Maybe try again." - ); - // Section 3.4: The remaining value in the transparent - // transaction value pool MUST be nonnegative. - return reject(); - } - Some(Ordering::Greater) => { - debug_log!( - "Transaction fees cannot be paid inside MASP transaction." - ); - return reject(); - } - _ => {} - } - // Do the expensive proof verification in the VM at the end. - ctx.verify_masp(shielded_tx.serialize_to_vec()) -} From 549e2bff4e7253a3ec6fd3440a5e896404a05d67 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 14:59:49 +0100 Subject: [PATCH 03/11] Removes masp vp from genesis files --- genesis/localnet/validity-predicates.toml | 3 --- genesis/starter/validity-predicates.toml | 4 ---- 2 files changed, 7 deletions(-) diff --git a/genesis/localnet/validity-predicates.toml b/genesis/localnet/validity-predicates.toml index a0c2570121..907e7c522b 100644 --- a/genesis/localnet/validity-predicates.toml +++ b/genesis/localnet/validity-predicates.toml @@ -12,6 +12,3 @@ filename = "vp_user.wasm" [wasm.vp_validator] filename = "vp_validator.wasm" -# MASP VP -[wasm.vp_masp] -filename = "vp_masp.wasm" diff --git a/genesis/starter/validity-predicates.toml b/genesis/starter/validity-predicates.toml index 863ec7ec38..9c9e76fc83 100644 --- a/genesis/starter/validity-predicates.toml +++ b/genesis/starter/validity-predicates.toml @@ -16,7 +16,3 @@ filename = "vp_validator.wasm" [wasm.vp_token] filename = "vp_token.wasm" -# MASP VP -[wasm.vp_masp] -filename = "vp_masp.wasm" - From dcae5d3833d846b9aa4ff207b1fb0bf3c60001d2 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 15:00:08 +0100 Subject: [PATCH 04/11] Updates benches with masp native vp --- benches/native_vps.rs | 142 +++++++++++++++++++++++++++++++++++++++++- benches/vps.rs | 102 ++---------------------------- 2 files changed, 144 insertions(+), 100 deletions(-) diff --git a/benches/native_vps.rs b/benches/native_vps.rs index b3eff8041b..b72de2d29e 100644 --- a/benches/native_vps.rs +++ b/benches/native_vps.rs @@ -33,24 +33,29 @@ use namada::ledger::native_vp::ethereum_bridge::nut::NonUsableTokens; use namada::ledger::native_vp::ethereum_bridge::vp::EthBridge; use namada::ledger::native_vp::ibc::context::PseudoExecutionContext; use namada::ledger::native_vp::ibc::Ibc; +use namada::ledger::native_vp::masp::MaspVp; use namada::ledger::native_vp::multitoken::MultitokenVp; use namada::ledger::native_vp::parameters::ParametersVp; use namada::ledger::native_vp::{Ctx, NativeVp}; use namada::ledger::pgf::PgfVp; use namada::ledger::pos::PosVP; +use namada::namada_sdk::masp::verify_shielded_tx; +use namada::namada_sdk::masp_primitives::transaction::Transaction; use namada::proof_of_stake; use namada::proof_of_stake::KeySeg; use namada::proto::{Code, Section, Tx}; use namada::types::address::InternalAddress; use namada::types::eth_bridge_pool::{GasFee, PendingTransfer}; +use namada::types::masp::{TransferSource, TransferTarget}; use namada::types::storage::{Epoch, TxIndex}; use namada::types::transaction::governance::{ InitProposalData, VoteProposalData, }; use namada_apps::bench_utils::{ - generate_foreign_key_tx, BenchShell, TX_BRIDGE_POOL_WASM, TX_IBC_WASM, - TX_INIT_PROPOSAL_WASM, TX_RESIGN_STEWARD, TX_TRANSFER_WASM, - TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL_WASM, + generate_foreign_key_tx, BenchShell, BenchShieldedCtx, + ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, BERTHA_PAYMENT_ADDRESS, + TX_BRIDGE_POOL_WASM, TX_IBC_WASM, TX_INIT_PROPOSAL_WASM, TX_RESIGN_STEWARD, + TX_TRANSFER_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL_WASM, }; use namada_apps::wallet::defaults; @@ -464,6 +469,135 @@ fn vp_multitoken(c: &mut Criterion) { } } +// Generate and run masp transaction to be verified +fn setup_storage_for_masp_verification( + bench_name: &str, +) -> (BenchShieldedCtx, Tx) { + let amount = Amount::native_whole(500); + let mut shielded_ctx = BenchShieldedCtx::default(); + + let albert_spending_key = shielded_ctx + .wallet + .find_spending_key(ALBERT_SPENDING_KEY, None) + .unwrap() + .to_owned(); + let albert_payment_addr = shielded_ctx + .wallet + .find_payment_addr(ALBERT_PAYMENT_ADDRESS) + .unwrap() + .to_owned(); + let bertha_payment_addr = shielded_ctx + .wallet + .find_payment_addr(BERTHA_PAYMENT_ADDRESS) + .unwrap() + .to_owned(); + + // Shield some tokens for Albert + let shield_tx = shielded_ctx.generate_masp_tx( + amount, + TransferSource::Address(defaults::albert_address()), + TransferTarget::PaymentAddress(albert_payment_addr), + ); + shielded_ctx.shell.execute_tx(&shield_tx); + shielded_ctx.shell.wl_storage.commit_tx(); + shielded_ctx.shell.commit(); + + let signed_tx = match bench_name { + "shielding" => shielded_ctx.generate_masp_tx( + amount, + TransferSource::Address(defaults::albert_address()), + TransferTarget::PaymentAddress(albert_payment_addr), + ), + "unshielding" => shielded_ctx.generate_masp_tx( + amount, + TransferSource::ExtendedSpendingKey(albert_spending_key), + TransferTarget::Address(defaults::albert_address()), + ), + "shielded" => shielded_ctx.generate_masp_tx( + amount, + TransferSource::ExtendedSpendingKey(albert_spending_key), + TransferTarget::PaymentAddress(bertha_payment_addr), + ), + _ => panic!("Unexpected bench test"), + }; + shielded_ctx.shell.execute_tx(&signed_tx); + + (shielded_ctx, signed_tx) +} + +fn masp(c: &mut Criterion) { + let mut group = c.benchmark_group("vp_masp"); + + for bench_name in ["shielding", "unshielding", "shielded"] { + group.bench_function(bench_name, |b| { + let (shielded_ctx, signed_tx) = + setup_storage_for_masp_verification(bench_name); + let (verifiers, keys_changed) = shielded_ctx + .shell + .wl_storage + .write_log + .verifiers_and_changed_keys(&BTreeSet::default()); + + let masp = MaspVp { + ctx: Ctx::new( + &Address::Internal(InternalAddress::Masp), + &shielded_ctx.shell.wl_storage.storage, + &shielded_ctx.shell.wl_storage.write_log, + &signed_tx, + &TxIndex(0), + VpGasMeter::new_from_tx_meter( + &TxGasMeter::new_from_sub_limit(u64::MAX.into()), + ), + &keys_changed, + &verifiers, + shielded_ctx.shell.vp_wasm_cache.clone(), + ), + }; + + b.iter(|| { + assert!( + masp.validate_tx( + &signed_tx, + masp.ctx.keys_changed, + masp.ctx.verifiers, + ) + .unwrap() + ); + }) + }); + } + + group.finish(); +} + +fn masp_verify_shielded_tx(c: &mut Criterion) { + let mut group = c.benchmark_group("vp_masp_verify_shielded_tx"); + + for bench_name in ["shielding", "unshielding", "shielded"] { + group.bench_function(bench_name, |b| { + let (_, signed_tx) = + setup_storage_for_masp_verification(bench_name); + + let transaction = signed_tx + .sections + .into_iter() + .filter_map(|section| match section { + Section::MaspTx(transaction) => Some(transaction), + _ => None, + }) + .collect::>() + .first() + .unwrap() + .to_owned(); + b.iter(|| { + assert!(verify_shielded_tx(&transaction)); + }) + }); + } + + group.finish(); +} + fn pgf(c: &mut Criterion) { let mut group = c.benchmark_group("vp_pgf"); @@ -1146,6 +1280,8 @@ criterion_group!( governance, // slash_fund, ibc, + masp, + masp_verify_shielded_tx, vp_multitoken, pgf, eth_bridge_nut, diff --git a/benches/vps.rs b/benches/vps.rs index 9023e38bcd..16883d3547 100644 --- a/benches/vps.rs +++ b/benches/vps.rs @@ -14,24 +14,21 @@ use namada::ledger::gas::{TxGasMeter, VpGasMeter}; use namada::proto::{Code, Section}; use namada::types::hash::Hash; use namada::types::key::ed25519; -use namada::types::masp::{TransferSource, TransferTarget}; use namada::types::storage::{Key, TxIndex}; use namada::types::transaction::governance::VoteProposalData; use namada::types::transaction::pos::{Bond, CommissionChange}; use namada::vm::wasm::run; use namada_apps::bench_utils::{ - generate_foreign_key_tx, BenchShell, BenchShieldedCtx, - ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, BERTHA_PAYMENT_ADDRESS, - TX_BOND_WASM, TX_CHANGE_VALIDATOR_COMMISSION_WASM, TX_REVEAL_PK_WASM, - TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, - TX_VOTE_PROPOSAL_WASM, VP_VALIDATOR_WASM, + generate_foreign_key_tx, BenchShell, TX_BOND_WASM, + TX_CHANGE_VALIDATOR_COMMISSION_WASM, TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, + TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL_WASM, + VP_VALIDATOR_WASM, }; use namada_apps::wallet::defaults; use sha2::Digest; const VP_USER_WASM: &str = "vp_user.wasm"; const VP_IMPLICIT_WASM: &str = "vp_implicit.wasm"; -const VP_MASP_WASM: &str = "vp_masp.wasm"; fn vp_user(c: &mut Criterion) { let mut group = c.benchmark_group("vp_user"); @@ -469,94 +466,5 @@ fn vp_validator(c: &mut Criterion) { group.finish(); } -fn vp_masp(c: &mut Criterion) { - let mut group = c.benchmark_group("vp_masp"); - - let amount = Amount::native_whole(500); - - for bench_name in ["shielding", "unshielding", "shielded"] { - group.bench_function(bench_name, |b| { - let mut shielded_ctx = BenchShieldedCtx::default(); - let vp_code_hash: Hash = shielded_ctx - .shell - .read_storage_key(&Key::wasm_hash(VP_MASP_WASM)) - .unwrap(); - - let albert_spending_key = shielded_ctx - .wallet - .find_spending_key(ALBERT_SPENDING_KEY, None) - .unwrap() - .to_owned(); - let albert_payment_addr = shielded_ctx - .wallet - .find_payment_addr(ALBERT_PAYMENT_ADDRESS) - .unwrap() - .to_owned(); - let bertha_payment_addr = shielded_ctx - .wallet - .find_payment_addr(BERTHA_PAYMENT_ADDRESS) - .unwrap() - .to_owned(); - - // Shield some tokens for Albert - let shield_tx = shielded_ctx.generate_masp_tx( - amount, - TransferSource::Address(defaults::albert_address()), - TransferTarget::PaymentAddress(albert_payment_addr), - ); - shielded_ctx.shell.execute_tx(&shield_tx); - shielded_ctx.shell.wl_storage.commit_tx(); - shielded_ctx.shell.commit(); - - let signed_tx = match bench_name { - "shielding" => shielded_ctx.generate_masp_tx( - amount, - TransferSource::Address(defaults::albert_address()), - TransferTarget::PaymentAddress(albert_payment_addr), - ), - "unshielding" => shielded_ctx.generate_masp_tx( - amount, - TransferSource::ExtendedSpendingKey(albert_spending_key), - TransferTarget::Address(defaults::albert_address()), - ), - "shielded" => shielded_ctx.generate_masp_tx( - amount, - TransferSource::ExtendedSpendingKey(albert_spending_key), - TransferTarget::PaymentAddress(bertha_payment_addr), - ), - _ => panic!("Unexpected bench test"), - }; - shielded_ctx.shell.execute_tx(&signed_tx); - let (verifiers, keys_changed) = shielded_ctx - .shell - .wl_storage - .write_log - .verifiers_and_changed_keys(&BTreeSet::default()); - - b.iter(|| { - assert!( - run::vp( - vp_code_hash, - &signed_tx, - &TxIndex(0), - &defaults::validator_address(), - &shielded_ctx.shell.wl_storage.storage, - &shielded_ctx.shell.wl_storage.write_log, - &mut VpGasMeter::new_from_tx_meter( - &TxGasMeter::new_from_sub_limit(u64::MAX.into()) - ), - &keys_changed, - &verifiers, - shielded_ctx.shell.vp_wasm_cache.clone(), - ) - .unwrap() - ); - }) - }); - } - - group.finish(); -} - -criterion_group!(whitelisted_vps, vp_user, vp_implicit, vp_validator, vp_masp,); +criterion_group!(whitelisted_vps, vp_user, vp_implicit, vp_validator,); criterion_main!(whitelisted_vps); From 90a574368a5553e69081e7c97e7184ba989e27d5 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 15:00:42 +0100 Subject: [PATCH 05/11] Removes unused masp check from `vp_user` --- wasm/wasm_source/src/vp_user.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index 6e81bcdac1..7799a30ad8 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -8,7 +8,6 @@ //! //! Any other storage key changes are allowed only with a valid signature. -use namada_vp_prelude::address::masp; use namada_vp_prelude::storage::KeySeg; use namada_vp_prelude::*; use once_cell::unsync::Lazy; @@ -82,8 +81,7 @@ fn validate_tx( ctx.read_post(key)?.unwrap_or_default(); let change = post.change() - pre.change(); // debit has to signed, credit doesn't - let valid = - change.non_negative() || addr == masp() || *valid_sig; + let valid = change.non_negative() || *valid_sig; debug_log!( "token key: {}, change: {:?}, valid_sig: {}, valid \ modification: {}", From 35461740f2d98a0409acbfb17ab9b94ea71906d7 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 15:44:19 +0100 Subject: [PATCH 06/11] Updates masp test proofs --- ...8EFC768FE777B9F1B84CA71D843A0062EB1509.bin | Bin 9649 -> 0 bytes ...C5AEBFA800AD1ABEF2487C53BF97362CC90B0.bin} | Bin 7448 -> 7448 bytes ...6EDC5CC89E90D6FF92E31C8C872DCAB358239A.bin | Bin 15257 -> 0 bytes ...59DB09065F2CC91CBB86AD65A92E8B92B43743.bin | Bin 0 -> 15257 bytes ...C6B362D244EDD624244876F9B5F541EBA07FC5.bin | Bin 12448 -> 0 bytes ...4D13376048954D074973BAD19846CC5570D984.bin | Bin 7448 -> 0 bytes ...6C536AAC74604CB002CA3558559CACCC24B5EB.bin | Bin 9941 -> 0 bytes ...86DF79F7E021A374BFCF3C6CA82DAC391C6533.bin | Bin 15597 -> 0 bytes ...0A87507CCAA8EB7647CB2974EB9250922A0580.bin | Bin 0 -> 17018 bytes ...333592C4A00DDC30896E174422F6863F71D32.bin} | Bin 7448 -> 7448 bytes ...C35062071533243874C260C81A6AEBE8480987.bin | Bin 0 -> 15597 bytes ...5E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin | Bin 0 -> 7448 bytes ...3C2404E7EBDFF543A6EAA34544FFF644F08FA9.bin | Bin 10382 -> 0 bytes ...0412000E423E0085AB074BF8C493574AF3226B.bin | Bin 17018 -> 0 bytes ...A86DBF2921ACB1380E8F256AD0CE25151C869C.bin | Bin 7448 -> 0 bytes ...4027765771A646BC53E4AF92CA7A643EED36FC.bin | Bin 0 -> 24494 bytes ...CA5D2C40DFF157E5FB70DDC84202C160D01CD3.bin | Bin 7448 -> 0 bytes ...E600461287D8046692CDB4AA2CF94A1AC7F8F6.bin | Bin 24494 -> 0 bytes ...DA0C2C77847B19AE5C80C957F73BD81AD4C78D.bin | Bin 0 -> 7448 bytes 19 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test_fixtures/masp_proofs/0198EA2E90E59AE189F8E4D2148EFC768FE777B9F1B84CA71D843A0062EB1509.bin rename test_fixtures/masp_proofs/{819FB7D977389C0AC073BE200FCE87F8358272338A32B5B411E93BD43D963AE0.bin => 0754547040784C17718C4F689F4C5AEBFA800AD1ABEF2487C53BF97362CC90B0.bin} (50%) delete mode 100644 test_fixtures/masp_proofs/0BB61ED029B895FEEB7681A39C6EDC5CC89E90D6FF92E31C8C872DCAB358239A.bin create mode 100644 test_fixtures/masp_proofs/256ED96C075E42B8FEA99ABECA59DB09065F2CC91CBB86AD65A92E8B92B43743.bin delete mode 100644 test_fixtures/masp_proofs/30F09813D596F8277911C99FF1C6B362D244EDD624244876F9B5F541EBA07FC5.bin delete mode 100644 test_fixtures/masp_proofs/315FBEBD16884E62FCFB437CEA4D13376048954D074973BAD19846CC5570D984.bin delete mode 100644 test_fixtures/masp_proofs/3EE70DC758071936C6AADB82E56C536AAC74604CB002CA3558559CACCC24B5EB.bin delete mode 100644 test_fixtures/masp_proofs/50C53F3CA843689FC9C1C3233686DF79F7E021A374BFCF3C6CA82DAC391C6533.bin create mode 100644 test_fixtures/masp_proofs/520C3ACC87D01E58CF1E907FA00A87507CCAA8EB7647CB2974EB9250922A0580.bin rename test_fixtures/masp_proofs/{4CCF96B9008D42BA633988264D3E116D3BC8B780C76EAEC072E1A71D709AE66F.bin => 59BBC98F00DE442A5EC9E1CE884333592C4A00DDC30896E174422F6863F71D32.bin} (53%) create mode 100644 test_fixtures/masp_proofs/5AF17E0AB182339D31853B3A1FC35062071533243874C260C81A6AEBE8480987.bin create mode 100644 test_fixtures/masp_proofs/7FEE0379CDF35F061B75B7B2145E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin delete mode 100644 test_fixtures/masp_proofs/8686859C447B47946DC21922D83C2404E7EBDFF543A6EAA34544FFF644F08FA9.bin delete mode 100644 test_fixtures/masp_proofs/931AE522191249FAFA4A38C9740412000E423E0085AB074BF8C493574AF3226B.bin delete mode 100644 test_fixtures/masp_proofs/9EF9FF93C65A60615530272351A86DBF2921ACB1380E8F256AD0CE25151C869C.bin create mode 100644 test_fixtures/masp_proofs/A28F93297BBBBD119DE0A2B2044027765771A646BC53E4AF92CA7A643EED36FC.bin delete mode 100644 test_fixtures/masp_proofs/C37373E2478B837D2468FBEE5CCA5D2C40DFF157E5FB70DDC84202C160D01CD3.bin delete mode 100644 test_fixtures/masp_proofs/DB978B3F08838665C1ECD7BEA4E600461287D8046692CDB4AA2CF94A1AC7F8F6.bin create mode 100644 test_fixtures/masp_proofs/FBCAABF07FCA704A568838EAE2DA0C2C77847B19AE5C80C957F73BD81AD4C78D.bin diff --git a/test_fixtures/masp_proofs/0198EA2E90E59AE189F8E4D2148EFC768FE777B9F1B84CA71D843A0062EB1509.bin b/test_fixtures/masp_proofs/0198EA2E90E59AE189F8E4D2148EFC768FE777B9F1B84CA71D843A0062EB1509.bin deleted file mode 100644 index 91158992f136c99937140482024847c40fd087a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9649 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 delta 2133 zcmc(hX;c#E8plCV(nLW?E|m$%Xf9=%36=}FO_mFmJJ}TzuVYTBh&q%J%FRj>m9YpF zr^P+o$lNUxQ%BU2F+Hx0X*z=@X}N_u+I*QabI$diGau$T=lS&hf9H9h|Ns5)a*lA0 z(18E|V8=#-HX264h$fDBRVdjy-xVRP z#L~aO>YVc{guz>v-$Gc$N6UJs)_H#RqAGURQ0Uula-AbWen3>I8JOWAFcB0RY2|<4p@Td#m-?`amblR-#Rh(!mabL7=l7 zYAaLNpKl!^4Cf>;Fn z-P5>BjdrAy>~jz^RHw5WZYf&Tf9kzLHu^e~oQPSVk4?8VsQc;-orIyqf+`3~4(b+D zSnASM1E2;)L{vqn1hOa92>4jPNt!)MzaYxI^0Zj%v}syglI-6o`wBXs8}mit)NfiDsBNwqiHp5oA1h&hRwv-WP$Dd^IdJ{dE51l|$CVk7@AAWzn^`X)Nyd)j?#y1^&>ly2 zl7<=T@e}E(vrTc*UAm&hwAXVVvqi$&D&RQ*&VTtm(_$%FFsiXJzvD`!xFGis!E{`L zKsU?Ru+=mP_+!P)o7##&8V5LOSG|Na_seAv-=*H&Ix|3fjfh%mhKOPk<_g9$7j zCXVmYm_4ut91x%%(0DQt@f&;@g9@6)$yG%;b0U zRp&AMCl{^nt!3Wa$Mjf49_Ly>(HZxX-g0E-64UR_Oze#{zMs=x$_DdSlyL&waQDd7 zUGTjDGimGr=`&@22h#RhwaX9TU}pOA`nihJz;B0Lyk^4b2Xo`oCS&T#n`hk(+@1}B z<)`Bpt0Ydz<(HDRHKXp@eDyBvIi>!(p33N&wK)xrIa4uQn-44%)oG0fSHzp-bMz-Y z^jL%<7t12lK85scnq-EV6TmePwnT%72lv$?S3O|s3&m-XVnasNC7jw)>)zzQgr1=*( zN%_S-`Rm0c%_Ya4HFAn2d*jV1`}9*nOzXw@2`svPLw@)EkqVQBUs9cQt%dz+g^3qc zn5yp$#-vEA!Z}pbE?xm;EGNKGlxys&n9!zH4TTkjpIZw(X`;w?xYn`kC@C&0!B!%f z3Y{4UmK%|(O~}NwW5pnrSyGQq%#B2v(C?ke!nI1Gjb!;l{Vo2H(G*e#xBc-6-^`sx z^mZ4tJ1*_cjc1xrGUxKcS(74Q9}AW%x7;eiqS~Q z!t4)?BpV;c0nBJ8oQi}6-Z>a-;}7(RK)th_bs6i#HIgf`7Ny&VQGw;HPSnhD4cs-F z9>8i}_9LwV$7Pf9?5lZHX$|RqVc?H}WG$oV_gkU^-J3HKTD#gEVz&0 w7Fb$8VoP)wFuY2TYLJNN@$TIGIeaM)duF%cZ<-~^V*mgE diff --git a/test_fixtures/masp_proofs/0BB61ED029B895FEEB7681A39C6EDC5CC89E90D6FF92E31C8C872DCAB358239A.bin b/test_fixtures/masp_proofs/0BB61ED029B895FEEB7681A39C6EDC5CC89E90D6FF92E31C8C872DCAB358239A.bin deleted file mode 100644 index e5e6e93ec1f1b946235295378f5c1336ce7044d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15257 zcmeI3Rcu~M(yq-+F~=-^X^O-rbBhAGx?Th(u z&Y85dR9dalYIUtwkGi|MKtVu2F#hrUZlHi8qw5%~d!A$jedDwo0yD>zuX@-8r34HT zt{DATt|*{?d4lSH=D|B$%6^;ZNFx)CJ>=!YZ2_!`PBY_H7OPBjcv_!wDuJnjaB-u$UVdvp7~#_>E& za}gwj?qXupq(UL4lZUefB#GYgW-o>BPk_&}_aN}0gXFjzgYw=gU+#0N_7e57Gmzu5 zlVh4#)i-3pWt#Z$qU$*M2~7eqra&g21!gT1%u5~GM{brXdT!mR9blWFCBF#%bhu^9 z*zuV=BPqi&Mr#wF%YCLZSIrFXH=~mFjURT5YEkO{_W0P=-jX-FfdTqaQ1q{fm8~Bc zjV)#*SNcsWu}E6Oi3Y^IHmd<8svS$*IWTCqw6tqA^P3jo9Qkh^Kmg^swnZsc9IWX? zaa8maH)C;nVEb?Q>y-KeS(T~g_3_VyKjONs$_-Q@N6m&Alu#>N$`HO0x;Lc5%k6su zMYPOVE)v+?foX!V4+6seT;J*8Apn3a;iqwXpcd#T_XoCL(YT9o{mu~5u2aAXUzx|%4w74rJLUEChZQ{P0VYT65XTR{OliZ7p-B|pK7nuL0}m74SN946Tp zw!)i3gF$^yxxml{NJFOBPDx_0|dqI7Lt}k zj{C%5dDaVY5*K9mGaA@#1mP8vlWg0%tO1S0yY#!cWg;1Sj-T3ZA3LAm!u>4mM6Sc) zo*A7*lyLzo5gqd)wqh5UGW+bEtxI#+!lrYNWnNrHav`I=z%fVwoeNAudU&&F-yNZ0 zu;fsIN+7k390XjIY-*6QAqS}jAk2}(jK(@f_4Sw5(?Ib9GTU}B=XVu3PgNX)61M() z6M$sj%EirbPhlRY*MWP(UN8L#?WF-Fst>t3vV3W^Dhc5GvT0YQ$(omqciY#`cB^ap zqI%@bHz>QhEE*Mpz<52tCK7Z6V7RCoC7w6HrDbn51Yr|XQu7CvcUA&mt_1Zd@S8*LG{w&YSw;0?%eAF4V9z3)iD zHT|;Yj9%bXst(|`7_<)CoaVR1EK=o;tCpct5X?K0V!rDGvd%((KDC=Js6175HkHdgHk#B3kib9;-}$3M z@GSha1JKUxYJOM5m49>`CMO&(fp_s&v>~y4U}c*EoT6FFumJdrNgUtJ%+bu0N`Ru7X+EdUSe+|Wq@ zz81ClJz=79m}=VRQv}=>=hXUvWV)a8SOuEjTP(e;0dmnAGcp1q=EsYH0k1(^>%o!N zEb>BXs5ncHh)tumbO0HXsnSM&;fpSMgV{B1@Pf#fDYFYA8eW%*+Fe@BRs(>R8oDws zSXn%^31F8#7F+mL3%osjSKSJP&M?WA*%TVUU4Ua&HrTjJrf-EO_aX(d6It+hsB4ld zj_4^qOpT5Vz}gtSI;GmF5g` z_;I%Ix9N=-@TTi6#&fVP`QI)xssc6}JkNPD+R~nzQXRBA^ND!b4evJmHz0k$Z8YWI zoG1XNd##7ub5HBJ-%xi9IC#n;kW~z%>I{}#Ws$7wZFa$7|DC}9k5SlwVfyGwdwV6) zxE;=D*qA}!6n$?WWQ=NEu!}0G#TWrZte@ncQ~Hl7937^SG6u*Q-#>YR6q>iKC?J|lSY>m(pK@zC6eeE>>nI zkKy|_uDdWbmg&p0WtyDe-|O*zjUr=Fdz*!adP`4igV@m@uV*=ebcr)_n}G1y{MmRs zP}dggUw(h6^@m!2sP#WlOR-)Hra^w~SIIz;F2yRpf+&sAXPK}ns$|a$CrXwxLcslg z{A4e_M?^Fz`LzR>f=Og|ZBo9ey95SrhZnsH2RA@0Dl5sd@o@R78K}h_jn8*_t#cry zzR8O8_ztH{>qrGiGsTHtZ%VRb^@7eiA;qsSER@mnGj~_Ti`eMCZ>N$6luJVSd|jiG z_H**>WmD~_f_8x})n;APBoT-L!-bng0+@|`#!mof7Q;TOt-*p2<$S|LXhA+f(Z8Va z=b_HR!~+0Rd^MF!(fF>}D)p4@kemUmH$ZFU88#+8FL_aiK~=!s{>J10$a-XSiqWO# zMo-@G{?c*H2IUW-mvTqEsXH8<-_-iM?Qr?Szw_$j<7{6MU2=pbtx|=Q(fgddFsQgYIP)X-|dTtR*^1n7!tAkbsavT^808 zlj7lJMmkbO^j832z21Thq6-;@nF}Xwhzj5qpf%JavrNQ?u#$;vrF(x}Zwq7v!c7a$ zaSoU^V88;1BFe*M)VJG}|@FVWsR0;1#TR5+RUXKm+(-cvm2jFWV#7+bjZi=%zv! zJEZJMR+amzSQ>LXtb;iI7bqbAVL|`yJW!AM9%XsH*?V&{FSb3mZCnAI!i)qteo5N# zShmqmU%($sKi5o?W(;KT)88$@e(yxnPX%}@LkdwhKj?JUV9wUFIUPK?FV&(*lYgfZs+uL=G!|D6%|-xPH? zm9FP~&&0y_HO%Y=K5hFHs2!A&u3G$Dnq%%`x4o&~5&n-weQJ?XO_(%HVU!c!;wH1d zSSx?woC5oe^@jf&S_%53?;lbB4)uSh{ofQd5?>4_l+Z5-7bM^i2kpc%8`W@l_Sk$VZ2JMuW3@8}+ z8$iyDf>#G6Evg83Uk+&R4Vyh0!1Etb{|@zkr~O+||630I?{eRNcS!Ks3jTkC{2ym` z>?h!5&Qmu}3Udq$Ke6dlCYmGZqg1Vcr<}yka{IS@`XlQ9PBH(U^*;~g;V6p9i<~}= z|JnDit1w{5;T8oN>F2|vYC*I!hRxDNa{3~`O09<4bs zH|Z!kwk}S;EA6uU(yFHiGQZg_X3>*SwYziAzX{g4IA4-{=nFWywQ{z34aDITQCnE>~@27~iVM%%^ z!i^7=C!v#(ZtM>b8_>FLV|uFwz2b2A51C93SV2VOn45DbVMS!Q$}051eCmk4f~tMK ztlT4k8X1vl3UN*a7f+zEDx&_>u5e5SV7h5a0PV)TkS!i?<%~I}sB5z3UnL9r6y5(5 z+4F~nALR2Al9*sZMSScGuY=<576hlr#9FS0bH^O#vyNTuofwPXOpldBX2y|9O0plU z9E@}G8=f3`fI=RrhW!t;SI%!CHJ0qINo%*~Rytq~lUQbP7#8;H>3uwwyy?otSKjYMG9moScb{7inwcpe>(d9I*EFP~^7K0{!2+!~(3Uy&?`(?_T;ITsxz ztSm_v7qe;+AGA452T;&%6O^B!H$D`pL|cSQxk1FLaA6{I)+9KhUxx-_Qt`wv1Ju4hd=JH(hpcSYIGyD1Yil9&nRIFkM=z z+vxpux8WeaT)&_sBVI3(-vE6N=1BuNJCd)Id%!ReGQe%3G!^8>9!A37yKBusFJSCqvH|fpx3q^DA>oTL;ybCLdO!?a`;H%ltP8>vlf+6ytk(`7f0IJHHtD za|eReaj)HTW?MCkog8yGm_nZ)C&M)E7rn#V<#&z@>!9ea@1!hJ=*I`;#(84M{khYBQ%}N)-3}< z>n`xwTGeKohRYis`Wn&I#TagbLyng6yjFIw;jQjQGqZ=sqO)TRLz<0z?z%t!7BuC4 zGRTXD3gHwaKMCS;GfIOlaZU{a>KQ}ope~sg8DPFm|y-OKt8CecCO~!s`;JLKa8LQ%EWNa;fI$lZ1(WF9=wC``>fIB z8OXdfsfZ`_p_4AeePX3IP+ocMKdlY2%g*+Tykjaoio#Pi7Zp zX|C_petaqpS?O|OEh{`G;)#0R#ftY72h^FAW8b$-Pbh}UblC?i4Kryo2Zw+8gQLgB zuYCqT`vS{QY~u5=iC0RHbCE!gi*mQuF2hc+P!r9fmy$THtAi2@np|eCr=2#Fu6k z2LpY_*d}UBuvg4a`7);M^aQ5q;Mm>^Bdz((Uo~Aut+ocxw}x4*r1LDoyQV7;_hMSs zoI$lhfvecUJmgaZbXLN>wmZTh3zn3GjPOGI8r@4r3lm^i@F{;+ORF@)j)b41E{V-u zc^ySxPPTX&e~Rh)gTPA-rD)4qt*qFGL*0^u zo=MmxG>u>O=1I(^F{M4xkI)X@8&7nys*i{#<6*8}nAXB*uAl-=1;qH^{X(mY-L~xc zxjc)sR3e+-Wj^yd)E!Dj_2?7yuMn>=2>K3*F;K6r+*c)XH9JJASiF~UbcnseQd$C3`VMW@=)R^rT~i(guU zPuZ>`TQWf@!@ya&W$41gdgX zA?rZUf18<)RqdzfGYMYa*!%|QwMeD2q0?Q*lv6>RW9k=mlA~W^3taWP2J>6?!-&0A z*av|A(zNv1ArLeyJcCG}QqDQ^7nKjwEGWHhc*cm7vtwdi4`^S<6uF3+vkmpYr`+z8 zAhV6apl*f*#QOoFTQ7R#AN?5}4mj)x%^@Z+Si%T8!=fU?Sji~QZeN4JC{x+oQx;A` zP?wY+s_jvj6M>WkbLurJx2MF^p@J0jL+Qgu>-%Vz5-v8mqVU zzIeGz&+E}NvSVBN6!S*a;qGS)V270w(`#^=)h?HelGk2>UxZ4AW;X~;;yBJJqfy0`@`5X)4nSXe-SB(73y^%VQIPWyTqcUF%hPs+mNp=$u{&@z6ZmMCEjFK4OQLz(6xBz6O zp+{NH&R=0{pqqLo&B_dy`sB=8+weQiAW+y`@yplg&_Nee@2M2?j0NNv_GSs@G+Wz5ZA&jsCkCWl5 z7<{XveJ>IxGrut(`J7+W;=EkuoTHhcOT1axVYnIPWS6SLPAZ*TER@~2-W_LgV3w8B z`C3;tEt9r9GZ|BCfj9H*^MZ>Ov)^O|nP?WBac2xm#zt&(J`^m)$?|!6_=e%10uUN% z_4*AZhNNxzhL~20X~~tn8*$Fgatt+Xd@uNfSfB;Yhez9Dhrd$+M`{Wh;$2`u#Z_s1 zyCBpM&sdgCc8N5j9(a*b(7vG!z6m{cuZHl=-`KpI02#w}3B+CADOFkv#M(7;VZ8bx zK@7>Ss5|wdfA~OA*ie?bh=Fzh`9<42cr$7`lM5s8qx*P5(hHU9Y~FSF0SAb|Zkj7} zCF{UEB#?#_mQp?Z#7Qwv%WJLUweJNDFxa`Gr|C91l3WkrgnH>0)3<9)x@dQM1vETQ!_&G?eg^xl+lLys=N5Wgh^%kln<;^wmEBzP^kD5uw z0cm4b7ECnJ&oAV4dn`(g2A7|LydEy0kZ=6^`eRXBK2Uo&fmY<=tD)3F0k$US;B{Sj z>4MT+PQCkM)v(y$Wj8&6%U$6>qC6I~U)f7o7#AC^MmVv$?0H+`?GNgvW7kQ_+WpP2 z_2z&bO^IzUILCPt-wF0}PnWp9>w`f2^0k*YmuG(t#+rP#vn|RO(813!-VLcA>z^)DRWGhbIN>f?ou&s`|Hl@G=AMqTd$b}U1 zn1Y5vE+Nr>c1C-ekxajgNL%))5jv@~)0T6Uk#o@g`5b`6C;ugq zW{jD4)sKrXCTneG+VC=_X^;rutvhy6W>JsyEA3*v?8;gAV6!cvj`S)vku!RNSDIFSCt*RHg= z`OA8pFvJnX_hCDx!J;L6)S#5|Q7oV0!*L`30aUJ_>kKi=%mrG6fro}T`^}j328sRK zt71)17O^7tL~X^i9Lur9D?4%7RAEN%{M^e%x!#5-OL;wIp=R@RXqdy~`It(|WVNR4 z+C#_m87Bw`#Q`&YtxDh0eOX#d^`4)7veYO~#faiPe3ef?4TrC{h515nP>0QoUV`<% z8kWGNRah}J3Ery$2XQ4V4gutqP<9fozUA5ehcNzlNW@U>#QCsw-UCo-3j-E3YOqIV z45*hdKdDR_;k#q|$Y7rjwp#=AvNQWf-`C(4afJ!)Y@-vBgN;^OtdLv!bpRed1-KM6?~9%~N+K+wUr>unAcfGmY*3{v>(#9w%81Aq0v^ zcaKeLEuS&i8-FT@e4XZv7m?9wC_pMtYF!R0YxInVDx#5nc9Z~IS(gzXzn8XQe|cb( z{#c7}(fv7WvX(gUxqLQ>!Ck0!Wer_ldOjiq$`9^3&CBW`Yid=N+3LG2TkFs0I*-Nb zcJZO=<=gk9MV-Dt`bPcJfoAJ;k&6LiVv|@{T?+O4Bq3knNV@GKT?hqiD`RAXB5m}; z^vkt{-M7PmTD`H?P%c7@9TT}~G%g*E2z`E5eRhA=py|N3%;x?oza2neaXiV_hj*m+ zRtwQ3RSO`rYPcx13KCjrvwU@q;TiEU>e@v2s{9m4QegwFaYo5eVNDMYs;fQeVi=PP z$lul4{9TDn>UMez7IpqW_JbpaoTY3}_pYgib*}pcQ5%SRo-9e%iaE=zUHH@P<&s!E z_zTG_-QtHGO)pXT{18M#yFq}uLH6uzNUa?eM2Uq3 z8nEUczcbKJL9Ihm3AV64MRMR}D*93(d*%cb=(GF0GP=U56{@B?>v8k?u_Vey!Q@Q4YZIes46gR8Dv&f3c2N5E^$zDR=eU03Ts}c zLm#uY71mg7|ExALaxBC10LRrFLN3j=Vi-JhR$in%{rYkW#+j$Z0LvCiCq=5BQM>U| z#+5R26ZCG4Pd{fRoa$t6B%bmmA#cNU#g0~`m7Fhkn(`0pZ!X|Gl(X8wxsX4}CTv*@ zDS|uLNEgN!xT4hz(!p-nJg|Qg3>T=uY%hPrGv1 z-M{sLdr-39e6@jYk4&-ZBv@Tls;LD6>ph5{U^+e54t8QNlC%6End*yaHM!;xDRwEX zpD9SXOYYpv?7^b?b`)X-9WCr)b%_y-x&scrC&YC&n_hxCF@Ig?VlS~=W@Gc2sN=H% zsb*3AX=@rjE!u>r-Ej>*76hDM5mm(g@^%3`nT;sJM&`bFp$jK_Ud3SSdfU)#*F?oU zl3%h~dVF&o;rf}4zDL(>JP(j2m8B~V`%g$WW-A-+1t^@fsFJ-9Q_i{_HBhou$b{YHhh9vaV*{Z zCUoOHp`tpm)qtN8JB~~yq|tmJ6S;x-&;(Yt4;@8lh@x0C#Sd#MQf=4sYkU)5P9(Nt zy;0?|w6#>q=Xo-z7#Og;7Y}Yv)6Jwh;3qs6rKejg*yND*#vRQy(j{pYFI|ORSX=6H7`mVx?wK#POX)zb zQM;p;kfmm@*|4qlV}r^YeCW!D*ghIJ076OOKocd5Y3@i_jznr!t zAcveWphZ=*;1&bp)NurGn_+8-0XJG&ELjOPO+eE#ZAGx4x-LfF-15wPVu%&R@+c9fbt9q zfoWfK=u1T3J~&8SRS%vnxWL;bL5BwaB*2u*F&XKpdQ?sVm7S;~rY?L*UUvbulRX^16=Lj31T-~>S!KG=BV+9# zPhh4$CwOl~#TA2k6F`JwX0qpi=O~sg7`yHAN`6uqcbhWdZsJj_r z;R($_c?c?v?6JRAE7licm5=I3r{bZ~CLh{LdL@9oi1qMCYg$YwbR4LZ5?O)#F*xbr zG+7xrogC!Y5vz17&nlg*e^*8Dgj-v)d$Btu_+5rr0=W%W-kF)E-hE|*6S(MpUY=@t zY9ID(x|B-c{;qbi96Q-8Tlq0U^_`7EQnD^oWhO#G{yMt&ZninG0Gg!(NI`4&+C5Y#5OWsYl`Ym=!l6^h$F85~v`u888W)Hv zq6QJOj1W!M(wx=bwy?GL^_(=i78O+1ft->-U1CA!-0n}&%G%3BVsTlXwsbL6YCsQ` zRSwtlU`@-f{V@4~sX6j0zf_sJVb@Tfmy`slNxYagKU9ksf86VV0WEkYdAufHJ9S=) s{f9{V&2`>P%*f99 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 Te~*Lu>-}E=FEFs*MO*(1gPe*f literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/30F09813D596F8277911C99FF1C6B362D244EDD624244876F9B5F541EBA07FC5.bin b/test_fixtures/masp_proofs/30F09813D596F8277911C99FF1C6B362D244EDD624244876F9B5F541EBA07FC5.bin deleted file mode 100644 index 1329396ab9810bfd2f884dce80a72acb57c70713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12448 zcmeI3bx>W)wy#-uShzbY!C~PL+}+(Ruy6%7*Q$Ak9v zVADWcLAX1UT9%J68$nbZ^hZ!a*nil zqn3DnQ%RFCGph0kC&$tExyHcXK&*7Fm639Y z=wNU0j(xeFi77(Drr~<)$#;*_E@`(+aY2oAN>(6EPhPQkAY(%|M+9tK(y%aQmpxy@ z7Q>_tgu9+`82*!l?-pN}hX}&)dy_`%e0ds$xmJGF0p5^u3^$)HsXMtugAc8)2RtHP zXT-(Nh?}d)BaHUjV3%;%eAt#x)4+F)>!g~92@gl^PnX9yEu5zB z@=;0F~Cf_a*eLIF4dpdhRESez+1A_vf`|2Ev0ti{dw5oc8qr zgM3d!eg$9L%xjnX&_||^7dlTCa@3yCLFITipAfty*v^3jQ^T%AiUGXU3$rso5Elp* zA_XyH28BJC@pl|v)CI4vW{@U-2h+z%$8@uFQS;jBvIYA!aDbvNmB1}9{>^x&{3f6^5-g&9;t`$!NFJ$K=8K$%0AOhk@{vg2EcR^l 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 diff --git a/test_fixtures/masp_proofs/315FBEBD16884E62FCFB437CEA4D13376048954D074973BAD19846CC5570D984.bin b/test_fixtures/masp_proofs/315FBEBD16884E62FCFB437CEA4D13376048954D074973BAD19846CC5570D984.bin deleted file mode 100644 index 3e42d029c4ca48476a1e6509534059da039198c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 diff --git a/test_fixtures/masp_proofs/3EE70DC758071936C6AADB82E56C536AAC74604CB002CA3558559CACCC24B5EB.bin b/test_fixtures/masp_proofs/3EE70DC758071936C6AADB82E56C536AAC74604CB002CA3558559CACCC24B5EB.bin deleted file mode 100644 index 92f501db513f45445191e3ea82ded2a7818cc0d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9941 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 Gw*LXQu5{)A diff --git a/test_fixtures/masp_proofs/50C53F3CA843689FC9C1C3233686DF79F7E021A374BFCF3C6CA82DAC391C6533.bin b/test_fixtures/masp_proofs/50C53F3CA843689FC9C1C3233686DF79F7E021A374BFCF3C6CA82DAC391C6533.bin deleted file mode 100644 index 5d71d8783a93acfdea00cda29887353e544e19fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15597 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 C1?&0% delta 2133 zcmbPXHN&c&k%56h6o^@XSYWg9?FG?GV!5T>TRimtTdXU#D(g>j+P~9Zmvprp%A3kC z#k3r#jA6R)`IV2HbK1L^bwade%{-*%%4l@c>&n$Hr*C$2OuVXJH8=k6&njETXsHO! z`<-es3f>+;AblW!rnerfIZUPQ;>ET0ONFE*Cx<{Aw|8#reR}qz#WOhC zC}hy0gOaF3j>-A~h)M<)tA{ePj~*$rTz1hczczJhK=jlpHz!Wro4(a7_a+^B)l}^Alb!bWV>Hv`aq;AG0TYF}X%7|F2F{c(3{KN1oqLf{;8T~Md)n4ppZ8BW$I5xUcJpZg zp#1@n-rY&Mi)OHp+pjrK-M@yM;{@+<$-Gd1_O3 zm6wWF_~Kg+t~dtIEN6bVX@=3x`?t1i)7rH8zA(`K5{r+A?*9A4x~<1@5uYBH;$(iY z0Ef2Ixev6q_5Ro7$TgYUw|IMnGjqDd!=pJiEt8wQHpi`8JA>oPt?T+Cocp%(9^vMj z)vBNLwW5?ODPDNC*^)P_l_t*@Gf{|?>TOVocoT8vaYMh#rmglqllIH6Voj|rJmYXm z#j|Vq=Feh4`(-M7jf~hDEmULq-fdE2(4VX<8Av$Q=bY;Jj|5h)(e(I!&-hg12Qk?e zKJ74-a|t#ZDgu~Y>f|y@yL119z5Cpkv^uS~<Le4dzHC&Rt03DWnMWuyfCP17l^ zn|k8F{%>Yit`z_L#8}I@rT*vUEGzcd%QjZK<}En)uj2*}<9cqUFNU)?12gW~MtiU1 zJ<>1#=ON!OCMI3Sx;e2@T8o$5In1`u_M&X(B&~Zu6QI zw!Ez%d6jd!q}48ss5vL1(pXzhzgqq$bHQ`JIu9^fS z>SDW4fBijKj=3v)C(pdH?V|bGFaHk5Z9H=>x_iHXz=3BjHw)+Q(stpw?ba!*`t+mX zyBL+VuV4P_7X8e(p=a%47qysu@{#T#EAG^9+vYa&o9yh3yDBzaFFaT&dHA&4qKIWr zisYU?>HU8$c-~vaS@OzO#htI$Z&79n;r(cz(%rpw*Bh~O9qH{~uP~*ro$)5&m|bJN zreUlzYrvD_T$@E3L%xOHp83{R#r24+-rUj;+aK^B{@x+iy_Yv8VByMIkMGwm9lO7{ zV7Gyb!m)Zu&t-Mn_;1)><_s`@UfuEG@ac_a!t&W?+FmdyM*lf~KKh89e}T+pCY9}~ zGP`CTl@QotGp}Fa(fl&r>66d0I&;rb-Y>ZFpYZL&5s5O)yJB9w>~rGf(|>wE^_|g@ zrH^*K^icmKxLc@3L%`8v7kA8^cz>mZGq+YB&wkCZq>X?3vib%6A6I?d>hWswd)xab zzQ|{*S-;*I79Vo()92P$i+d+#99;j_QE7wDG>JbMQyBz>pRg9I&uQ5(Jyf%Ip1Byy zM*WM8a&=y1_2*iy8O*Zu`df47Tl1Wg0$-RH%xgGO>6IKA_fm=dv1Oc0)%G>-FG-%a zk$aR={!>D(Y`xjLh?pa@>%T^^?Ryd3nQ!M9mwf0*p0d9d@4Rgf-^rBvu2d2~E?Kx` z-=FFRVX5p#FFxN}S$6&Cp0g1x>K|nc7kap8%D-={ytHqlim=d!SL_}hJv){(!|fR$tEEBC3OlGC0RfiDZ)LOr9?j7P diff --git a/test_fixtures/masp_proofs/5AF17E0AB182339D31853B3A1FC35062071533243874C260C81A6AEBE8480987.bin b/test_fixtures/masp_proofs/5AF17E0AB182339D31853B3A1FC35062071533243874C260C81A6AEBE8480987.bin new file mode 100644 index 0000000000000000000000000000000000000000..78ecc831370450ea2be8b91b39268ab192977597 GIT binary patch literal 15597 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/7FEE0379CDF35F061B75B7B2145E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin b/test_fixtures/masp_proofs/7FEE0379CDF35F061B75B7B2145E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin new file mode 100644 index 0000000000000000000000000000000000000000..bdc754475ca3992a89a896add3136a6682fc8203 GIT binary patch literal 7448 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 diff --git a/test_fixtures/masp_proofs/931AE522191249FAFA4A38C9740412000E423E0085AB074BF8C493574AF3226B.bin b/test_fixtures/masp_proofs/931AE522191249FAFA4A38C9740412000E423E0085AB074BF8C493574AF3226B.bin deleted file mode 100644 index 4e66ffffabbaff5eaf38b7f408922494f60e5bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17018 zcmeI3Wo#W=wyn*~%-&{ZW@dXk<``m*nVH!!W6aFV%*@Qpl$bHb*uH(bPp)1|S2{ns z|2&;csWhrewQALxHS}o~EKm>-5X^rpzXEjHGw@Us7-q1(^BBvWIJX38zO^2Dr*yQ_ zq4uu35y1rd=aHb5vwC*W;B=*^!>a4>i1YaGwh zG8ace=q@HjODq&+Ie9o=K$7k)Z}$FR^8~<|y$6909i+tP8dUUA6TZ)>+Dp*SPDhT* zPKs$_|G1$5F5e_b5M9SDNNf^>IR!HLEHrER)x6ZPedKnjqUX+o))BS|T1Hsp!10bF z{dgx18}B&XJyCVCF-(fF*;-)lE2QtpSo0cw>aMa+tw~}ST3woTj0_^quVMARx|-#_ zTC~{*7t6NB453YF!BAEf$WLF(Kg(TBifMze!$>XdAfl-q-rK}}J!0D?MH#VjXauRv zdPL;RbS(!%_1xW3%_I~f9k3@xz04UzcLzsP4F1VAZ16scH^n@TphxV{kOmLj_c;^S zHeu0J~c!7h_l?mW6w{x;3@?2)NZb>zymk{U`CQg#*BclS7W~JiysYN4)(GLQkUsz z5~Sk#nffSrEHzoa_&2cuqVIw9?cj^mnylh=D&_sh3iYj+kV(6a;0cJpx6<)$5)Z4w(oS*L~(V?&v z-W(bX$|m^|QwJai-6lOQ>&_3leQFest8M)CcIsTYajJOR!JQN-$wvwxBK2b-aY_8R zPZE}Iy$~;9L190=f#X&LUO6ezuC2=&&`7$=xSLxhp1$XV+J5)g`2-j4Z)q=n6BhT( z>>{p;4_Jxlm>0K`yu^~<=j?1`?DVH(oHnR_Q3HCZ;~AE4^yixZ zWcpSvZ;yKl^FX~1JsS3U8Bgf145`t4DL*1BmR75i0c@5{yE07Hyls8jlyK}<*9;`| zDVuLmc6He_D@4xX^#Pkm&=Jg)SZ+|UBJLm|sY2b*6pGU4~&sdGmgZThq?3&u; z1~5-`N6*d+yK}*(?(PJ-E+`z~lZF;@*kB}pR&Mvv7Ab2>9_6q6fjJ&SRi~i$9m)8n z!fP%V1>U6}0lXH279uj=M?3v-_seaI-Qd@3dld|D2e5MS@Oyij5CPJ0K4t0hunOj9 zs>u+}^V^aZDZt~ZW$0uC^Nz$A8v{VrdFa7YyXk`3Q&neEIq1EV4n3akvD9L zq8ey;OOJ?6qjn4cd6TKq#sIO)E=I%IHD2(7$d@UzOA|#o<1U4P6#?)?7Gx)~;PFV;Bv%U2 zOKO-F0~x?G9fh7cmD65F&+<+*D|bXYZudhL~S8(cOti`YY< zw7QjLm(ZvhorPY)wiY$unhOR1kl`{XFo{KZY<*m4_xJGp&V^bwFn9A#Qa149R<3mk z1?Xk!#R=n3d%%g&VH>21)5ll1J5Jqol2Ax>U8&T%rQVFRte+J!+%rj zH?@9K>;IzGbmz40c&K7?Ug=!;Emz`eIr~7`S`%DG*I1u7n>HsI0Kl$TM|-^-U1Vm0 zfYPET9XafKz^oj72j0B?ji&)11gJc<7f>1Q4`xoYT2lYUZj!D$w}G_|w_?2YW|7{M zZ3u|2I|CcU8{HO)QogiL<~`)*Z!tj+w}Vv4<#dIGZm|Ur*n%W2j!wa+y*w9;3&o9r zeJI6I5w+lZ^v)yi>6Q=y1d%t}Mx+kw;fJdb;X5H{U}As79~dYpnk>OYrKVpH0erAg z2fULgD9{+K9Mxs=pkB;Bwe0KO}E zrIv%7FaO@+uL?bV_qTr|;?)K=wV2qIJF~wv5i=QKP}4wTJUqZcRtxU45$f_)A^`ZW zEBQ^h--P>3xc`fAcuwVpm}gxr1uqzYLo@2VjW5{KybWt4Hmg(I1t1)lfBkg)l6X&3 zyaV!G(|XQ|RU`m2M~%YDQHYe*k@0xrrU;e-0LIMWkDu8}iU#XVSkecvaDkL93Udrb zzr>^FakuFu16YX(ZmeAQnfuCG;QKAf*9uVoykneEZF0J# zC>Xk^-uaHc6n-cP9T3ArE|%s8r-=dBw9OZ8lcg(r^ce-*>zaHi;G~U=&}~QCBpM`w zU(S^U$k>InPhCotHJvtJ@{E0%K48r?Op&P`BVu1gmLdm|1^r1ZsDCKvU%fvxFO;K{ zU+dsg8sXu59dZ3MSgcoKVXTb+YXBfG`jLKbSiEwH!$9vG0ao}|00g0G{pXXpnr83$ zCx{wCl4|ALANbbf{Yo;I)<4(x(>>rJ%%=5%{;D6aG}hfBqsZ^h)cIG;{2m!+ZNSC1 zD>Y)?R|2=s9VW~%_kRxXxBNXb@ZU7GGI^2Z@QR>+XuVogy|Xv#6s{mbZNViGfvAm> z9fX9?uMGdkrarYut|m?#rZUcnZ*iC3U#wNUbV-KQW4{&DLodOY^!shVMPJ z`I_ck!lHo`9XI2r&th9#m~f>*O^a1si9KHlxIdNg{L1iuZ0abW?(R&4SpEuxMmOwE zq6bqv-N$c9k~_2%G~-^W`&++F{VUafPyKJ2dLDL~-RdyG-fky7mxwqE{JKSg@a)>O zvU62gcUgBa<5!0NV^gbx8n#nkF`;1QZ=7*&6#R5l(WZ%j_v3>0*|6QC13dpW^{-U_ zJ@qe5z2iG~PF9Bf8NE$PTc=hlziAQ9N$~ao1W>MPSCnkU#hykIN5e>UI~J$^mo>Gu zm%<-eE?fU@JhqsgROvsh!X{%4ClMI;vsvRzy4tD4gA0>>>#zC&bC`gazew3UDaP@?e$)yCREHcj8)i~Lt8gv*ZR%gQ_wT8He3^oyDyA%Qen0*r1ONIT46Gd{ z0CcqiV%EpTxGIB`7LI=3y#L~d8@44egh|aRO=g0`P$ z+=^Qfqy$4LS+Nlt(7WzpdaDM#Fv1X2tj+-+<2ADGL;T2pg!(}IC z8*PhOjAS(J9=!9fB6Y4VS7h({#L27q9+dHl;xWcTC6u>(?G3`^bQPC zH#9MaD(-k?o2xj~6MM@T!2`{56Uywd6#?h~GrC7*hjzVTB}AWMjw} zw4b!k4{uNwCOEUmi}O!-dic8fCWQgG`7*xM8gXL1aiIs(HpFYH;#n=Xdo+ z!(9K}53QGo(9%WVLcoFTS%vBkV)BGMF+c9&K}occLrJX-*w#{~8MrCg)WHa+d9)C! z(#1CjQ}--QPRZ_+x-@2F!7qEK?<^6hMwUgt3LkA)=3aDFq-_(Cgsj(uwBgKK5^TVv zP+GlhyD=#4nyx(1JFpbX=Fe4wPi!hKx@knC*Vq(>5p~Vl*wnf_iYrYigiQla>+=EW zMmOpVe#W~dvv*5qxHYV@tqj#3Ho}`J%9uqhJ>0Gw2Y*!S;XFc+?otR z4=-vNI)B1aicTGCZP~AvL0duO8w-*E@gt)3ptE&(6@JVZE7Kq252~@gD$A{dS`Ge-f z_s>Ba-NixPUq&XCmhs`~%D`4p?3Yp_3x7n`iJy6;>#AIWYfnB!2GoT~Iv<%49@&l# zB&GFoP9$(fJsYgp$TjA1e?Gu5Nwah2iT$QyGa@eE9+V&8o66jW!1t$rE9!W!C6Xp`NX#pQ|mBy3$d7| zZ})cVvnnq|Saw*fIL9er%mXa?JeOfV&Rjy*ASCD8LLE0u&s=u$_)ILVX!fE3$N}Z&R_Hf-`{8)5;?e%5y&?2RN9PG5JV=F_j&H!vsKmfnNhoKal|Ba#$ZCD z>1gRlZO%=0%WY+(6=v8OXvobdyYLVVlES>r!Ia66t&0r|RbpB={MiJ>YD)ag&LIsw zQ=fUi1)7S|Wj=0t?{~J@;xExvS2Hu9E0DE z7I5oysS`Ln`|gGQ5&BQQz@Cr(5l^1VL)qeR6%4r0&M8a$)7o?!rDom=PgXA3U#CKMn)_|cW8Ro6 zKEuw_k2NW>G z5TtHa6Yt{NO<$v{LDe|Xlt~~8N{U`J!Gs9C1@!CBa_YK=912qy;a-fFbazm8Q5$;B zsh>C>>=~PSJ0fYv!`=p#ijOM13E6_GHQ`APGm@J!=T4fo<;A{vkhQoBxv8|{FM>ek z#6J=3#ywq%D*?Y7o}yZoKjjIs%?5EY>qhT+^L!FA%*nn6+^G)d>T+<}*0F~%pf=A@ z0V~F*4`dvohH%(I;{0V)Dtv;IxRe@U*O_^%)P}%2A_75_fQ@S9WVnUx=@h0P#;Wmd z;FeZK(e>iI*B3y7=u@yk58HRaDlsO+3|PmD$5VgyJzCQ3 zq<;#p6pUB+UU<;K#pEu8{)nXtwH_LnQH~>u8P+-@TLSE}LV3b+=nV$OFYvNPY|JDa ziCa#bhLF20`(=mWr(7?q5T*nWEdU@1kB&(|X`4F42}&`_)2ZzMe=XD2YkvQkV>sp`{+ zcYdB@q-E=ODIm%QEp#zF+7>%(LvuD#Q_v9a3KJ@&PUqJJp@DeLwrsLXS`vBg&^oYv zVF*TY#q2QJZh_5wi?5KeTRQ2-fwmaMRhvPrE_SFRD=WP#BrNiI6TW8>Y2oqEo1BXN z6@Bnk^s#$2L}32b_T}V^Ic%3m%Jq#}t+hb1T`L#HyDt*Ni1M1YQ$IS>7mCW3y3|z? zwBt-rqRo>(y{0p%FoH0;k1r&xP^HfH?UNwj5b=w<)(S((`dJnr)5@&qFw|e%j^q-CC0_`cZ?PhBg#%Y|3P>{w?fHTv}J?jhh?y zZBJW}i`-i5dx%8RpoZ8;c&n8DLbZ&dxfWriKeN&IX0mZW>e#gf3tjZ{3uWCNn@XeM z6>6~e!xa?rZ9rdtELzJuS`YV`6{XZ_D6MFqoe2hbT~}V3h#Ze|@BUadEG~H2ZBNj0 zSNIu89vk|%>?Lf>%MCYUyjWe%ysh!}hmWRXH;Jk`{mroT=71e7>1}T~r+E{<3C;^I z*SNl$!yv-)wU<}d=KwC|ntYD)E$SE0L7W($272T*q}rT-!!doaXP?uzPgK5eH|Q-Y zEgZ{$A?1=V@$ZMKj!Z2nh4S&|HW>i`;Ya|GTj(f-Dt9#DEgVc z$nd1EcgddpV2=34Z~8~;%7L??lyQvN2Z4gk*zeceksrjJ(%)4yeIycHcs&??l-Wu} z3*o7a#>LD(`-ypC%4Ea{3jY3m& zUyHAzIE|zgW*GhD>@9SyOk`9MWG&MKhDM<4g|Y6id0K@2MH1^l`4r^N`)oO%(U}56 z9#w9I3uKL9KAxDq*lD2&r~YS)&eNlqSWDW%kmYo zyFu7|ktUm8Ztd9Zx5>n z1q~~798Ah}?ZU{Y`K=}@vkDrYal!$jo%&7QNR(IWxXK8fjH=oP zZrYPs%2_0k2LqVzSXEKpmJ+ZBFj}I{qLf&Y%hwsOanBC5MsVuWl*Lb1tdh0~EN%_d zJOe*3u+!yORv)Y%eN?^pl-P=+OKZhYZ9C1307fLx9oHM3-mom-Vez?{(T`rIvq)s~;bv{isBjD&9ea-cqXuTy_nkY&Y=Dh#GK9<&@}3zA zMO}j<>3!x6jy`6GAx~jZ;ZrKC!Fhx;?6E9W8lRRXj)zskCPLS^F)QI})6&_$3@+9g zh-VY!?Ru{Gtw$>Ex21Bph)y3DiN$6Oak-DW;2>eprRq1sMW=>qVmBVkG}IgPFQJ;) zw|igvXSw!J@Surh(`t1l^mZI+JJ0NNb7zC#rE;G!8*q8OwAw*LyEq1U!CzcKw1o;c zl2uT>sb}DDa5a=#x8ZXKU&$4)YMN^M1;XMzi9BVCq4%yRTQFSu*N1c45ZorOXziGdW7cn!Er@`n3^%Ecv`=n{SsqIU4zkod1~aR+8a=mQx-8 zFvH*{Lfb^RN4k<*3IO+eOerkrn&X_1pY&38BNUvD`!^ZGD`qsZlhRr@^;3K;+PhU& zUnLS^t@-wS8?54)`ZLv27C8@4v0>ib<=`N1zUH~$TngI+c%Bj@-vU4LT#9?E=c`|< z+m~qBcv%B=lT998?>XCY7~>A}hOr(Jm|rT?950ftOKR^PoKUH=RfVqSPq{;9_+PwA zEfTZrp%SlUKT&<6AEU71%)35=1|#msQ#>80iDT6946qq6!mK|kL*B#`0pQ!CW?OCS z&z}DHF~;`hNY$wsZ*_9ja}jRTmPB6IvM{GWl3*otFSRYLV49M@T@H4tAvdCf)4G0m zmV7uW^{U~PfD7ywBum(bhYj@rFX`yU;ieHlZBZmuF|zpV)XBc0&MnnIbRX?I>V6e> zb)=R-7(fF?Y0=8qJHnm&bA?hs;Qe@M`vyIAD4w=$Y&hmD$iUH&FNcVzf1o=?6}gI6 z_a8od^uaB@W|Qr&F1$rbb~bQbT%f#+_IX1ly#(b`z~{?_2xb;!Qx)))@2OZfK+Vj)CoYqtdx;5T zksE!VNzBcHuZRM7{7ybMf@WnnrYk0-L$4Q4)q6~Xq#JV$)M^Y=%DA-&cB#czLWtO_ zu*w*5iJh@tQER=NPE6*F4mE|+9oHM_1?_wySvG+6mn4X|HWbC+uC_VwvSp>}h2_!q z{;K*SY70;LK$w97-DsYlD|N_qq? zH6$z?3!@EEm*P_|qGQn<+-x|Bl~(Nmy1W;u%VbvJd`&0HPOGS^m($1gw+J0g@@?i? zv7dFa{9=ufEwIi7hN1%RSGk28VBycfCO&lM(K$TD)QWwQFqN)?vAN){FkJ1dGtc@O zhCh<8Bw^*1(V;&e7J(<-k<3A7tlXmpZC{e`j~bH$_rtv<_Ri`s)VInDtkk2pZ2TIf;f^vRqxx(XDpg*VLvIc-zbT?@3c64S$(oRHlt^ia&x z@MTNRQahz(l(THODwwFDMW-X~4yb+|3 zqgi1b^OaDx*jcC$%yqxgK!&2$(n~87@x9@f)4~!lflL}f)g2gPFt-7NL_r)IpHY7y z8CHTyr+II|qY)s=K!3-PCNdzq&`kye0@x|ZkrFEFlh&-wKqIFB5_+6~M1S6Zo4?&I z8gs)N`gLhi@|)Fqy~#|WJ2hXAW%j9Vtc7aoJOT*i1Vgn+dLNH6^ChTc(BW-(P=@31 zCCFb*!u+ebm$Bd9!#)q7yUL2{k-L1n61I@WU%MyM!0OFWzZ*R(30e>a-=(^YmN?Km24``+XRejvPk4m#r#GhQa`|F@9&8-Z;`vkN!aB< z&peyW&o#j^`Gp-MMU!$KEU$^jCQ*ot#TWjAIvxcQrN{XU3Ux5xD#8)obeWMWXHVs9 zs48C+L!u@rz`NoNW zb4)ckUGg|v4^)r%$geg0Gyy!338`;eeOaFnRwShU31g3;hn|9f7z(O~4)TgFZPmRC zl@(}_p~-Ih(L(Hb$|%ZGvt?i0U?QO@R8Va(x^ z9_&~Q@787vLKkn^%%*rM`vt3XTq3{21nRCfivzCfxN~fg5J)hl?!s4{mn-Kn8(QzR z@YKu8JiYYTR`+itZtJvVXEUt~yejJtL`_1YkM|^)8w=!=z?)dco_FY!$4xwhBN+M+ zYX%bIN6%n_?qY?FvImjCC?r)6oEA(6hgGFR$&8FgT|G@_W^gGTv(+EXx_7mBLMLA` zR2>lf?!Goji9j&;7@(5uN6QmWbHSv17u2utp<;#}W2RN^u9C+OJjbmY`T3-{caXZC zIwn^s%H&@Rwt>whmRLopffVu?@2Vbtg^)g2njz7~^0s5?m*C;KvW3YjWP z4eJg@wC0MAt?XwHG{4FccT^D91)M>=RWQA?;BoXf8ql-JXGm z?}9>7by|q=v&Vg|CB8@poN{Hrqo;z#ll=OoeXVWZr~E`HY-QL182tX(vFhV-doJ=F z66efFDjraEJ2%T6WMtwP%uCVF6Q%edxk-I#Q(b@`%k5!vH~ShSU$tcfEEBtj)gBu%Koe6cE3vKpBj&Hq*(?ol#1-VdTnICy*j3ljwQwbd4$6&t*9r04A0TgT>a3qC@pi8JKXoY0jV#i z`oRnu;YvNFN|y`*0mLz1p1SsJW|iSQRz!z*HK+sUZ1<`HHrg9M43F648W?`lW<{M z9t1i?Y@z53{?^OeDHlcpzK$Ihar8AVjYKdkj7urfG2xF(l?BKNwRT@&lb(wuf*)?E z>RG?0i@EiPbytJ=z=)cs<;3?w=j&cezK(X2dq<*tDzhvu@4oLhG5+3FCfvZ)1j|ga z;4MToE1ZTSYAXQRakDn}RK1HqDc^&TOZW95f=geWa4#|_8Pi2nC)+ z*34YJ6YSAu=jiC5hv%qkF2|BJQ!N~sCw&xzIKaQ=E37fUvb{-E!NrdR*i`sPW*Lif zu$ugsT7{=D0SI`_iiDSYB9U4I0aJWe?A%qvGMVP*W631go*EWx6B8mvy%ekiSz7(n ztvKUy^v(u`PkNKKbyX=_+$X!&dq|S7Of3pQidVG6L($GDCwM`(hE12C6l3TtpOLheek8PGh&gW99T^n+7g! znw6uCSs)49229Zb2eMk<5qVKiqcE`n>$#3i$h|GJk4hV^CxTtrQ`owcBDc0Nb9%By zl+;xF49PZ6BX8?K8EU#!RtHV|5OC3Om9F>yz=g?qO%ewXRnG+10)Jqqz6S@OD7)D-eHEwH0M+Z$icyE<^Y-%jXkIlI@4k z6DJCYY;n_N*#)xOZ1R7YKj#t!y-uSr6D(A`vBeI5n z)Xyz{2diU_X(lq1*M&&Bfnm z3BOvr{;bUZ)f(bw++Y2a|BU;qBkE_|A8}(qtcId*v-!Cu_K$@uLN?KB;^;;~MT56r zv-*GMk_)^q;d!llRxrC))txJ@TDci4??QYlq%0&FTjk|YY0<27424pOev!p$E5&Bm~uP)UTmr+2vdbqj= z@&Fi2?9dn4?2Ke7ppD#V)r}B<#|6FLnU*w#NBoqkF2}; zJA{_t#H(3g_z2sW!ANi4X2aR~qP5;f8vnS>Es~+V&G#&4nXi~vb;L}J$s*FXRQ1jd zqC$H2-t9D48a?V$3#47sNNx@b$qC)+k)2-zIxnicrh*fweUBx100&yycSmBtC)B#^$B!T6XJ; z-cmrQ2CwRz22|vlfEiFIBL{@BaCvMjq_Eks@w6oND?E&rxkZEk*`V<3(T7@8PI`#! z#nX$I8;|Gc%Y&y}S)V&~9d+o{v$4OP*31Tk8a{tmou0Yo1hXQni>He+TuA4HGR8=tk2ThmM)hbXWz|(qHPuB`$~&9gpX*-F z%Tq=N-6$|0mIxPv!zFZER1QsS*!e5!xeD)aGCEY00SS7R1{#w|%Q7(PZT(Q3ratIs zQ}tLK6aQuP@#*W)j*8yK6#Ul*o`by#C*FMB3ik0Q9I+^Y&l}z2biNBGS!JI{3br`5 zXQ=#=ohnIy>{OAKqRZIlVn-f+yqO)n{p;&g~^8m#ng4Pxphre(Q@f-H1(9fpnTX_JURLvj*<6*9k^gEsJC| z-MNja$Jij*R^_iv?@+{lZL{ifkba>Xr*8gCJ<`X#$@Wy`JE42{H3n=MXItId%Xt3b z`%A_q`vd;nN*Ni*zIrn}tc9r!?nh&-lndwUSr;$otEbloo$uQVS59opf1uG{m}fcZ zbt})9)~FyY=J6{iTeU`yZCslG)5lIgPly=B?GYWTPiQ zp>nk_H#gmhN4k^6h-yh`KRIjyR(Hp`_eo6++abwWdhI+48KPm>+ejcOdtv~kkc+EO zd7gO0Y32a66l{?80RGrcdeNCl2RuWxIeSK|UL3M&8CZHmXs05CRT0&UA%#69MP4bi z;ODWR3@%4Na>t($Gaq?THS9*W$%zE&?VQ$j0`Jrd`kdc&c=a_&v#mp}F|np+rdCNw zSmW_-^w;Xe9{03GN@n$X>Q;LM^^x2+H?eT=a70cd1X~N=EXp>It8cnQFP^T&Vz#Y| zs`}x;MzSDDa@75;*7e6tG;Q0i`5hE7?%mhyYjML}+$O%`t5s)*S+%!}LKZ4| zs61^q&K`tG5Yl$~I~q!-l@?Y2D6D{@!(44zokEtE4%2HfXVCF-4c;CGh>W!Et|u`f z9s~M#e~Px=syQIe6((7oBl2< z_OJs0dG-algw~xn9Fpz5{kI`k{uh`P?B}z>*<+q^LsD?i693;Z%w?Cl&#A(ui~mc(sVjFpKJP zLAtFiWQJvV;qQI(<5)W8gCnJ1X&O~IC>vzU53(XB>$JO%txa1^EmD_gD&>Ypu5gM^ z@6p-MO3D^v?vo-XC(S-KkT;|#Xra)ekUK<3ztzj37S+%fiNg{Pu&nxmC-Gm~f}(rv zf%vByi6!-y-hl#4oZA1Z>|j%8hg3?+^!4|lIZffSIEMEk~)7yY-_+cy_E zY_#4t(iu3p8>g7*j#`UlQ0};FdCDrl*CIuuGfu^=glBuvc!{TLqNW=^)wNJ>KXOV) zh|*YJfrOn0;b|nAzlaZL+XVB*)$yC-6W6WdL2bCtvZ*~*hXjS%tg+UwDp*W>1H0+! za-?~zD>!!Xdj_TId7^Dld2EK5qF8Q(YkF!VW&owYK@?acj#(Cq)Gr6{(uh-a%OL^C z-|B!b92{uz@#>tlCbDC{rjgpfRkL0U)3!qk#h^>q8((*6q%a-lkqrb5gS(7$-9lU; zGpnM?_P9brjla=x8u#EW)^m;Y2^=l~iVo+bApDvSucQ-QlbAT+m28m!}$i z$8IY1u#ZGK&yEj;u^wUF!$^cJos_r-`>~#omD+oud^@DSxQgdB%faxptucEZ98Jg4 zmYLST1wD(q*QTl^H!>txI?v*b3NGiJFvs$~?z|MQ9dam z0YBe$DhXv#w9v29y3dwHPkedK)VN-VvR=IO%->dFt4+3G?x(Oc+w8mFK6SXEJnQX2 zCuv?sf4Sb&A(81`h-+n$teszA|76ylB8>dYcOEX_9OY10RXv|X6`w4EDk4i0or(G0 z-Z#w6DIThp)k6GlAD%psk5GeHHGT|ML9P6kwjVs5Z?jXDxEsgno!v);Z^BFPs z$ymku=%8uy4Ma_KkAI`+G+$+lPCmV%;h;*ytmo8%0>+WU3Xd=PZ(Vya5wsGIYyR zOfK%FWlT6BADdrbRjEGVIgd$6_5?N`<~2RXJCCR;!|R~ozPGA2j3w=C5OJbVO;`R1 z1)@#Q_riOfDS%~}vgvitJ1>{g zB6fOwRZ-kK0$7-z%-h3f!jVyx7kx0c_d18XeVfnB37%1NVh5r&z8U z#IVXoB){8~lb1|P1-_8Elxt7sDCk(fwo1(onnJ3BM2xpzpB&v6J6=uu@^qr@vm|qk z9O)S{cR@B==|Z0Lw+5Kh%k~*QFPc-g+cRad6Lk?|R{l^E4%Z0uSEtSC5{NQF($n$+ zf(F8VwKpx;7(5KqQqKC%z*VKE6CO`TS{KrTfNS56j;#cjhI6z;*vFX~jEGT%h=mls z@&mEA21B7WAD9yNB#YfEkYZ&EMe2SqS!O8w%@-$m1--&7G&Y)S4YCv4)e*0+dLeGQ z50!cbjX!-hf_03bQv(BeY6;oOw*e$mC6c1W0Ip&??qRo>%k(kT^1?CF{$fn)WR)%M zWjT02CI8OYv#ECsj?6Rq3c6|j{IpKvO)pNm^aUT)0ZEg@0^ZvdlNbG9zJalBNgH;UixUIFofpZH=cw4;v z^1W}Z&jjOqvD`U&;TblxoDGWGl2Nma0wb2jEf&0S$B!{+z^P7Q|_ xJp*fj&vzfJxKSPN`Lm13J>AE{x>>!r!Ob4$%~s!k0{x#SH>({txM_2Pe*mlNFKGY( diff --git a/test_fixtures/masp_proofs/A28F93297BBBBD119DE0A2B2044027765771A646BC53E4AF92CA7A643EED36FC.bin b/test_fixtures/masp_proofs/A28F93297BBBBD119DE0A2B2044027765771A646BC53E4AF92CA7A643EED36FC.bin new file mode 100644 index 0000000000000000000000000000000000000000..7503f7af1f0a35e6d5a481e8d36c6b4d0f8b3a57 GIT binary patch literal 24494 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 diff --git a/test_fixtures/masp_proofs/DB978B3F08838665C1ECD7BEA4E600461287D8046692CDB4AA2CF94A1AC7F8F6.bin b/test_fixtures/masp_proofs/DB978B3F08838665C1ECD7BEA4E600461287D8046692CDB4AA2CF94A1AC7F8F6.bin deleted file mode 100644 index 8c5888b087d85261e95885b1137c73acf3f8b3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24494 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 literal 0 HcmV?d00001 From 2a12afe77b193e2d0486c3337458c10e7426ce27 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 13 Nov 2023 15:44:41 +0100 Subject: [PATCH 07/11] Changelog #2051 --- .changelog/unreleased/SDK/2051-native-masp.md | 3 +++ .changelog/unreleased/improvements/2051-native-masp.md | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 .changelog/unreleased/SDK/2051-native-masp.md create mode 100644 .changelog/unreleased/improvements/2051-native-masp.md diff --git a/.changelog/unreleased/SDK/2051-native-masp.md b/.changelog/unreleased/SDK/2051-native-masp.md new file mode 100644 index 0000000000..1187eb12fd --- /dev/null +++ b/.changelog/unreleased/SDK/2051-native-masp.md @@ -0,0 +1,3 @@ +- Masp as internal address. Updated `aux_signing_data` + to return no key and 0 threshold if owner is masp. + ([\#2051](https://github.com/anoma/namada/pull/2051)) \ No newline at end of file diff --git a/.changelog/unreleased/improvements/2051-native-masp.md b/.changelog/unreleased/improvements/2051-native-masp.md new file mode 100644 index 0000000000..46bc4db2be --- /dev/null +++ b/.changelog/unreleased/improvements/2051-native-masp.md @@ -0,0 +1,2 @@ +- Moved the masp vp to native. + ([\#2051](https://github.com/anoma/namada/pull/2051)) \ No newline at end of file From fe2d0af06492be59fbfb9896353c0a8b43254994 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 13 Nov 2023 21:59:32 +0100 Subject: [PATCH 08/11] fix to get proofs even if no height is specified --- .../bug-fixes/2166-fix-proof-height.md | 2 ++ core/src/ledger/storage/mod.rs | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 .changelog/unreleased/bug-fixes/2166-fix-proof-height.md diff --git a/.changelog/unreleased/bug-fixes/2166-fix-proof-height.md b/.changelog/unreleased/bug-fixes/2166-fix-proof-height.md new file mode 100644 index 0000000000..9c096ff531 --- /dev/null +++ b/.changelog/unreleased/bug-fixes/2166-fix-proof-height.md @@ -0,0 +1,2 @@ +- Fix to get the proof even if no height is specified + ([\#2166](https://github.com/anoma/namada/issues/2166)) \ No newline at end of file diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index d12352ee71..f82eee1cfc 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -808,6 +808,13 @@ where height: BlockHeight, store_type: Option, ) -> Result> { + // `0` means last committed height + let height = if height == BlockHeight(0) { + self.get_last_block_height() + } else { + height + }; + let epoch = self .block .pred_epochs @@ -935,6 +942,13 @@ where ) -> Result { use std::array; + // `0` means last committed height + let height = if height == BlockHeight(0) { + self.get_last_block_height() + } else { + height + }; + if height > self.get_last_block_height() { if let MembershipProof::ICS23(proof) = self .block @@ -972,6 +986,13 @@ where key: &Key, height: BlockHeight, ) -> Result { + // `0` means last committed height + let height = if height == BlockHeight(0) { + self.get_last_block_height() + } else { + height + }; + if height > self.get_last_block_height() { Err(Error::Temporary { error: format!( From 7caa524931c52812172622a0f8be6d79c398327a Mon Sep 17 00:00:00 2001 From: bengtlofgren Date: Thu, 9 Nov 2023 15:48:42 +0100 Subject: [PATCH 09/11] Add redelegation functionality --- .../unreleased/SDK/2140-sdk-redelegate.md | 3 ++ sdk/src/args.rs | 43 +++++++++++++++++++ sdk/src/lib.rs | 32 ++++++++++++-- sdk/src/tx.rs | 2 + 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 .changelog/unreleased/SDK/2140-sdk-redelegate.md diff --git a/.changelog/unreleased/SDK/2140-sdk-redelegate.md b/.changelog/unreleased/SDK/2140-sdk-redelegate.md new file mode 100644 index 0000000000..66b1b3d4b8 --- /dev/null +++ b/.changelog/unreleased/SDK/2140-sdk-redelegate.md @@ -0,0 +1,3 @@ +- A high level function new_redelegate is added to the sdk to allow developers + to make and submit redelegation functions from the minimum number of arguments + required ([\#2140](https://github.com/anoma/namada/pull/2140)) \ No newline at end of file diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 138828007d..540ee43617 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -1018,6 +1018,49 @@ impl Redelegate { } } +impl Redelegate { + /// Src validator address + pub fn src_validator(self, src_validator: C::Address) -> Self { + Self { + src_validator, + ..self + } + } + + /// Dest validator address + pub fn dest_validator(self, dest_validator: C::Address) -> Self { + Self { + dest_validator, + ..self + } + } + + /// Owner (or delegator or source) of the redelegation + pub fn owner(self, owner: C::Address) -> Self { + Self { owner, ..self } + } + + /// Path to the TX WASM code file + pub fn tx_code_path(self, tx_code_path: PathBuf) -> Self { + Self { + tx_code_path, + ..self + } + } +} + +impl TxBuilder for Redelegate { + fn tx(self, func: F) -> Self + where + F: FnOnce(Tx) -> Tx, + { + Redelegate { + tx: func(self.tx), + ..self + } + } +} + /// Reveal public key #[derive(Clone, Debug)] pub struct RevealPk { diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index c82c8a063f..b6bb157905 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -55,10 +55,11 @@ use crate::tx::{ ProcessTxResponse, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, TX_CHANGE_COMMISSION_WASM, TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_PROPOSAL, - TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, TX_RESIGN_STEWARD, - TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, - TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, - TX_WITHDRAW_WASM, VP_USER_WASM, + TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, + TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, + TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, + TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, + VP_USER_WASM, }; use crate::wallet::{Wallet, WalletIo, WalletStorage}; @@ -206,6 +207,29 @@ pub trait Namada<'a>: Sized { } } + // Make a Redelegation builder for the given minimum set of arguments + fn new_redelegation( + &self, + source: Address, + src_validator: Address, + dest_validator: Address, + amount: token::Amount, + ) -> args::Redelegate { + args::Redelegate { + tx: self.tx_builder(), + /// Source validator address + src_validator, + /// Destination validator address + dest_validator, + /// Owner of the bonds that are being redelegated + owner: source, + /// The amount of tokens to redelegate + amount, + /// Path to the TX WASM code file + tx_code_path: PathBuf::from(TX_REDELEGATE_WASM), + } + } + /// Make a TxIbcTransfer builder from the given minimum set of arguments fn new_ibc_transfer( &self, diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 2e1a786d12..05b61cdf0e 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -114,6 +114,8 @@ pub const TX_RESIGN_STEWARD: &str = "tx_resign_steward.wasm"; /// Update steward commission WASM path pub const TX_UPDATE_STEWARD_COMMISSION: &str = "tx_update_steward_commission.wasm"; +/// Redelegat WASM path +pub const TX_REDELEGATE_WASM: &str = "tx_redelegate.wasm"; /// Default timeout in seconds for requests to the `/accepted` /// and `/applied` ABCI query endpoints. From 86157b2d241c9dd38c11707527d7d70e805686f1 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 14 Nov 2023 17:05:27 +0100 Subject: [PATCH 10/11] Updates alias for masp native vp --- apps/src/lib/wallet/defaults.rs | 1 + core/src/types/address.rs | 1 + tests/src/e2e/setup.rs | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index e994203c88..71be346c70 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -73,6 +73,7 @@ mod dev { ("christel".into(), christel_address()), ("daewon".into(), daewon_address()), ("ester".into(), ester_address()), + ("masp".into(), namada::types::address::MASP), ] .into_iter() .collect(); diff --git a/core/src/types/address.rs b/core/src/types/address.rs index f865895f80..2543fc7f54 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -530,6 +530,7 @@ impl InternalAddress { "ethbridge" => Some(InternalAddress::EthBridge), "bridgepool" => Some(InternalAddress::EthBridgePool), "governance" => Some(InternalAddress::Governance), + "masp" => Some(InternalAddress::Masp), _ => None, } } diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index cda8422001..644110bba6 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -1092,7 +1092,6 @@ pub mod constants { pub const DAEWON_KEY: &str = "Daewon-key"; pub const ESTER: &str = "Ester"; pub const MATCHMAKER_KEY: &str = "matchmaker-key"; - pub const MASP: &str = "tnam1q9lm5pvkxhnw9wwwhu33vkvtylwfkn5kw53xwud8"; // Shielded spending and viewing keys and payment addresses pub const A_SPENDING_KEY: &str = "zsknam1qqqqqqqqqqqqqq9v0sls5r5de7njx8ehu49pqgmqr9ygelg87l5x8y4s9r0pjlvu69au6gn3su5ewneas486hdccyayx32hxvt64p3d0hfuprpgcgv2q9gdx3jvxrn02f0nnp3jtdd6f5vwscfuyum083cvfv4jun75ak5sdgrm2pthzj3sflxc0jx0edrakx3vdcngrfjmru8ywkguru8mxss2uuqxdlglaz6undx5h8w7g70t2es850g48xzdkqay5qs0yw06rtxc9q0cqr"; @@ -1115,6 +1114,7 @@ pub mod constants { // Native VP aliases pub const GOVERNANCE_ADDRESS: &str = "governance"; + pub const MASP: &str = "masp"; // Fungible token addresses pub const NAM: &str = "NAM"; From 95875a4091d9e6dbe68ce3776c8812027dd884b6 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 14 Nov 2023 18:17:39 +0100 Subject: [PATCH 11/11] Updates masp proofs for testing --- ...A98182D17943D69AB701C24FA90E1EFC1876F0.bin | Bin 0 -> 7448 bytes ...4C5AEBFA800AD1ABEF2487C53BF97362CC90B0.bin | Bin 7448 -> 7448 bytes ...9A7952F44DD3927485DEC3F649AEA68C3374C8.bin | Bin 0 -> 12448 bytes ...59DB09065F2CC91CBB86AD65A92E8B92B43743.bin | Bin 15257 -> 15257 bytes ...61DE6890ADDBC8CFB85C76A4E7885280D684F4.bin | Bin 0 -> 9649 bytes ...0A87507CCAA8EB7647CB2974EB9250922A0580.bin | Bin 17018 -> 17018 bytes ...0CFF18DB68FAB6D994F680AAEA7EF99DF3C872.bin | Bin 0 -> 10382 bytes ...4333592C4A00DDC30896E174422F6863F71D32.bin | Bin 7448 -> 7448 bytes ...C35062071533243874C260C81A6AEBE8480987.bin | Bin 15597 -> 15597 bytes ...5E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin | Bin 7448 -> 7448 bytes ...4027765771A646BC53E4AF92CA7A643EED36FC.bin | Bin 24494 -> 24494 bytes ...5399B77FF4B05B8C78BF1F016C6101367F0639.bin | Bin 0 -> 9941 bytes ...DA0C2C77847B19AE5C80C957F73BD81AD4C78D.bin | Bin 7448 -> 7448 bytes 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test_fixtures/masp_proofs/0044C26D5E4F29FA81F3970709A98182D17943D69AB701C24FA90E1EFC1876F0.bin create mode 100644 test_fixtures/masp_proofs/125E61BD706AB533F815E6E2869A7952F44DD3927485DEC3F649AEA68C3374C8.bin create mode 100644 test_fixtures/masp_proofs/50A4057E7DCFD57E26F23DFBF861DE6890ADDBC8CFB85C76A4E7885280D684F4.bin create mode 100644 test_fixtures/masp_proofs/5219A58EE0E0BE74F6AFE1184C0CFF18DB68FAB6D994F680AAEA7EF99DF3C872.bin create mode 100644 test_fixtures/masp_proofs/EBE3E35A8D4CBD2FC7A12736DB5399B77FF4B05B8C78BF1F016C6101367F0639.bin diff --git a/test_fixtures/masp_proofs/0044C26D5E4F29FA81F3970709A98182D17943D69AB701C24FA90E1EFC1876F0.bin b/test_fixtures/masp_proofs/0044C26D5E4F29FA81F3970709A98182D17943D69AB701C24FA90E1EFC1876F0.bin new file mode 100644 index 0000000000000000000000000000000000000000..4eecf0358bac975b9cf6a5542d55a7c314626cb6 GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/0754547040784C17718C4F689F4C5AEBFA800AD1ABEF2487C53BF97362CC90B0.bin b/test_fixtures/masp_proofs/0754547040784C17718C4F689F4C5AEBFA800AD1ABEF2487C53BF97362CC90B0.bin index e90b97585e7cb59a72faef5f8d11afc69790433e..3331bfe6081d0e4844036fdc26431c45fc599999 100644 GIT binary patch delta 1000 zcmVS_JARzV?})QP4fO&b z@sST+ZE50g_*ine-jyS1kRQ;I?wX9$yi|jlWKKj9vsV!G0w7=H>q`?B!GdeNK|Bdk z$RoU8nP%@gOrhPyBH_?rjjOY36Z8Tg6{Rbm?0`PelZdTmVnH|0J1LdK&GXUB)y+sh z2EfS3vws#P1Amdrdb!D#2X9(A-xy_TN@7mPnHCEhdPzCL3ayk^nC@q`kEUyU*HZxO z<%hnm;|!`dlvoaN zlo|n_&O|^XcYp0U9|tt^sH4g8)gLx&^45b=E#$Do(tj`bF(Yq~A6wQiYDb47Ns|MJ zFg;)A!crHCPqCI2i+fp?~q$4hkW)1VQrfCjd(;MIqGJOlf}*u{AknKy)4n_S*fd;I+vzK8!JMG z$+icq^ zN13@bpbJ&S>4IOG@ip>X@IDMBxRaZ8*{52|@`a5>Bq4@8l7eJujQLO>;Q=P$Wq%9z zMscO6SafClcaZ!7Je5*18){|IB%kw6b&{~5>wgqKoQ(J1>*JPReNAD1-eS5tZSKL& z;(Z%U1OV{uGC5*8^yp~_P;@!KO}RAeX2>;j^{y&?<(6-kr2fD%%ro65dHeuE#c(hs z6BU3|s)5q`e*b07{8lFxWuXIyCt!O%$OjA_TKRB^Am-dSLD*1fi9eaCK)x;PG0^iD} zs4^59qx7eoaXn88XyKZhHesh;8?ePf3)YB{I7#-X#MZeGswL%{+Zs!tR50mJp5GoP zk-u+I;`;fEP$~^fw%;R7LLJ z3*IMb{Ric{;dzCyBI5k#%1RR$OI&hysQan2z%$=IOKm;k3bX&%Wx%kA=n51LnQrx~%-5ER)3%$R%nyQy5-TZH38L4U4d_5L*UAm!xfsb=0wnhNrT z0Ey}{vvXs!*;W2Pqs#tJ7-XbRzoHHTYIZpX#Wg~JUKSQcWYk8cE~=HZVMIWf#3b=j z36NkKUQ=5wdcgxj9Up8qvv5-pc7ex~S9@YfG((u}LD02(j=W?fFs2aK9J@U)ABf?aNv7(!% zFD5>PON5|@BH+q*w(kgKOmMiisWu@PY(K?7(tkfz+_veF`~Po2O14H z+KR_pv=~q5u<4FQP1yJ50%fCH;T3w3S5;9%1%QL6hx_xu!pof(PX9)oxcl2Yt^_E7 z!h~`Ul?EDGfugXWm0U(Ty?ms>BS;V0UKbLiQY!h0eFltRFY*sp=|JiE`tQnhgv!cm z;(so+^I{560rzNzRnYoKnKX;@-&2(<ByYve+`m%A!ku)e401l2^D;4Vzi@Xrr*#2}r5ohH)gWYg#5<`%ySB8G(3H^_=&z zJuJEh2ZVYilq;XH>H4>y`7$=T)pt|S41cyyvM=xfIy@-j3sp|fiIx90APOfP1i1Yj zdtN$JV>a{>3C?{1lU^d`|NlFa+%bM{bQ+A2;~37N_J1z@R78jNx`?&9F>5#!xhE+} z=ykh(%~J4!QxZn1s|15)n}vEeNsjONlLnWEpKxoXoN1hPdkJJdp8lfoAp*davPCv| zua2biekWDLfJ*yNyaQ?F3DSWn%f*ugK?q<(xhUe4dJsqQbTcGVDsPu`?&l1=*^>&~ WBngyJALsQ!%DBR_QMyW#;~X`qe&yT% diff --git a/test_fixtures/masp_proofs/125E61BD706AB533F815E6E2869A7952F44DD3927485DEC3F649AEA68C3374C8.bin b/test_fixtures/masp_proofs/125E61BD706AB533F815E6E2869A7952F44DD3927485DEC3F649AEA68C3374C8.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfd5a43f15dfc091b3040dfb9e21f1d9bd7a20f0 GIT binary patch literal 12448 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 CXh$pn delta 2748 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 Cq#nTl diff --git a/test_fixtures/masp_proofs/50A4057E7DCFD57E26F23DFBF861DE6890ADDBC8CFB85C76A4E7885280D684F4.bin b/test_fixtures/masp_proofs/50A4057E7DCFD57E26F23DFBF861DE6890ADDBC8CFB85C76A4E7885280D684F4.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed9a42045d5e2c4c561aba9ef43177378b8cd5cb GIT binary patch literal 9649 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 OW02v|`@1NU6+&eek_2S{ delta 3072 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/59BBC98F00DE442A5EC9E1CE884333592C4A00DDC30896E174422F6863F71D32.bin b/test_fixtures/masp_proofs/59BBC98F00DE442A5EC9E1CE884333592C4A00DDC30896E174422F6863F71D32.bin index e71590be62cf8c87a1c0235ddc8dd46701f3592e..0dcda6bda3b20126f0eda3ac6fcc69b9e01cd816 100644 GIT binary patch delta 1002 zcmV&r4kqzrPRmQFicU-jU#Lk;u- zAo0Ai=28f+OoV1ASpX!}Z<5mDq* zeSd}))Wi_|o*jz|J$%aKIVs+PJRzv?Xl(RSw65|`BAb6Pz$=_z;x znLK-C*Thcan4%zek*~cjTMt+~?I-Td6ap&{imaR_TH&Y42IYJe+KQ6}5lTfJxU{U@ z)qd9HjEM1D4c{<&JjcILgp;koX@=Q**m$tiPY;&vs?e3otM?ju*(T!InAJfu=N{AC zP4Xa3w(EaAFd1qfTKFgsq%fe|w_eZ@x#wcau4U!G#oHHv31iwTkPAS^j%aZ4@GiV_ zE=+$8;37dZ><;G{G`$)A9k4{738~~`sQf#FD!@S9L};|n@Ti6_xwae!~(T>CX7uU&jc%(9Y~sIn6Rem1gU?v(yWL`m|=Oy-*o&*z+a~U6Npb# ztBSy+uqhGyCTdGyc`WbgvR!R$5I9k75C7_!%Ey(;ieVyp+V*y4YaPZfiv7<5<$3P= zs^Vc+5lO}4B);=aMeXef(O?@8k1o5*I>G^@797X~C9$foirJY?F=yVDDuIYQilv;1H+4l5MM-TV}o)^o3It@!) zjqRJUjBO)BZPbM3%2p|cYAUU(gtzd}MS6d_<6{3R4BrT-|4Vt9A0}=dsNR>AE8@62 z8!q;3Yl*w#W&hus56nBo*B!#Y*)@+qxmK^NrlUcW37mvOX_q6bh_0^`Ir_4kmC0St ze3qF_FArhqhjwVeV)!~*7D=}K;zN;IwMZ->;Q*C(3-S+hjAlwR!I*S;@g6KhAP+`& zYD!O#OSq*3vuJG$siR&SodMic-FY)CTl|wiO)vG@VB_<16wi1Wi@7da3j{XK%Cy_J Yqj(479KXDT6~a#t1m!7336ta;G-i+Rz5oCK delta 1002 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 MNC$lb43m*OT$k{Hm;e9( delta 2810 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 Mf diff --git a/test_fixtures/masp_proofs/7FEE0379CDF35F061B75B7B2145E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin b/test_fixtures/masp_proofs/7FEE0379CDF35F061B75B7B2145E4DB0A1861A41897246DE5EA7C6FD27651C8E.bin index bdc754475ca3992a89a896add3136a6682fc8203..6516676ff65052e1e5dca0c18f5b174dc16a2af6 100644 GIT binary patch delta 1002 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 diff --git a/test_fixtures/masp_proofs/EBE3E35A8D4CBD2FC7A12736DB5399B77FF4B05B8C78BF1F016C6101367F0639.bin b/test_fixtures/masp_proofs/EBE3E35A8D4CBD2FC7A12736DB5399B77FF4B05B8C78BF1F016C6101367F0639.bin new file mode 100644 index 0000000000000000000000000000000000000000..6192916b9f4cd2b48d30b70ab11aba19ea42159f GIT binary patch literal 9941 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 YZby$7E6VH5Fc1PE;=(q*1(W0)G=Zn-?EnA( delta 1002 zcmV>R^Vu8d{p~zq3~m^a3CY8CHUW?iEH4-Wzhy zC*!jKf>_BX&jTT#D_DNRjjg+$ z&gu;QqqBb&B?EuC!JwZl=B4Pi7SupiNzGbz7SJ#Sf4eAHCXYSzlPBkv`>webh#Z|0 zx-WdA?(&DQ7pgOZIhuR_N;iBz9TEF=lo2Meec`=|IAHk|Wc<7|w3$PjZkW6L0-FD_ zE+6>^1+s0WsgozXZj%w`O|Q^9v&&a&k)0tHvW;zOcgs5VlRCQc?8q1{piFTkvOYx z34U^mxkbtRSF3zYw_XHA4y?npq`QLiv{vR%o21^c{P-82?t^N!$2xb_hy}sw(0@|o zWkB0rzWsj-F`?ZK`eVILW;1bcCHJ!X|5nhbOBFQaf)oA?d{6*PHf#S zb%R>>6%JxvVbku{=Vz#Z2M-8yHD+9u$g36Y>~;W$o=;uC16NOk4!^&I%?ZuimY#)c zV%dL*!6Y4Hv~oux0W=wPdCYfH2~EDWkp0JH@CRg%lMXso{9nbxdWIGN0RR91